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

Praca domowa 15 zad. 1

Ostatnio zmodyfikowano 2016-07-14 16:16
Autor Wiadomość
mich2803
Temat założony przez niniejszego użytkownika
Praca domowa 15 zad. 1
» 2016-07-13 15:11:13
Podczas proby wczytania litery do zmiennej liczba, wyskakuje komunikat o bledzie a zaraz poniżej komunikat, o wczytaniu do zmiennej liczby 0, bez możliwości ponownego wprowadzenia wartości zmiennej przez użytkownika. Proszę o pomoc.
C/C++
#include <iostream>

using namespace std;

int main()
{
    int liczba;
   
    cout << "Program prosi uzytkownika o podanie liczby calkowitej." << endl;
    cout << "Jesli uzytkownik wprowadzi niepoprawne dane, program poprosi jeszcze raz o liczbe" << endl;
    do {
        cout << "Podaj liczbe: ";
        cin >> liczba;
        if( cin.fail() == true ) {
           
            cout << "Nieprawidlowe dane. Sprobuj jeszcze raz." << endl;
            cin.clear();
            cin.sync();
        }
    } while( cin.fail() == true );
   
    cout << "Podales liczbe: " << liczba << endl;
    cout << "Koniec programu";
   
    return 0;
}

P-149898
marcolo2307
» 2016-07-13 15:17:47
Najpierw sprawdź błąd, a dopiero potem czyść strumień.
if( cin.fail() == true )
 Nie musisz pisać wszędzie
== true
 albo
== false
. Prawda jest w domyśle, np.
C/C++
bool b = true;
if( b ) { } //if b==true
if( !b ) { } //if b==false[cpp]
P-149899
mich2803
Temat założony przez niniejszego użytkownika
» 2016-07-13 15:25:42
Edytowałem kod, jeszcze przed twoją odpowiedzią. Przedtem było:
C/C++
cin >> liczba;
cin.clear();
cin.sync();
if( cin.fail() == true ) {
   
    cout << "Nieprawidlowe dane. Sprobuj jeszcze raz." << endl;
   
}
 Wtedy program dzialal również niepoprawnie, ponieważ nie wyswietlał komunikatu o nieprawidlowym wczytaniu danych a jedynie informowal o tym ze wczytano do zmiennej liczbe 0.
P-149901
marcolo2307
» 2016-07-13 15:37:30
Czyścisz strumień przed while, więc pętla się kończy.
P-149902
mich2803
Temat założony przez niniejszego użytkownika
» 2016-07-13 15:40:42
Jeśli strumień zostanie wyczyszczony po pętli, wtedy while zapętla się na komunikacie o nieprawidlwo wprowadzonych danych.
C/C++
#include <iostream>

using namespace std;

int main()
{
    int liczba;
   
    cout << "Program prosi uzytkownika o podanie liczby calkowitej." << endl;
    cout << "Jesli uzytkownik wprowadzi niepoprawne dane, program poprosi jeszcze raz o liczbe" << endl;
    do {
        cout << "Podaj liczbe: ";
        cin >> liczba;
        if( cin.fail() == true ) {
           
            cout << "Nieprawidlowe dane. Sprobuj jeszcze raz." << endl;
           
        }
        cin.clear();
        cin.sync();
    } while( cin.fail() == true );
   
    cout << "Podales liczbe: " << liczba << endl;
    cout << "Koniec programu";
   
    return 0;
}
W tym wypadku program wyświetla komunikat o błędzie lecz nie ma możliwości ponownego wprowadzenia danych i program wyświetla komunikat o wprowadzeniu przez użytkownika liczby 0, co nie jest prawdą. Czyli jest tak samo jak opisałem w pierwszym poście.
P-149903
marcolo2307
» 2016-07-13 16:45:22
No to czyść strumień przed wprowadzeniem danych...
P-149905
mich2803
Temat założony przez niniejszego użytkownika
» 2016-07-13 17:10:09
Wiem, że podanie gotowego kodu to nie jest najlepsza metoda nauki, ale w tym wypadku niezależnie gdzie umieszczę metody cin.clear() cin.sync() nie mam możliwości ponownego wprowadzenia danych, wiec może ktoś zdecyduje się podać poprawny kod do tego zadania. Korzystam z Codeblocks'a 16.1 windows 10.
P-149906
marcolo2307
» 2016-07-13 17:40:28
Wystarczy to wpisać tuż przed cin.
P-149907
« 1 » 2
  Strona 1 z 2 Następna strona