Saiunkoku Temat założony przez niniejszego użytkownika |
Rozdział 15. Pętla do... while - kalkulator » 2014-07-31 16:03:23 Cześć, W rozdziale 15. jest zadanie domowe o treści: Napisz prosty kalkulator, który będzie potrafił dodawać, odejmować, mnożyć i dzielić. Program ten ma działać 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. Przykładowe menu wyboru działania: [1] Dodawanie [2] Odejmowanie [3] Mnożenie [4] Dzielenie [5] Rezygnuj Zabezpiecz wcześniej napisany kalkulator przed podawaniem niepoprawnych liczb i operacji. Wykorzystaj wiedzę zdobytą z pierwszego zadania pracy domowej niniejszego rozdziału. Zabezpiecz również w analogiczny sposób przed możliwością wyboru nieprawidłowego działania. Tutaj mój kod: #include <iostream> using namespace std;
int main() { float a; float b = 0; int dzialanie; do { cout << "\nObecny stan to: " << b << endl; cout << "Wprowadź liczbę (0, by zakończyć): "; cin >> a; cin.clear(); cin.ignore( 1000, '\n' ); if( cin.good() && a != 0 ) { cout << "Wybierz działanie: \n" << "[1] Dodawanie\n" << "[2] Odejmowanie\n" << "[3] Mnożenie\n" << "[4] Dzielenie\n" << "[5] Rezygnuj\n"; cin >> dzialanie; cin.clear(); cin.ignore( 1000, '\n' ); switch( dzialanie ) { case 1: cout << b << "+" << a << "=" << b + a; b = b + a; break; case 2: cout << b << "-" << a << "=" << b - a; b = b - a; break; case 3: cout << b << "*" << a << "=" << b * a; b = b * a; break; case 4: cout << b << "/" << a << "=" << b / a; b = b / a; break; case 5: break; default: cout << "Nie wybrałeś działania\n"; break; } } else cout << "Nie wprowadziłeś liczby lub wybrałeś 0\n"; } while( a != 0 ); cout << "Wprowadziłeś 0, kończymy zabawę\n"; return 0; }
Generalnie działa on tak jak chcę, poza jedną rzeczą. Mianowicie, kiedy wprowadzam jakąś literę, zamiast liczby, pętla do... while kończy działanie. W warunku mam a!=0, takie działanie mam rozumieć, że pętla czyta błędny znak jako 0 i się kończy? Jeżeli tak, to czy ma ktoś może pomysł na to, jak edytować kod, aby po wpisaniu nieprawidłowego znaku, pętla zaczęła działać od nowa, zamiast przechodzić dalej? (Teoretycznie nie ma tego w treści zadania, ale trochę się nad tym namęczyłam i mnie to męczy :)) |
|
pekfos |
» 2014-07-31 16:17:29 0 to ma być zarezerwowana wartość do zakończenia działania kalkulatora. Błędne dane wejściowe powodują wyzerowanie zmiennej, więc program zakończy się niezależnie od tego, co dokładnie się stało. Użyj zera tylko do kończenia pracy kalkulatora, a good() do określania, czy dane wejściowe były poprawne. Aktualne użycie good() w tym kodzie nie ma sensu. |
|
Saiunkoku Temat założony przez niniejszego użytkownika |
» 2014-07-31 16:51:07 Hm, w sumie to tak planowałam, przy czym nie bardzo rozumiem w jaki sposób w takim razie użyć tego good(), aby pętla się nie kończyła. |
|
pekfos |
» 2014-07-31 17:08:36 Najprościej: nie używaj tego tam. do { int liczba; if( liczba == 0 ) break; } while( true ); |
|
Saiunkoku Temat założony przez niniejszego użytkownika |
» 2014-07-31 17:26:13 Edytowałam, jednak nadal działa tak jak na początku, czyli kiedy wybiorę literę zamiast liczby, to kończy pętle i cały program, zamiast wracać na początek pętli (do ponownego wyboru liczby). |
|
1aam2am1 |
» 2014-07-31 17:30:17 Kłania się obsługa wyjątków. Wpisanie litery do zmiennej liczbowej kończy się wyjątkiem, który trzeba przechwycić. http://pl.wikibooks.org/wiki/C++/Obs%C5%82uga_wyj%C4%85tk%C3%B3w
Nie jest to domyślne zachowanie, ale ja tak kiedyś zrobiłem i podziałało. Miałem podobny problem. |
|
pekfos |
» 2014-07-31 17:36:05 Pokaż aktualny kod. Kłania się obsługa wyjątków. Wpisanie litery do zmiennej liczbowej kończy się wyjątkiem, który trzeba przechwycić. http://pl.wikibooks.org/wiki/C++/Obs%C5%82uga_wyj%C4%85tk%C3%B3w |
Od kiedy to domyślne zachowanie..? |
|
Saiunkoku Temat założony przez niniejszego użytkownika |
» 2014-07-31 17:42:29 #include <iostream> using namespace std;
int main() { float b = 0; int dzialanie; do { float a; cout << "\nObecny stan to: " << b << endl; cout << "Wprowadź liczbę (0, by zakończyć): "; cin >> a; cin.clear(); cin.ignore( 1000, '\n' ); if( a == 0 ) break; cout << "Wybierz działanie: \n" << "[1] Dodawanie\n" << "[2] Odejmowanie\n" << "[3] Mnożenie\n" << "[4] Dzielenie\n" << "[5] Rezygnuj\n"; cin >> dzialanie; cin.clear(); cin.ignore( 1000, '\n' ); switch( dzialanie ) { case 1: cout << b << "+" << a << "=" << b + a; b = b + a; break; case 2: cout << b << "-" << a << "=" << b - a; b = b - a; break; case 3: cout << b << "*" << a << "=" << b * a; b = b * a; break; case 4: cout << b << "/" << a << "=" << b / a; b = b / a; break; case 5: break; default: cout << "Nie wybrałeś działania\n"; break; } } while( true ); cout << "Wprowadziłeś 0, kończymy zabawę\n"; return 0; }
|
|
« 1 » 2 |