Jak zakończyć pętle dopiero po pierwszym przebiegu?

0

Chciałbym prosić o wyjaśnienie działania typu bool. Przypuszczam, że moje pytanie jest trochę naiwne, a logika "pokrętna". Mam taki oto kod:

#include <iostream>
using namespace std;

int main()
{
    bool gotowe {false};                   //gotowe {true}
    int liczba {0};
    
    while (!gotowe)
    {
        cout << "Podaj liczbę z przedziału 1-5: ";
        cin >> liczba;
        if (liczba <= 1 || liczba >= 5)
            cout << "Poza zasięgiem. Spróbuj ponownie" << endl;
        else
        {
            cout << "Dziękuję!" << endl;
            gotowe = true;              // gotowe = false
        }
    }
    return 0;
}

Wszystko działa. Moje pytanie dotyczy tego, dlaczego po zmianie instrukcji "gotowe {false}" na "gotowe {true}" - w linijce 6 oraz "gotowe = true" na "gotowe = false" - w linijce 18 program nie zostanie wykonany. Według mnie logiczne byłoby, aby równoległa zmiana obu tych instrukcji dała ten sam wynik (zachowana byłaby logika). Czy to w jakiś sposób wynika ze specyfiki działania typu bool?

Z góry dziękuję za pomoc

6

Nie…

Prawdę mówiąc, nie bardzo rozumiem problem — jak masz gotowe {true}, to ustawiasz gotowe na prawdę. A skoro tak, to !gotowe to negacja prawdy, czyli fałsz, czyli pętla while z linijki dziewiątej się w ogóle nie wykona (bo ma fałszywy warunek).

Jakiego innego zachowania oczekiwałeś i dlaczego, to może będzie łatwiej Ci pomóc zrozumieć, co poszło nie tak?

0

Dzięki za odpowiedź.
Chodzi właśnie o to, że program się nie wykonuje - w tym przypadku, tak jak napisałeś, pętla. Chyba załapałem - jeżeli jest fałsz to pętla się nigdy nie wykona?

9

"while" działa tylko jak w jego wyrażeniu jest prawda. Jak chcesz, aby pierwsze wywołanie było bezwarunkowe to użyj "do{...}while()".

3
Jacky12 napisał(a):

Chyba załapałem - jeżeli jest fałsz to pętla się nigdy nie wykona?

Taka jest właśnie idea pętli while — wykonuje się tak długo, jak jej warunek jest prawdziwy. Jak nie jest prawdziwy na początku, to się nigdy nie wykona.

0

Rozumiem, wielkie dzięki - trochę to śmieszne, ale nie skojarzyłem, że fałszywy warunek spowoduje wyjście (niewykonanie) pętli :). Myślałem, że pętla normalnie się wykona, a dopiero zmiana na true w linijce 18 spowoduje jej przerwanie. To nie o zmianę wewnątrz chodzi, a o warunek na początku.

Jeszcze raz dziękuję za pomoc i pozdrawiam!

5

Polecam nauczyć se używać Debugera nawet zanim opanujesz podstawy C/C++.
To jest nie tylko narzędzie do szukania błędów w kodzie, ale też doskonałe narzędzie do wizualizacji jak coś działa.
Jakbym miał kogoś uczyć programowania to bym zaczął właśnie od pokazania Debugera i to bez względu na język programowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1