Rozdział 15, zadanie 2 i 3 - rozwiazanie
Ostatnio zmodyfikowano 2018-09-18 18:50
rupson Temat założony przez niniejszego użytkownika |
Rozdział 15, zadanie 2 i 3 - rozwiazanie » 2018-09-18 15:15:25 Witam serdecznie, Walczę z zadaniem 2 i 3 z rozdziału 15. Kalkulator działa jak należy z tym, że gdy przyszło do jego zabezpieczenia przed wprowadzeniem złych danych czegoś cały czas mi brakuje. #include <iostream> #include <limits>
using namespace std;
int main() { float a, w = 0; int d; bool dobra_liczba, dobre_dzialanie; do { cout << "Wynik to " << w << endl; cout << "Podaj liczbe niezerowa lub 0 by zakonczyc: " << endl; cin >> a; dobra_liczba = cin.good(); if( dobra_liczba == 1 ) { cout << "Wybierz dzialanie: " << endl; cout << "[1] Dodawanie" << endl; cout << "[2] Odejmowanie" << endl; cout << "[3] Mnozenie" << endl; cout << "[4] Dzielenie" << endl; cout << "[5] Rezygnuje" << endl; cin >> d; dobre_dzialanie = cin.good(); if( dobre_dzialanie == 1 ) { switch( d ) { case 1: w = w + a; break; case 2: w = w - a; break; case 3: w = w * a; break; case 4: w = w / a; break; case 5: break; } } } else cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } while( dobra_liczba == 1 || dobre_dzialanie == 1 || a != 0 ); return 0; } Tak więc przy wprowadzaniu poprawnych liczb program działa zgodnie z założeniami. Przy wprowadzeniu liter za pierwszą liczbę program się zapętla i działa jak należy, natomiast przy wpisaniu liter za wybór działania dwukrotnie wyświetla linijkę z wynikiem i prośbą o podanie liczby niezerowej, po której jeśli podać znowu litery to zakańcza swoje działanie... Dodam iż przy podaniu licz spoza zakresu wyboru działania np. 50 wtedy zapętla do początku tak jak być powinno. Taki wynik mnie nie satysfakcjonuje dlatego szukam porady :) |
|
pekfos |
» 2018-09-18 15:33:45 Obsługa strumienia wejściowegoTu masz przykład jak wygląda wczytywanie liczby z czyszczeniem strumienia i zachowaniem informacji, czy wystąpił błąd. Chcesz to zapętlić dopóki występuje błąd. Co oznacza że będziesz mieć kawałek kodu do skopiowania w każde miejsce, gdzie chcesz wymagać od użytkownika wprowadzenia poprawnej liczby. Po konstrukcji twojego kodu wnioskuję, że chciałeś uniknąć kopiowania kodu, ale w efekcie zapętlasz niewłaściwe rzeczy. Za dwie lekcje poznasz mechanizm do poprawnego unikania kopiowania kodu w takim przypadku. |
|
rupson Temat założony przez niniejszego użytkownika |
» 2018-09-18 18:50:05 Dzięki bardzo za rady, trochę pomyślałem i poszło :) Wrzucam kod dla osób z podobnym problemem. #include <iostream> #include <limits>
using namespace std;
int main() { float a, w = 0; int d; bool blad_liczba, blad_dzialanie; do { do { cout << "Wynik to " << w << endl; cout << "Podaj liczbe niezerowa lub 0 by zakonczyc: " << endl; cin >> a; blad_liczba = cin.fail(); cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } while( blad_liczba == 1 ); if( a == 0 ) return 0; do { cout << "Wybierz dzialanie: " << endl; cout << "[1] Dodawanie" << endl; cout << "[2] Odejmowanie" << endl; cout << "[3] Mnozenie" << endl; cout << "[4] Dzielenie" << endl; cout << "[5] Rezygnuje" << endl; cin >> d; blad_dzialanie = cin.fail(); cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } while( blad_dzialanie == 1 ); if( d == 0 ) return 0; switch( d ) { case 1: w = w + a; break; case 2: w = w - a; break; case 3: w = w * a; break; case 4: w = w / a; break; case 5: break; } } while( blad_liczba == 0 || blad_dzialanie == 0 || a != 0 ); return 0; }
|
|
« 1 » |