Lekcja 15.1 [C++] Pętla przy błędnym wpisaniu wartości int
Ostatnio zmodyfikowano 2017-10-12 18:17
SumekQQ Temat założony przez niniejszego użytkownika |
Lekcja 15.1 [C++] Pętla przy błędnym wpisaniu wartości int » 2016-09-19 23:20:57 Witam. 1. Mój program po 2 krotnym wpisaniu dla inta niewłaściwej wartości np 'n' wypisuje na ekran wartość 0, a chciałbym żeby pętla powtarzała instrukcje aż do otrzymania odpowiedniej wartości dla inta tj. cyfry. #include <iostream> #include <Windows.h> using namespace std; int main() { int ab = 0; bool a = 0; do { cout << "Podaj liczbe" << endl; cin >> ab; bool a = cin.good(); cin.clear(); cin.sync(); if( a == 0 ) { cout << "Nieprawidlowe dane. Sprobuj jeszcze raz." << endl; cin >> ab; } } while( a != 0 ); cout << "pdoales liczbe: " << ab; return( 0 ); }
2. Czy jest inna możliwość napisania takiego kodu bez używania zmiennej typu bool? 3. Używając Visual Studio program od razu wypisuje wartosć 0 dla litery 'n'. Czy jako początkujący powinienem raczej używać CodeBlocka? |
|
pekfos |
» 2016-09-19 23:23:38 1. To usuń te cin z ifa w pętli, odwróć warunek w while i wywal słowo bool z pętli. 2. Tak. 3. Co? |
|
carlosmay |
» 2016-09-20 18:36:08 Używając Visual Studio program od razu wypisuje wartosć 0 dla litery 'n'. |
Środowisko i kompilator nie mają tutaj nic do rzeczy. Deklarujesz na start zmienną 'ab' wartością zero int ab = 0; i to jest powód wypisania wartości zero dla wprowadzanych błędnych danych. Wpisując literkę zamiast oczekiwanej liczby, strumień ustawia się w stan błędu i nie modyfikuje wartości zmiennej 'ab'. |
|
SumekQQ Temat założony przez niniejszego użytkownika |
» 2016-09-20 23:24:01 Ale jak nie zadeklaruje że ab=0, to pokaże mi że ab wynosi 1e456123... 2. Zamiast bool użyłem takiej pętli while while( !( cin >> b ) ) i działa poprawnie. 3. Już wiem co powodowało blednę działanie musiałem zmienić cin.sync() ponieważ VS go nie obsługuje na cin.ignore() Dzieki za pomoc :) |
|
pestek88 |
» 2017-10-10 15:35:03 Cześć. Mam pytanie odnośnie zabezpieczenia, które widziałem już w innym temacie o kalkulatorze, a które się tu powtarza. Czy ktoś mógłby mi wyjaśnić działanie tej funkcji: while( !( cin >> liczba ) ) { cout << "Blad, podaj poprawna liczbe: "; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); }
Do teraz sądziłem, że żeby dowiedzieć się, czy liczba/znak został wczytany poprawnie, trzeba użyć funkcji cin.good() lub cin.fail(). Czy "cin >> liczba" samo w sobie zapisuje informację, czy wczytano lub nie poprawnie dane? Bo tak wynika z tego przykładu, i to działa. Chyba, że ja czegoś nie rozumiem, wtedy proszę o wyrozumiałość i wytłumaczenie, jak to działa. Z góry dzięki. |
|
YooSy |
» 2017-10-11 10:38:20 @pestek88 najlepiej zakładać nowy wątek (szybciej uzyskasz odpowiedź), bo twoje pytanie jest trochę poza tematem. Wracając do pytania: Czy ktoś mógłby mi wyjaśnić działanie |
Operator >> zwraca referencję do obiektu std::cin , a użycie tego obiektu powoduje użycie operator bool() , który zwraca wartość określająca, czy strumień nie jest w stanie błędu ( !std::cin.fail() ). if( !( std::cin >> variable ) ) { }
std::cin >> variable; if( !!std::cin.fail() ) { }
Chyba nic nie pokręciłem. |
|
pestek88 |
» 2017-10-12 18:17:38 Czyli "cin >> liczba" zapisuje w sobie informację co do poprawności wpisania danych. Dzięki, teraz rozumiem.
Na przyszłość będę zakładał nowy temat, miałem wrażenie, że to jest drobnostka, która jest jednak trochę powiązana. |
|
« 1 » |