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

Lekcja 15.1 [C++] Pętla przy błędnym wpisaniu wartości int

Ostatnio zmodyfikowano 2017-10-12 18:17
Autor Wiadomość
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.
C/C++
#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?
P-151858
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?
P-151859
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'.
P-151875
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 :)
P-151879
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:

C/C++
while( !( cin >> liczba ) )
{
    cout << "Blad, podaj poprawna liczbe: "; //poki strumien jest w stanie bledu...
    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.
P-165608
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()
).

C/C++
if( !( std::cin >> variable ) ) { }
// odpowiada
std::cin >> variable;
if( !!std::cin.fail() ) { }

Chyba nic nie pokręciłem.
P-165642
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.
P-165678
« 1 »
  Strona 1 z 1