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

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

Ostatnio zmodyfikowano 2018-10-03 18:45
Autor Wiadomość
bulidomex321
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
Rashmistrz
» 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
bulidomex321
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
YooSy
» 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
bulidomex321
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
YooSy
» 2018-10-03 18:14:32
... a wpisz np. nie22.
P-172532
rupson
» 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
bulidomex321
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