Pętla do while
Ostatnio zmodyfikowano 2015-05-04 22:58
Bubu Temat założony przez niniejszego użytkownika |
Pętla do while » 2015-04-13 14:40:39 Cześć, męczę się z tym kodem od 30 minut i za nic nie mogę wykombinować rozwiązania, chodzi o to, że mam podać liczbę, jeżeli jest okej to program ją wypisze, jeżeli nie to znowu poprosi o wpisanie liczby, zrobiłem coś takiego: int liczba;
int main() { do { cout << "Podaj liczbe: " << endl; cin >> liczba; if( liczba ) { cout << "Liczba to: " << liczba << endl; } else { cout << "Niepoprawny znak"; } } while( liczba != cin.good() ); return 0; } Program działa okej, ale jeżeli wpiszę literę to pętla zaczyna wykonywać się nieskończenie wiele razy, podając "Nieprawidlowy znak! Podaj liczbe:!" Na moją logikę nie wiem co tu jest źle. do - powtarzaj ten kod, while - dopóki liczba nie będzie jedynką logiczną. |
|
wojownik266 |
» 2015-04-13 14:44:09 |
|
Bubu Temat założony przez niniejszego użytkownika |
» 2015-04-13 14:53:52 Poczytałem o tej funkcji, trochę logiki i działa idealnie, dzięki - zarzucam gotowiec do nauki: char liczba;
int main() { do { cout << "Liczba: " << endl; cin >> liczba; if( isdigit( liczba ) ) { cout << "Liczba to: " << liczba << endl; } else { cout << "To nie jest liczba!" << endl; } } while( !isdigit( liczba ) ); return 0; } |
|
spike1975 |
» 2015-04-17 19:10:32 ja instrukcji do... while nie znam jeszcze ale wiem dlaczego ci się w nieskończoność pokazuje błąd i nie daje sie zatrzymac. tak jak i u kolegi który mial problem z wczytaniem liczb nie wyczyściles bufora strumienia wejściowego przed wprowadzaniem z niego danych. ponieważ nie zrobiles tego to jeżeli wprowadzisz do bufora wartość która nie jest liczba ona sama nie zniknie tylko ciągle siedzi w buforze i pętla wykonuje się w nieskończoność bo ciągle wpada w nią błędny znak który nie jest liczbą. ten znak nie znika bo nie da się go przypisać zmiennej liczbowej i tak w koło macieju (znaczy w nieskończoność). wystarczy tylko przed instrukcją cin >> wpisać instrukcje czyszczenia bufora:
cin.clear () cin.sync ()
i już nie będzie petla dzialac w nieskonczoność. choć nie zmienia to faktu że i tak nie działa komunikat "Niepoprawny znak".
Nie działa bo w instukcji if wpisałeś w nawiasie zmienną liczba. to oznacza że dla każdej wartości zmiennej innej niż 0 będzie ci pokazywało wartość zmiennej a komunikat "niepoprawny znak" dostaniesz jak wpiszesz 0 (które paradoksalnie jednak jest liczbą :)
moim zdaniem pownno być:
if (cin.good())...
wtedy będzie dla każdej poprawnie wczytanej liczby wypisywalo jej wartość a dla tego co się nie wczyta będzie dawalo komunikat "niepoprawny znak". no ale ja się też dopiero uczę. |
|
Szymon2727 |
» 2015-04-28 18:45:09 Wojownik, a bez tego też można napisać taką pętlę ? |
|
pekfos |
» 2015-04-28 20:34:38 Wojownik, a bez tego też można napisać taką pętlę ? |
Można. isdigit() to nie jest (dobre) rozwiązanie tego problemu. |
|
Szymon2727 |
» 2015-04-29 16:40:33 Bardzo fajnie, że można, ale pod tym kryj się takie ukryte pytanie, które się schowało (wiesz, jak białe znaki w std::cin). Jak ? |
|
pekfos |
» 2015-04-29 16:49:49 while( !( std::cin >> liczba ) ) { std::cin.clear(); std::cin.sync(); std::cout << "Niepoprawne dane.\n"; } std::cout << liczba; |
|
« 1 » 2 3 |