NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C++ while

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Klindera:26.2.2016 17:26

Ahoj, potřeboval bych poradit ohledně while a bool.
Má se jednan o algoritmus, který se zeptá, jesli se silnice prázdná. Jestliže napíšu "ano" , tak to má napsat: "Přejdi na druhou stranu" a program se vypne. Problém je v tom, že se program nevypne, ale smyčka běží znovu. Můžete mi prosím poradit, jak to napsat, aby se to po napsání ano vypnulo? Děkuji

#include <iostream>
#include <string>

using namespace std;

int main() {
        string odpoved;
        bool opakovat;

        while (opakovat = true) {
                cout << "Rozhledni se" << endl;
                cout << "Je silnice prazdna?" << endl;
                cin >> odpoved;


                if (odpoved == "ano") {
                        cout << "Prejdi na druho stranu" << endl;
                        opakovat = false;
                }
        else {
                bool opakovat = true;
        }

        }
        cin.get(); cin.get();
}
 
Odpovědět
26.2.2016 17:26
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Jakub Klindera
tomisoka:26.2.2016 17:40

Všiml jsem si několika chyb:


while (opakovat = true) {

Chceš porovnávat (==), ale přiřazuješ (=)


if (odpoved == "ano") {

Třída string nemá žádné přetížení, aby se mohla porovnat pomocí '=='. Použij 'string.compa­re(string)'. Pozor vrací '0' pro shodnost.


bool opakovat = true;

Vytváříš novou proměnnou, která už existuje, přičemž jí jen chceš přiřadit 'true'. Nemělo by se to ani zkompilovat.


bool opakovat;

Zde je určitá pravděpodobnost, že by se do 'opakovat' přiřadila '0' a ten while cyklus by ani neproběhl.

 
Nahoru Odpovědět
26.2.2016 17:40
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:26.2.2016 17:41

Ahoj,

v podmínce cyklu ti chybí jedno rovnítko. Takhle místo toho, aby ses zeptal na hodnotu v proměnné opakovat, ji tam přiřadíš. Správně to bude

while (opakovat == true) {

nebo třeba

while (opakovat) {

Překladač ti možná ohledně té podmínky napsal varování. Je velmi užitečné si na varování dávat pozor, číst je a eliminovat podobně jako chybové hlášky (nastavit si, že se mají varování považovat za chyby, nemusí být špatné).

Nahoru Odpovědět
26.2.2016 17:41
2 + 2 = 5 for extremely large values of 2
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na tomisoka
Martin Dráb:26.2.2016 17:45

Tady pro řetězce vidím operátor == definovaný.
http://www.cplusplus.com/…g/operators/

Nahoru Odpovědět
26.2.2016 17:45
2 + 2 = 5 for extremely large values of 2
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Martin Dráb
tomisoka:26.2.2016 17:50

Moje chyba, string moc nepoužívám a když jsem koukal na cplusplus.com tak jsem si nevšiml 'relational operators'.

 
Nahoru Odpovědět
26.2.2016 17:50
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na tomisoka
Martin Dráb:26.2.2016 17:57

Na druhou stranu je rozumné na toto upozornit, protože ne ve všech jazycích lze řetězce porovnávat tímto způsobem (Java, C).

Nahoru Odpovědět
26.2.2016 17:57
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Jakub Klindera:26.2.2016 18:00

Děkuju za radu, ale když tam zadám

while (opakovat) {

, tak mi to hodí error.

Děkuji

 
Nahoru Odpovědět
26.2.2016 18:00
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Jakub Klindera
tomisoka:26.2.2016 18:02

A co je to za error? ...

 
Nahoru Odpovědět
26.2.2016 18:02
Avatar
Odpovídá na tomisoka
Jakub Klindera:26.2.2016 18:04

https://ctrlv.cz/8b9o

Absolutně nevím, jak na to. V cyklech jsem lama.

 
Nahoru Odpovědět
26.2.2016 18:04
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:26.2.2016 18:04

Hádám, že něco o tom, že se snažíš číst hodnotu neinicializhované proměnné? Pokud ano, stačí

bool opakovat = true;
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.2.2016 18:04
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na tomisoka
Neaktivní uživatel:8.3.2016 21:03

bool opakovat = true; v else se zkompiluje bez problémů. Výsledný program ale nedává smysl.

Nahoru Odpovědět
8.3.2016 21:03
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.