Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 15, Pętla z dwoma warunkami zakończenia

Ostatnio zmodyfikowano 2015-03-28 22:48
Autor Wiadomość
lizardr
Temat założony przez niniejszego użytkownika
Lekcja 15, Pętla z dwoma warunkami zakończenia
» 2015-03-28 22:19:47
C/C++
#include <iostream>

int main()
{
    int a;
    float x;
    bool b;
   
    do
    {
        std::cout << "Podaj liczbe calkowita: ";
        std::cin.clear();
        std::cin.sync();
        std::cin >> x;
        a = x;
        b = std::cin.good();
    } while(( a != x ) &&( b != 1 ) );
   
    std::cout << std::endl << "Podana liczba to: " << a;
    return 0;
}

Cel jest taki żeby pętla powtarzała się jeżeli zostanie wpisany znak lub liczba z przecinkiem. Z jakiegoś nieznanego mi powodu przy dwóch warunkach pętla wykonuje się tylko raz nawet jeżeli żaden warunek nie zostanie spełniony, program kompiluje się poprawnie. Szukałem rozwiązania w internecie ale nigdzie nie natknąłem się na podobny problem, próbowałem innego formatowania warunków - bez nawiasów, spacji itp. ale efekt jest ten sam. Używam code::blocks. Proszę o pomoc.
P-129395
pekfos
» 2015-03-28 22:22:59
Cel jest taki żeby pętla powtarzała się jeżeli zostanie wpisany znak lub liczba z przecinkiem.
C/C++
while(( a != x ) &&( b != 1 ) );

Masz problem pomiędzy myśleniem, a pisaniem tego.
P-129396
lizardr
Temat założony przez niniejszego użytkownika
» 2015-03-28 22:29:28
@pekfos

Faktycznie zmieniłem && na || i wszystko działa jak powinno choć nie rozumiem dlaczego. Wydawało mi się że żeby osiągnąć zamierzony cel oba warunki muszą być spełnione czyli liczba a musi być taka sama jak liczba x oraz wczytanie ma przebiegnąć pomyślnie. W każdym razie dziękuje za szybką odpowiedź.
P-129397
pekfos
» 2015-03-28 22:38:29
Wydawało mi się że żeby osiągnąć zamierzony cel oba warunki muszą być spełnione czyli liczba a musi być taka sama jak liczba x oraz wczytanie ma przebiegnąć pomyślnie.
No i tak jest. Z tym, że osiągnięcie celu to wyjście z pętli, więc warunek musi być zanegowany. Czyli liczby równe i poprawne wczytanie, razem zanegowane dają, z prawa de Morgana dla logiki, liczby różne lub niepoprawne wczytanie. Niekoniecznie trzeba wiedzieć, że jest takie przekształcenie, wystarczy na chłopski rozum pomyśleć, kiedy pętla ma się powtarzać - jeśli jedno nawaliło lub drugie, bo po pętli jedno i drugie ma być dobre.
P-129400
lizardr
Temat założony przez niniejszego użytkownika
» 2015-03-28 22:48:06
No dobra, przeanalizowałem to jeszcze raz i faktycznie && nie jest tu na miejscu. Jeśli dobrze rozumiem to za każdym razem gdy wpisywałem znak lub liczbę z przecinkiem jeden warunek powtarzania pętli się zmieniał a && zakłada że spełnione mają być oba. Mój błąd polegał na tym że podchodziłem do tego z założeniem kiedy pętla ma się zatrzymać a nie kiedy pętla ma się powtarzać. Jeszcze raz dziękuje za pomoc.
P-129401
« 1 »
  Strona 1 z 1