Diskuze: C++ while

C a C++ C a C++ C++ while

Avatar
Jakub Klindera:

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
Redaktor
Avatar
Odpovídá na Jakub Klindera
tomisoka:

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  +1 26.2.2016 17:40
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:

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
Redaktor
Avatar
Odpovídá na tomisoka
Martin Dráb:

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
Redaktor
Avatar
Odpovídá na Martin Dráb
tomisoka:

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
Redaktor
Avatar
Odpovídá na tomisoka
Martin Dráb:

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:

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
Redaktor
Avatar
Odpovídá na Jakub Klindera
tomisoka:

A co je to za error? ...

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

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
Redaktor
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 26.2.2016 18:04
2 + 2 = 5 for extremely large values of 2
Avatar
Posix
Člen
Avatar
Odpovídá na tomisoka
Posix:

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
Proč to dělat jednoduše, když to jde složitě.
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.