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

Rozdział 17 - zadanie domowe

Ostatnio zmodyfikowano 2017-05-29 17:58
Autor Wiadomość
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ę?

C/C++
#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;
}
P-161614
karambaHZP
» 2017-05-26 18:25:03
Czerwona ramka po postem.
» KursyKurs STC kurs

edit: 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).
Frazy, które należy wpisać w wyszukiwarkę google:
P-161615
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:

C/C++
#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;
}
P-161619
karambaHZP
» 2017-05-26 18:59:44
C/C++
do
{
    cin.clear(); // niepotrzebne
    cin.sync(); // niepotrzebne
    cout << "Podaj liczbe ";
    cin.clear();
    cin.sync();
    cin >> a;
    cout << endl;
    cin.fail(); // to nic nie robi
   
   
   
} while( cin.fail() );
P-161621
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? :)
P-161622
karambaHZP
» 2017-05-26 20:58:05
P-161628
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 :/
P-161632
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().
C/C++
{
    wczytajLiczbe(); // funkcja zadziała, pobierze od użytkownika wartość i zwrócona wartość będzie niewykorzystana
    // z punktu widzenia programu, nic nie robi takie wywołanie
}

analogiczny przykład:
C/C++
#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 ); // to wywołanie nic nie robi, nie ma z niego pożytku
}

wyjście standardowe:
czy liczba -1 jest rowna zero: false
czy liczba 0 jest rowna zero: true
P-161661
« 1 » 2
  Strona 1 z 2 Następna strona