Po wpisaniu litery program nie powtarza pętli
Ostatnio zmodyfikowano 2014-02-16 13:16
sebastian333 Temat założony przez niniejszego użytkownika |
Po wpisaniu litery program nie powtarza pętli » 2014-02-15 21:18:46 #include <iostream> #include <cstdlib>
using namespace std;
int main() { int o, p, s, g, m, iy; cout << endl << " Sprawdzanie : " << endl << endl; cout << "[1] Sprawdz silnik" << endl; cout << "[2] Sprawdz zegary" << endl; cout << "[3] Sprawdz temperetury podzespolow" << endl; cout << "[4] Sprawdz czy poziom oleju jest odpowiedni" << endl << endl; cout << " Powiadomienia : " << endl << endl; cout << "[5] Ewakuacja" << endl; cout << "[6] Turbulencje" << endl; cout << "[7] Prosba o zapiecie pasow" << endl; cout << "[8] Informacja o starcie" << endl << endl; cout << "[0] Opusc program" << endl << endl; do { cout << "Ktora opcje chcesz wybrac ? "; cin >> s; cin.clear(); cin.sync(); } while( cin.fail() || s > 8 || s < 0 ); if( s == 1 ) { int g; cout << endl << "[1] Sprawdz czy obroty silnika sa odpowiednie" << endl; cout << "[2] Sprawdz pasek rozrzadu" << endl; cout << "[3] Cofnij mnie do glownego menu" << endl; do { cout << " Co chcesz wybrac ? "; cin >> g; cin.clear(); cin.sync(); } while( cin.fail() || g < 1 || g > 3 ); if( g == 1 ) { do { cout << "Wprowadz liczbe obortow aby dowiedziec sie czy sa one optymalne "; cin >> o; cin.clear(); cin.sync(); } while( cin.fail() || o < 0 ); if( o >= 0 && o <= 5000 ) { cout << "Te obroty sa stanowczo za niskie"; } else if( o >= 5001 && o <= 7500 ) { cout << "Te obroty sa optymalne"; } else if( 0 >= 7501 ) { cout << "Jezeli silnik nadal utrzyma takie obroty moze ulec uszkodzeniu"; } } else if( g == 2 ) { do { cout << "Przy jakich œrednich obrotach silnika pracowa³ pasek ? "; cin >> p; cout << "Ile miesiecy jest uzywany obecny pasek ? "; cin >> m; } while( cin.fail() || p < 0 || m < 0 ); if( p > 6000 && m > 18 ) { cout << "Pasek nalezy wymienic "; } else if( p < 6000 && m < 18 ) { cout << "Pasek jest w porzadku "; } } else if( g == 3 ) { cout << endl << endl << endl << endl << endl << endl << endl; } } else if( s == 2 ) { do { cout << "Sprawdz cisnienia pomp i wpisz wynik "; cin >> iy; cin.clear(); cin.sync(); } while( cin.fail() || iy < 0 ); if( iy > 0 && iy < 600 ) { cout << "Cisnienie jest w normie "; } else if( iy > 600 ) { cout << "Cisnienie jest zbyt wysokie "; } } return 0; } Wkleiłem całość bo nie wiem gdzie tkwi problem a chodzi mi konkretnie o ten fragment : do { cout<<"Sprawdz cisnienia pomp i wpisz wynik "; cin>>iy; cin.clear(); cin.sync(); }while(cin.fail()||iy<0); Otóż pętla sie nie powtarza po wpisaniu litery a we wcześniejszych pętlach cin.fail()działało bez zarzutu tutaj gdy cin.fail zastąpie cin.good wtedy po wpisaniu litery powtarza pętle pytanie brzmi dlaczego tak jest(dlaczego cin.good działa a fail nie) ? Program ten jest nieskonczony bo po napotkaniu takiego błędu nie wiem co dalej zrobić. |
|
leon_w |
» 2014-02-15 23:52:56 Rozpisz sobie to co robisz w tej pętli, a będziesz wiedział dlaczego. 1. wpisujesz wartość 2. czyścisz bufor i flagi błedów 3. sprawdzasz ustawione flagi błędów.
Prawidłowa kolejność: 1.czyścisz bufor i flagi błędów 2. wpisujesz wartość 3. sprawdzasz ustawione flagi błędów (while(cin.fail())) |
|
sebastian333 Temat założony przez niniejszego użytkownika |
» 2014-02-16 09:19:50 Zapisałem to teraz tak i dalej jest ten sam problem: do { if(cin.fail()) { cin.sync(); cin.clear(); cout<<"blad"; } cout<<"Sprawdz cisnienia pomp i wpisz wynik "; cin>>iy;
}while(cin.fail()||iy<0);
Program działa dalej po wpisaniu litery . A winnych pętlach w tym programie wszystko jest ok, nie roozumiem . |
|
leon_w |
» 2014-02-16 09:58:36 Zmień kolejność i powinno działać. Najpierw cin.clear(), po tym cin.sync(). |
|
sebastian333 Temat założony przez niniejszego użytkownika |
» 2014-02-16 13:16:00 To nie pomoglo, ale spróbowałem tak :
do { if(cin.fail()){cout<<"To nie jest liczba !"<<endl;} //w przypadku niepowodzenia -komunikat else if(iy<0){cout<<"Nie mozesz wpisac liczby mniejszej od 0"<<endl;} //jeśli liczba <0 - komunikat cout<<"Sprawdz cisnienia pomp i wpisz wynik "; cin.clear(); //czyszczenie flag bledu ! cin.sync(); cin>>iy;
}while(cin.fail()||iy<0);
Istotna była zmiana miejsca występowania czyszczenia flag błędu muszą być one przed strumieniem wejściowym.
Dzięki za pomoc ! |
|
« 1 » |