wojcioo Temat założony przez niniejszego użytkownika |
Lekcja 26 zadanie 2 » 2018-09-29 22:24:04 Witam! ponownie mam problem nad którym utknąłem bardzo proszę o pomoc co jest nie tak... bo sam chyba do tego nie dojdę. Po kompilacji tego: #include <iostream> #include<string>
using namespace std;
void wczytajOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Podaj imie: " << endl; cin >> imie; cout << "Podaj nazwisko: " << endl; cin >> nazwisko; cout << "Podaj wiek: " << endl; cin >> wiek; if( cin.fail() ) { do { cin >> wiek; cout << "Blad! Podaj liczbe!"; cin.clear(); cin.ignore(); } while( cin.fail() == true ); } } wypiszOsobe( string & im, string & naz, int & wiek ) { cout << im << " " << naz << " " << wiek << endl; }
int main() { string imie[ 2 ]; string nazwisko[ 2 ]; int wiek[ 2 ]; for( int i = 0; i < 2; i++ ) wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); return 0; }
i wpisaniu celowo błędnej wartości do zmiennej wiek[0] - tak jakby zapomina o problemie i "omija" również drugą szufladke w tablicy imie[1] i przeskakuje odrazu do podania drugiego nazwisko[1]. Tak to wygląda w kompilatorze: http://wrzuc.se/i/5bafdb0f973ef |
|
wojcioo Temat założony przez niniejszego użytkownika |
» 2018-09-29 22:54:42 Dobra p znalazłem problem który jak zwykle okazał się być błachy... nie potrzebnie tam było miejsce na dwa razy zmienna wiek przez co program świrował i nie wiedział co przypisać do tablicy:) Natomiast na zamiane cin na getline(); program znów zaczął świrować... i teraz już nic chyba nie wymyśle: void wczytajOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Podaj imie: " << endl; getline( cin, imie ); cout << "Podaj nazwisko: " << endl; getline( cin, nazwisko ); cout << "Podaj wiek: " << endl; do { cin.clear(); cin.ignore(); cin >> wiek; } while( cin.fail() == true ); }
Tak to wygląda w kompilatorze: http://wrzuc.se/i/5bafe3d846906 |
|
pekfos |
» 2018-09-29 23:25:17 Najpierw wczytuj liczbę, potem czyść błąd jeśli jest, powtarzaj jeśli błąd był - bo już nie ma, wyczyściłeś stan strumienia. Pierwszy kod był bliżej poprawnego rozwiązania niż drugi. Co do używania >> razem z getline(), musisz rozumieć różnice w ich działaniu. Możesz o tym poczytać tu std::getline() mi nie działa!. |
|
YooSy |
» 2018-09-29 23:27:22 |
|
wojcioo Temat założony przez niniejszego użytkownika |
» 2018-09-30 00:04:42 YooSy dziękuję pomogło! I działa jak trzeba :) Natomiast ciekaw jestem Pekfos jak to powinno wyglądać wg. Ciebie bo próbowałem w tej kolejności co pisałeś ii coś nie szło.... do { cin >> wiek; cin.clear(); cin.ignore(); } while( cin.fail() == true );
cin.ignore( numeric_limits < streamsize >::max(), '\n' );
|
|
YooSy |
» 2018-09-30 00:09:35 std::cin.fail() warunku pętli zawsze będzie == false , bo wcześniej używasz std::cin.clear() . Kolejność operacji jest bardzo ważna. Jeśli masz problem ze zrozumieniem kodu, rozpisz sobie go na kartce i przeanalizuj. |
|
wojcioo Temat założony przez niniejszego użytkownika |
» 2018-09-30 00:13:50 Dlatego działający kod (nie mówię że właściwy) wygląda u mnie tak: do { cin.clear(); cin.ignore(); cin >> wiek; if( cin.fail() == true ) cout << "Blad! Podaj wiek jeszcze raz: " << endl; } while( cin.fail() == true );
Tylko rozważam co Pefkos miał na myśli we wcześniejszym poście i jakoś nie mogę tego wykonać. |
|
YooSy |
» 2018-09-30 00:20:28 Tutaj std::cin.ignore() oczekuje na jakieś dane do usuniecia, gdy bufor strumienia jest pusty. int n; while( !( std::cin >> n ) ) { std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); }
ew: do { if( cin.fail() ) { cin.clear(); cin.ignore(); cout << "Blad! Podaj wiek jeszcze raz: " << endl; } cin >> wiek; } while( cin.fail() == true ); |
|
« 1 » 2 |