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

poprawność wprowadzanych danych w pętli while

Ostatnio zmodyfikowano 2015-10-30 14:21
Autor Wiadomość
Baca3322
Temat założony przez niniejszego użytkownika
poprawność wprowadzanych danych w pętli while
» 2015-10-29 21:27:49
Cześć!
Zrobiłem program, a właściwie jego część w postaci funkcji, która sprawdza wprowadzane dane, w tym przypadku jest to szerokosc i ma byc z zakresu <5,20>

Wygląda to następująco:

cout << endl << "Wprowadź szerokość figury z przedziału <5,20>: "; //wczytywanie szerokośći figury
cin >> szerokosc;
if (szerokosc >= 5 && szerokosc <= 20)
{
cout << endl << "Wprowadzono poprawną szerokość";
}
else
{
while (szerokosc<5 || szerokosc > 20)
{
cout << endl << "Wprowadzona szerokość jest poza przedziałem <5,20>";
cout << endl << "Wprowadź szerokość jeszcze raz: ";
cin >> szerokosc;
}
cout << endl << "Wprowadzono poprawną szerokość";
}

Z liczbami działa OK. Problem w tym, że chciałbym, aby program również odrzucał inne znaki typu ASCII takie jak litery itp, a kiedy ja podaję mu litere, on się buguje i pętla while powtarza się w nieskończonośc.
Moje pytanie: jak to zrobić?

**Szerokosc u mnie jest typu int.
P-139356
Monika90
» 2015-10-29 21:50:10
Należy sprawdzać stan strumienia po każdym wprowadzeniu danych.

C/C++
cin >> szerokosc;
if( cin )
{
    //ok - do zmiennej szerokosc wczytano liczbę
    if( szerokosc >= 5 && szerokosc <= 20 )
    {
        cout << endl << "Wprowadzono poprawną szerokość";
    }
}
else
{
    cout << "to nie była liczba" << endl;
    //teraz należy przywrócić strumień do poprawnego stanu.
    cin.clear();
    cin.ignore( 9999 );
}
P-139358
Baca3322
Temat założony przez niniejszego użytkownika
» 2015-10-29 22:10:50
Dziękuję za odpowiedź. Nie do końca jednak wiem co z tym zrobić.
Mam stworzyc dodatkową petle if(cin), która będzie obejmować moją standarwową if i dodatkową pętlę else:

else
{
    cout << "to nie była liczba" << endl;
    //teraz należy przywrócić strumień do poprawnego stanu.
    cin.clear();
    cin.ignore( 9999 );
}

Próbowałem na kilka sposobów u mnie w programie i nie wychodziło za bardzo.
P-139360
Monika90
» 2015-10-29 22:21:59
najprostsze co mi przychodzi do głowy:
C/C++
int szerokosc;
cout << "podaj szerokość: ";
while( !( cin >> szerokosc ) || szerokosc < 5 || szerokosc > 20 )
{
    cout << "źle, podaj szerokość jeszcze raz: ";
    cin.clear();
    cin.ignore( 9999, '\n' );
}

cout << "OK, szerokość = " << szerokosc << endl;

UWAGA, po tej dużej liczbie w cin.ignore, musi być jeszcze '\n', wcześniej o tym zapomniałam.
P-139362
Baca3322
Temat założony przez niniejszego użytkownika
» 2015-10-29 22:39:10
Ok, dzięki za pomoc.
P-139363
Baca3322
Temat założony przez niniejszego użytkownika
» 2015-10-30 13:52:37
Cześć, wracając do tematu, zauważyłem, że kiedy wprowadzam liczbę(dobrą lub złą), to program nie reaguje i muszę ją wprowadzić drugi raz, żeby zaskoczył(jest skok do następnej lini i chce żebym wpisał to samo ponownie):

cout << endl << "Podaj wysokość figury z przedziału <9,70>: "; //wczytywanie wysokośći figury
cin >> wysokosc;
while (!(cin >> wysokosc) || wysokosc < 9 || wysokosc > 70) //kontrola danych wysokości
{
cout << endl << "Wprowadzona wysokość jest poza przedziałem <9,70>";
cout << endl << "Podaj wysokośc jescze raz: ";
cin.clear();
cin.ignore(9999, '\n');
}
P-139375
Monika90
» 2015-10-30 14:16:28
W twoim kodzie cin >> wysokosc występuje dwa razy, usuń pierwsze wystąpienie.
P-139377
Baca3322
Temat założony przez niniejszego użytkownika
» 2015-10-30 14:21:10
Ok, już mam, dziękuję jeszcze raz
P-139379
« 1 »
  Strona 1 z 1