anniej Temat założony przez niniejszego użytkownika |
[C++] Nieskończona pętla do-while. » 2014-03-01 20:33:23 Starałam się napisać program zadany w kursie C++ (losujący liczbę z zakresu 1 do 1000 - użytkownik zgaduje liczbę do momentu, aż uda mu się wybrać tę, którą wylosował komputer). Wszystko działa podczas zgadywania, jednak nie udaje mi się zabezpieczyć programu przed podaniem niewłaściwego znaku. Pętla do-while, której w tym celu używam, wykonuje się bez końca, mimo tego, że powinno nastąpić kolejne wczytanie i dopiero wtedy ewentualnie kolejne wykonanie pętli, albo przejście do zgadywania liczby. Prosiłabym o pomoc w odnalezieniu błędu: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
int main() { float a, b; int pozycja = 1; cout << "Losuję liczbę..." << endl; srand( time( NULL ) ); a =( rand() % 1000 ) + 1; do { do { if( cin.fail() ) { cin.clear(); cin.sync(); } cout << "Zgadnij wylosowaną liczbę" << endl; cin >> b; } while( cin.fail() ); do { if( b < a ) { cout << "Podana liczba jest za mała!" << endl; break; } else { cout << "Podana liczba jest za duża!" << endl; break; } } while( b != a ); pozycja++; } while( b != a ); cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl; return 0; }
|
|
dami13 |
» 2014-03-02 01:09:26 #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
int main() { float a, b; int pozycja = 1; cout << "Losuję liczbę..." << endl; srand( time( NULL ) ); a =( rand() % 1000 ) + 1; do { if( cin.fail() ) { cin.clear(); cin.sync(); } do { cout << "Zgadnij wylosowaną liczbę" << endl; cin >> b; if( b < a ) { cout << "Podana liczba jest za mała!" << endl; break; } else { cout << "Podana liczba jest za duża!" << endl; break; } } while( b != a ); pozycja++; } while( b != a ); cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl; return 0; }
|
|
marianekA |
» 2014-03-02 02:43:08 Uprościłem Twój kod do jednej pętli. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { float a, b; int pozycja = 1; cout << "Losowanie liczby..." << endl << endl; srand( time( NULL ) ); a = rand() % 1000 + 1; while( 1 ) { cout << "Zgadnij wylosowaną liczbę" << endl; cin >> b; if( b < a ) cout << "Podana liczba jest za mała!" << endl; if( b > a ) cout << "Podana liczba jest za duża!" << endl; if( a == b ) cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl; ++pozycja; } return 0; }
...i troszkę go zmodernizowałem - pewnie o to Ci chodziło #include <iostream> #include <cstdlib> #include <ctime> #include <conio.h> using namespace std;
int main() { char znak; float a, b; int pozycja = 0; cout << "Losowanie liczby..." << endl << endl; srand( time( NULL ) ); a = rand() % 1000 + 1; while( 1 ) { cout << "Zgadnij wylosowaną liczbę" << endl; while( 1 ) { znak = getch(); if( znak > 47 && znak < 58 ) { cin >> b; break; } if( znak == 27 ) return 0; } if( b < a ) cout << "Podana liczba jest za mała!" << endl; if( b > a ) cout << "Podana liczba jest za duża!" << endl; if( a == b ) cout << "Tak, ta liczba to " << b << endl << "Udało Ci się w " << pozycja << " próbach." << endl; ++pozycja; } }
|
|
leon_w |
» 2014-03-02 10:40:10 U mnie działa prawidłowo kod z pierwszego postu, więc nie wiem w czym problem. |
|
pekfos |
» 2014-03-02 10:56:16 anniej: Windows? Uprościłem Twój kod do jednej pętli. |
I wyrzuciłeś sprawdzanie błędów, którego dotyczy problem.. ...i troszkę go zmodernizowałem - pewnie o to Ci chodziło |
Raczej nie chodziło o to, by program działał zupełnie inaczej, niepoprawnie i dalej bez sprawdzania błędów.. |
|
marianekA |
» 2014-03-02 10:59:56 autor ma problem z: Wszystko działa podczas zgadywania, jednak nie udaje mi się zabezpieczyć programu przed podaniem niewłaściwego znaku. |
więc dopisałem mu proste rozwiązanie. |
|
anniej Temat założony przez niniejszego użytkownika |
» 2014-03-02 11:01:35 Dziękuję marianekA, jednak jak napisał pekfos, chodziło mi raczej o poprawienie mojego programu - chciałabym zrobić to poprawnie przy użyciu pętli do-while. Używam niestety Macintosha i programu XCode - możliwe, że w takim razie to on sprawia mi problemy i kompiluje to w ten sposób - czy ktoś mógłby potwierdzić, że ten pierwszy kod jest poprawny? (Po wprowadzeniu np. litery prosi jeszcze raz o podanie liczby, ale nie w nieskończonej pętli?) |
|
pekfos |
» 2014-03-02 11:06:06 Obsługa strumienia wejściowegoPunkt "Problemy z czyszczeniem strumienia pod Linuksem". więc dopisałem mu proste rozwiązanie. |
Sprawdziłeś je? Nie działa. |
|
« 1 » 2 |