Lekcja 15, Pętla z dwoma warunkami zakończenia
Ostatnio zmodyfikowano 2015-03-28 22:48
lizardr Temat założony przez niniejszego użytkownika |
Lekcja 15, Pętla z dwoma warunkami zakończenia » 2015-03-28 22:19:47 #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. |
|
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. |
while(( a != x ) &&( b != 1 ) );
|
Masz problem pomiędzy myśleniem, a pisaniem tego. |
|
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ź. |
|
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. |
|
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. |
|
« 1 » |