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. |
|
Monika90 |
» 2015-10-29 21:50:10 Należy sprawdzać stan strumienia po każdym wprowadzeniu danych. cin >> szerokosc; if( cin ) { if( szerokosc >= 5 && szerokosc <= 20 ) { cout << endl << "Wprowadzono poprawną szerokość"; } } else { cout << "to nie była liczba" << endl; cin.clear(); cin.ignore( 9999 ); }
|
|
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. |
|
Monika90 |
» 2015-10-29 22:21:59 najprostsze co mi przychodzi do głowy: 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. |
|
Baca3322 Temat założony przez niniejszego użytkownika |
» 2015-10-29 22:39:10 Ok, dzięki za pomoc. |
|
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'); } |
|
Monika90 |
» 2015-10-30 14:16:28 W twoim kodzie cin >> wysokosc występuje dwa razy, usuń pierwsze wystąpienie. |
|
Baca3322 Temat założony przez niniejszego użytkownika |
» 2015-10-30 14:21:10 Ok, już mam, dziękuję jeszcze raz |
|
« 1 » |