Rozdział 17, problem z użyciem "cin.fail()"
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Rozdział 17, problem z użyciem "cin.fail()"

AutorWiadomość
Temat założony przez niniejszego użytkownika
Rozdział 17, problem z użyciem "cin.fail()"
» 2018-10-03 11:19:09
Witam, zabrałem się za zadanie domowe z rodziału 17, tzn:
"Napisz funkcję, która będzie wczytywała liczby ze standardowego wejścia i zwracała wczytaną wartość. Funkcja ma zagwarantować, że zwracana liczba zawsze jest poprawna. Oznacza to, że funkcja będzie musiała pytać użytkownika o wprowadzenie liczby dopóki nie poda poprawnej. "
C/C++
#include <iostream>
using namespace std;
int wczytajLiczbe()
{
    int liczba;
    do
    {
        cin.clear();
        std::cin >> liczba;
        if( cin.fail() )
             std
            : cout << "Podano zly typ danych";
       
    } while( cin.fail() );
   
    return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
Gdy wprowadzimy liczbę funkcja działa dobrze, jednak gdy wprowadzamy literę to na ekranie cały czas wyświetla się komunikat "Podaj liczbe", pojawia się on w nieskończoność. Nie wiem co robię źle oczekiwałem że jak poda się literę, wtedy zadziała if, a następnie program ponownie poprosi o wprowadzenie liczby.
P-172526
» 2018-10-03 12:29:57
Litera zostaje w buforze i jest w nieskończoność mielona,
trzeba wyczyścić zawartość bufora, a bądź przynajmniej tą literę.

» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
"Czyszczenie zawartości strumienia wejściowego"
P-172527
Temat założony przez niniejszego użytkownika
» 2018-10-03 15:17:05
Aktualnie kod wygląda tak:
 
C/C++
#include <iostream>
using namespace std;
int wczytajLiczbe()
{
    int liczba;
    do
    {
        cin.clear();
        std::cin.ignore();
        std::cin >> liczba;
        if( cin.fail() )
        {
            std: cout << "Podano zly typ danych";
           
        }
       
    } while( cin.fail() );
   
    return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
Teraz tak to wygląda że po podaniu cin'a ,trzeba go jeszcze raz podać, tak jakby 1 cin niedzałał. Czyli wpisujemy dane 2 razy:
Podaj cyfre: (tu musimy cos wpisać)
(znowu musimy coś wpisać)
Potem program reaguje na ten drugi wpis czyli jeśli za drugim razem wpisalismy cyfre, to jest ok, jak litere to wyskakuje komunikat "Podano zly typ danych"

P-172528
» 2018-10-03 15:48:49
Teraz tak to wygląda że po podaniu cin'a ,trzeba go jeszcze raz podać, tak jakby 1 cin niedzałał.
Nic bardziej mylnego. Działa. Gdy bufor strumienia jest pusty oczekuje na podanie czegokolwiek, aby
std::cin.ignore()
 miał co zignorować.
P-172529
Temat założony przez niniejszego użytkownika
» 2018-10-03 16:22:25
C/C++
#include <iostream>
using namespace std;
int wczytajLiczbe()
{
    int liczba = 0;
    do
    {
       
       
        std::cin >> liczba;
        if( cin.fail() )
        {
            cin.clear();
            cin.ignore();
            cout << "Podano zly typ danych" << endl << "Sproboj ponownie: ";
           
        }
       
    } while( liczba == 0 );
   
    return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}

Rozwiązałem problem w następujący sposób. Czy to prawidłowe rozwiązanie? Czy tem może w inny sposób powinienem był sobie proadzić? Dzięki za pomoc
P-172530
» 2018-10-03 18:14:32
... a wpisz np. nie22.
P-172532
» 2018-10-03 18:42:13
Wszystko okej, do pewnego momentu, gdy np. wpiszesz to co kolega YooSy napisał.
Doczytaj sobie w roz. 9 pod nagłówkiem "Czyszczenie zawartości strumienia wejściowego" informacje na temat czyszczenia flag i usuwaniu niechcianych znaków - tam masz dokładny przepis jak to rozwiązać, co po kolei wpisać :)
Pamiętaj, że przy wywoływaniu metod ważna jest ich kolejność.
P-172533
Temat założony przez niniejszego użytkownika
» 2018-10-03 18:45:24
Dobra wszystko jasne, dzięki za pomoc :) Pozdrawiam
Gdyby komuś było potrzebne poprawne rozwiązanie zadania to wygląda ono tak:
C/C++
#include <iostream>
using namespace std;
int wczytajLiczbe()
{
    int liczba = 0;
    bool czyPoprawna = false;
    do
    {
        cin >> liczba;
        czyPoprawna = cin.fail();
        if( czyPoprawna == true )
        {
            cout << "Podano zly typ danych" << endl << "Sproboj ponownie: ";
            cin.clear();
            cin.ignore( 1000, '\n' );
        }
    } while( czyPoprawna == true );
   
    return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
P-172534
« 1 »
 Strona 1 z 1