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

Po wpisaniu litery program nie powtarza pętli

Ostatnio zmodyfikowano 2014-02-16 13:16
Autor Wiadomość
sebastian333
Temat założony przez niniejszego użytkownika
Po wpisaniu litery program nie powtarza pętli
» 2014-02-15 21:18:46
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
   
    int o, p, s, g, m, iy;
   
   
    cout << endl << " Sprawdzanie : " << endl << endl; //nazwa menu
    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; //nazwa manu II
    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; //Wymuszenie zakonczenia pracy programu
   
    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ć.
P-104689
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()))
P-104699
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 .
P-104704
leon_w
» 2014-02-16 09:58:36
Zmień kolejność i powinno działać.
Najpierw cin.clear(), po tym cin.sync().
P-104705
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 !
P-104716
« 1 »
  Strona 1 z 1