Piotrek9706 Temat założony przez niniejszego użytkownika |
Zadanie Domowe. Kalkulator na pętli do...while. » 2014-12-13 18:13:36 Witam, Od kilku dni uczę się C++. Dziś napotkałem problem przy tworzeniu kalkulatora z pracy domowej w rozdziale 14. Nie mogę jakoś ogarnąć tych cin.good() i cin.fail() . Dołączę kod źródłowy programu, może ktoś pomoże mi jak zabezpieczyć przed wprowadzeniem błędnych danych i co zrobiłem źle. #include <iostream> using namespace std;
int main() { int a, b; int wynik = 0; int dzialanie; do { cin.clear(); cin.sync(); bool blad = true; cout << "Podaj liczbe a: "; cin >> a; cout << " " << endl; cout << "Podaj liczbe b: "; cin >> b; cout << " " << endl; if( a == 0 || b == 0 ) blad = false; if( blad == true ) { cin.clear(); cin.sync(); cout << " [1] - Dodawanie \n [2] - Odejmowanie \n [3] - Mnozenie \n [4] - Dzielenie \n [5] - Rezygnuj" << endl; cout << " " << endl; cout << "Wybierz dzialanie: "; cin >> dzialanie; if( cin.good() ) blad = true; else if( cin.fail() ) blad = false; cout << " " << endl; switch( dzialanie ) { case 1: wynik = a + b; break; case 2: wynik = a - b; break; case 3: wynik = a * b; break; case 4: wynik = a / b; break; case 5: cout << " =================DO ZOBACZENIA================="; return 0; break; default: blad = false; if( cin.fail() ) blad = false; cin.clear(); cin.sync(); } if( blad == false ) { cout << "Cos poszlo nie tak :( " << endl; cout << "------------------------------- " << endl; cout << " " << endl; } else { cout << "Obecny wynik wynosi: " << wynik << endl; cout << "------------------------------- " << endl; cout << " " << endl; } } else { cout << "Wprowadziles bledne dane!"; cout << " " << endl; } } while( a != 0 && b != 0 ); return 0; }
No i powiedzcie czy bardzo strasznie ten kod wygląda :D |
|
Rashmistrz |
» 2014-12-13 19:55:20 Nie mogę jakoś ogarnąć tych cin.good() i cin.fail() |
Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu bool , a po użyciu cin.clear() ustawiana jest obydwu wartość false //EDIT ustawi w cin.fail() wartość false , a w cin.good() true Możesz więc zrobić pętlę do...while, której warunkiem będzie cin.fail(), do wczytania liczby od użytkownika. (i nie zapomnij o czyszczeniu bufora) ________________________________________________________________________ if( a == 0 || b == 0 ) blad = false;
if( blad == true ) A co jeśli będę chciał dodać zero do zera? >:D ______________________________________________________________________ Polecam Ci napisać TO jeszcze raz od nowa. PS. Nie zapomnij że nie wolno dzielić przez zero. |
|
Piotrek9706 Temat założony przez niniejszego użytkownika |
» 2014-12-13 21:31:05 Jutro napiszę jeszcze raz. Dobrze rozumiem? : cin.good() oznacza, że wprowadzone dane są prawidłowe, a cin.fail(), że wystapił jakiś błąd. Jeśli wpiszę do zmiennej a typu integer np jakąś literkę to będzie cin.fail() ? No i czy powinienem użyć więcej niż jednej zmiennej typu bool do sprawdzenia poprawności wczytanych zmiennych? tj. jedna do liczby a, druga do b i trzecia do działania? Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu bool,a po użyciu cin.clear() ustawiana jest obydwu wartość false. |
Mam jako początkową wartość boola przyjąć prawdę, czy fałsz? Z góry dziękuję za odpowiedzi, Pozdrawiam |
|
Rashmistrz |
» 2014-12-14 00:40:25 Jeśli wpiszę do zmiennej a typu integer np jakąś literkę to będzie cin.fail() ? |
Tak, wtedy ustawi się wartość true , a fladze cin.good() wartość false . No i czy powinienem użyć więcej niż jednej zmiennej typu bool do sprawdzenia poprawności wczytanych zmiennych? tj. jedna do liczby a, druga do b i trzecia do działania? | Tylko wtedy gdy musisz wyczyścić flagi i będziesz potrzebował informacji o wczytaniu przed ich wyczyszczeniem, a jak nie to skonstruuj to tak, by nie musieć używać dodatkowych zmiennych. Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu bool, a po użyciu cin.clear() ustawiana jest obydwu wartość false . //EDIT ustawi w cin.fail() wartośćfalse , a w cin.good()true | Mam jako początkową wartość boola przyjąć prawdę, czy fałsz? |
Przed pierwszym użyciem cin'a są ustawione takie same wartości jak po użyciu cin.clear(). |
|
Piotrek9706 Temat założony przez niniejszego użytkownika |
» 2014-12-14 13:22:02 Oto treść zadania domowego: 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.
|
A tutaj zamieszczam nowo napisany dziś przeze mnie kod. Wszystko wydaje się działać prawidłowo, jak w poleceniu. Proszę o sprawdzenie kodu i ewentualne poprawki :) #include<iostream> using namespace std;
int main() { int a, b, wynik, znak; bool bladA, bladB, bladDzialania, SprawdzCzy0; do { cout << "Podaj pierwsza liczbe: "; cin >> a; if( cin.fail() ) bladA = 0; else bladA = 1; cin.clear(); cin.sync(); cout << "Podaj druga liczbe: "; cin >> b; if( cin.fail() ) bladB = 0; else bladB = 1; cin.clear(); cin.sync(); if( bladA == 0 || bladB == 0 ) { cout << "Wprowadziles bledne dane!" << endl; cout << "-------------------------------------" << endl; cout << " " << endl; } else if( a != 0 && b != 0 ) { SprawdzCzy0 = true; cout << " [1] - Dodawanie \n [2] - Odejmowanie \n [3] - Mnozenie \n [4] - Dzielenie \n [5] - Rezygnuj " << endl; cout << "Wprowadz liczbe odpowiadajaca dzialaniu: "; cin >> znak; cout << " " << endl; if( cin.fail() ) bladDzialania = 0; else bladDzialania = true; cin.clear(); cin.sync(); switch( znak ) { case 1: wynik = a + b; break; case 2: wynik = a - b; break; case 3: wynik = a * b; break; case 4: wynik = a / b; break; case 5: SprawdzCzy0 = false; break; default: bladDzialania = 0; break; } if( bladDzialania ) { cout << "Obecny wynik wynosi: " << wynik << endl; cout << "-------------------------------------" << endl; cout << " " << endl; } else { cout << "Wprowadziles bledne dane!" << endl; cout << "-------------------------------------" << endl; cout << " " << endl; } } else { SprawdzCzy0 = 0; cout << "Wprowadzono 0! Program zakonczy dzialanie."; } } while( SprawdzCzy0 ); }
|
|
Rashmistrz |
» 2014-12-14 13:41:55 Dość przekombinowane... bool bladA, bladB, bladDzialania, SprawdzCzy0; Tylko wtedy gdy musisz wyczyścić flagi i będziesz potrzebował informacji o wczytaniu przed ich wyczyszczeniem, a jak nie to skonstruuj to tak, by nie musieć używać dodatkowych zmiennych. |
Dlaczego nie wstawić wczytywanie tych liczb w pętle? (każdą w osobnej) if( cin.fail() ) bladA = 0; else bladA = 1; bladA = !cin.fail(); ________________________________________________________ Twój program zachowuje się dość poprawnie, jednak nie mogłem się za bardzo skupić, więc nie wiem czy czegoś nie pominąłem. |
|
Piotrek9706 Temat założony przez niniejszego użytkownika |
» 2014-12-14 20:29:19 Nie bardzo wiem jak ująć to w pętle i jaką pętle zastosować :/ Jeśli to wpakuję w pętle to nie będę potrzebował zmiennych pomocniczych ? |
|
Rashmistrz |
» 2014-12-14 21:08:34 Jeśli to wpakuję w pętle to nie będę potrzebował zmiennych pomocniczych ? |
Tak! Tak! Nie bardzo wiem jak ująć to w pętle i jaką pętle zastosować :/ |
Użyjemy pętli do...while, bo taką na razie znasz i chcemy żeby przynajmniej raz się wykonała zawartość: do { cin.clear(); cin.sync(); cin >> liczba; } while( cin.fail() );
O! Widzisz? :) |
|
« 1 » 2 |