Rozdział 17 - zadanie domowe
Ostatnio zmodyfikowano 2017-05-29 17:58
Tinker Temat założony przez niniejszego użytkownika |
Rozdział 17 - zadanie domowe » 2017-05-26 18:22:10 Witam wszystkich. Parę dni temu rozpocząłem kurs c++ udostępniony tutaj. Mam problem ze sprawdzaniem poprawności strumienia wejścia. Nie wiem jak zrobić, żeby polecenie wczytania w funkcji wczytajLiczbe zostało ponownie zainicjowane. Wydaje mi się, że zastosowałem poprawnie pętle do...while, no ale z jakiegoś powodu nie działa. Proszę o pomoc :). Kod poniżej: PS Ktoś podpowie jak wkleić kod, żeby kolorowało składnię? #include <iostream>
using namespace std;
int wczytajLiczbe() { int a; do { cout << "Podaj liczbe "; cin >> a; cout << endl; cin.fail(); cin.clear(); cin.sync(); } while( cin.fail() == 1 ); return a; }
int main() { cout << "Podana liczba to " << wczytajLiczbe() << endl; return 0; }
|
|
karambaHZP |
» 2017-05-26 18:25:03 Czerwona ramka po postem. Kurs STCedit: masz niewłaściwą kolejność działań. Zerujesz flagi błędów i czyścisz strumień, następnie w wwarunku sprawdzasz czy strumień jest w stanie błędu (nigdy nie będzie). |
|
Tinker Temat założony przez niniejszego użytkownika |
» 2017-05-26 18:51:37 Wydaje mi się, że program jest już zabezpieczony. Czy są jeszcze jakieś możliwości popsucia czegoś przez użytkownika? :) Poprawiłem tak: #include <iostream>
using namespace std;
int wczytajLiczbe() { int a; do { cin.clear(); cin.sync(); cout << "Podaj liczbe "; cin.clear(); cin.sync(); cin >> a; cout << endl; cin.fail(); } while( cin.fail() == 1 ); return a; }
int main() { cout << "Podana liczba to " << wczytajLiczbe() << endl; return 0; }
|
|
karambaHZP |
» 2017-05-26 18:59:44 do { cin.clear(); cin.sync(); cout << "Podaj liczbe "; cin.clear(); cin.sync(); cin >> a; cout << endl; cin.fail(); } while( cin.fail() ); |
|
Tinker Temat założony przez niniejszego użytkownika |
» 2017-05-26 19:24:43 Myślałem, że należy wywołać cin.fail() w ciele funkcji, aby została ustawiona flaga błędu. Później sprawdzałem, czy cin.fail() przyjmowało 1 (czyli, że wystąpił błąd i należy powtórzyć kod). Sprawdziłem, czy kod działa po zastosowaniu się do Twoich sugestii i tak jest, ale nie rozumiem dlaczego. Wytłumaczysz? :) |
|
karambaHZP |
» 2017-05-26 20:58:05 |
|
Tinker Temat założony przez niniejszego użytkownika |
» 2017-05-26 21:41:04 a coś od siebie? szczerze, to po przejrzeniu dokumentacji niewiele wywnioskowałem :/ |
|
karambaHZP |
» 2017-05-27 14:00:08 Metoda std::cin.fail() zwraca tylko wartość, więc gołe wywołanie nie robi nic pożytecznego, analogicznie do twoje funkcji wczytajLiczbe(). analogiczny przykład: #include <iostream>
bool is_equal_zero( int number ) { return number == 0; }
int main() { std::cout << std::boolalpha << "czy liczba -1 jest rowna zero: " << is_equal_zero( - 1 ) << '\n'; std::cout << "czy liczba 0 jest rowna zero: " << is_equal_zero( 0 ) << '\n'; is_equal_zero( 2 ); } wyjście standardowe: czy liczba -1 jest rowna zero: false czy liczba 0 jest rowna zero: true |
|
« 1 » 2 |