[Lekcja 15] Zadanie domowe KALKULATOR, problem z dwukrotnym wpisywaniem zmiennej
Ostatnio zmodyfikowano 2014-05-20 19:48
radek04 Temat założony przez niniejszego użytkownika |
[Lekcja 15] Zadanie domowe KALKULATOR, problem z dwukrotnym wpisywaniem zmiennej » 2014-05-20 12:57:42 Cześć, to mój pierwszy post i jestem zielony w programowaniu (ale coraz mniej dzięki kursowi). Udało mi się już napisać 2 lub 3 działające kalkulatory, ale mam problem z zadaniem domowym z lekcji 15. Próbowałem sztywno się trzymać zadania, czyli działanie programu ma wyglądać następująco: 1. Wypisuje obecny wynik 2. Wprowadź liczbę 3. Wybierz działanie (jeżeli liczba różna od 0) 4. Wykonaj obliczenia (jeżeli liczba różna od 0) 5. Wróć do kroku 1. 6. Jeżeli wprowadzoną liczbą jest 0, zakończ program. Błąd objawia się tym, że po dopisaniu: while( !( cin >> liczba ) ) { cin.clear(); cin.sync(); } przy wpisaniu poprawnej wartości (liczby) nie wczytuje jej od razu, lecz za drugim razem. Gdy robiłem to innym sposobem ( np. if (liczba>0 && liczba <=9) ) działało, ale dlaczego mam się ograniczać do konkretnego przedziału liczbowego. Chcę, by program rozpoznał poprawne wprowadzenie typu int. #include <iostream> #include <cstdlib> using namespace std; int main() { int liczba; int wynik = 1; int dzialanie; cout << "Wynik = " << wynik << endl; do { cin.clear(); cin.sync(); cout << "\nWprowadz liczbe: "; cin >> liczba; while( !( cin >> liczba ) ) { cin.clear(); cin.sync(); } cout << "\nWybierz dzialanie: \n" "[1] Dodawanie\n" "[2] Odejmowanie\n" "[3] Mnozenie\n" "[4] Dzielenie\n" "[5] Rezygnuj\n\n"; cin.clear(); cin.sync(); cin >> dzialanie; switch( dzialanie ) { case 1: wynik = wynik + liczba; cout << "\nWynik = " << wynik << endl; break; case 2: wynik = wynik - liczba; cout << "\nWynik = " << wynik << endl; break; case 3: wynik = wynik * liczba; cout << "\nWynik = " << wynik << endl; break; case 4: wynik = wynik / liczba; cout << "\nWynik = " << wynik << endl; break; case 5: break; default: cout << "Zle wprowadzone dzialanie"; } } while( liczba != 0 ); system( "pause" ); return 0; }
|
|
MrPoxipol |
» 2014-05-20 13:26:10 Wykonuj tylko po odczycie. |
|
radek04 Temat założony przez niniejszego użytkownika |
» 2014-05-20 13:35:51 Czyli w którym momencie dokładnie? Usunięcie któregokolwiek cin.clear(); cin.sync(); ( poza tym z petli while(!(cin>>liczba)) )nie pomaga. Chciałem czyścić bufor przed wczytaniem każdej kolejnej zmiennej. Źle? |
|
MrPoxipol |
» 2014-05-20 13:49:05 do { cin.clear(); cin.sync(); cout << "\nWprowadz liczbe: "; |
|
radek04 Temat założony przez niniejszego użytkownika |
Nie pomaga » 2014-05-20 13:51:30 Niestety nie zmienia to działania programu. Problem pozostał. |
|
Jacob99 |
» 2014-05-20 17:47:45 Do sprawdzenia czy strumień jest w dobrym stanie nie stosuje się while tylko if #include <iostream> #include <cstdlib> using namespace std; int main() { int liczba; int wynik = 1; int dzialanie; cout << "Wynik = " << wynik << endl; do { cout << "\nWprowadz liczbe: "; cin >> liczba; if( !cin >> liczba ) { cin.clear(); cin.sync(); } cout << "\nWybierz dzialanie: \n" "[1] Dodawanie\n" "[2] Odejmowanie\n" "[3] Mnozenie\n" "[4] Dzielenie\n" "[5] Rezygnuj\n\n"; cin >> dzialanie; switch( dzialanie ) { case 1: wynik = wynik + liczba; cout << "\nWynik = " << wynik << endl; break; case 2: wynik = wynik - liczba; cout << "\nWynik = " << wynik << endl; break; case 3: wynik = wynik * liczba; cout << "\nWynik = " << wynik << endl; break; case 4: wynik = wynik / liczba; cout << "\nWynik = " << wynik << endl; break; case 5: break; default: cout << "Zle wprowadzone dzialanie"; } } while( liczba != 0 ); system( "pause" ); return 0; }
Spróbuj teraz. U mnie działało, u ciebie też powinno:) |
|
radek04 Temat założony przez niniejszego użytkownika |
» 2014-05-20 18:44:52 U mnie nie działa po wpisaniu np. litery. Z liczba faktycznie wpisuje za pierwszym razem. A z while to nie wiem, ale taki przykład znalazłem na jakiejś stronie próbując rozwiązać problem.
edit: z if nie działa, u mnie musi być while |
|
maly |
» 2014-05-20 19:01:58 Bo to ten while miał zostać a ten cin powyzej miał zniknąć. |
|
« 1 » 2 |