hhh Temat założony przez niniejszego użytkownika |
[Lekcja 15] Kalkulator - problem » 2014-01-29 12:21:33 Witam, zrobiłem do lekcji 15 kalkulator, tylko mam taki problem, #include <iostream> using namespace std; int main() { cout << "********===========K A L K U L A T O R============*********\n " << " ------------O------------------------ - O----------------\n"; float a, b; int liczba; bool ww; do { cout << "Wybierz dzialanie: \n" << "[1] Dodawanie: \n" << "[2] Odejmowanie:\n" << "[3] Mnozenie:\n" << "[4] Dzielenie: \n\n" << "[0] Zakoncz program \n\n" << "Twoj wybor: "; cin >> liczba; ww = liczba; ww = cin.good(); cin.sync(); cin.clear(); bool aa = false, bb = false; switch( liczba ) { case 1: { cout << "Wybrales dodawanie( A + B )\n" << "Wpisz liczby a i b ktore chcesz do siebie dodac:\n"; do { cout << "a: "; cin >> a; aa = a; aa = cin.good(); cin.sync(); cin.clear(); cout << "b: "; cin >> b; bb = b; bb = cin.good(); cin.sync(); cin.clear(); if( !( aa ) || !( bb ) ) cout << "Podales nieprawidlowe znaki w liczbie a lub b. Sproboj jeszcze raz\n"; } while( !( aa ) ||!( bb ) ); cout << "\nA + B wynosi: " << a + b << endl << "\n"; break; } case 2: { cout << "Wybrales odejmowanie( A - B )\n" << "Wpisz liczby a i b ktore chcesz od siebie odjac:\n"; do { cout << "a: "; cin >> a; aa = a; aa = cin.good(); cin.sync(); cin.clear(); cout << "b: "; cin >> b; bb = b; bb = cin.good(); cin.sync(); cin.clear(); if( !( aa ) || !( bb ) ) cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n"; } while( !( aa ) || !( bb ) ); cout << "\nA - B wynosi: " << a - b << endl << "\n"; break; } case 3: { cout << "Wybrales mnozenie( A * B )\n" << "Wpisz liczby a i b ktore chcesz przez siebie pomnozyc:\n"; do { cout << "a: "; cin >> a; aa = a; aa = cin.good(); cin.sync(); cin.clear(); cout << "b: "; cin >> b; bb = b; bb = cin.good(); cin.sync(); cin.clear(); if( !( aa ) || !( bb ) ) cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n"; } while( !( aa ) || !( bb ) ); cout << "\nA * B wynosi: " << a * b << endl << "\n"; break; } case 4: { cout << "Wybrales dzielenie( A / B )\n" << "Wpisz liczby a i b ktore chcesz przez siebie podzielic:\n"; do { cout << "a: "; cin >> a; aa = a; aa = cin.good(); cin.sync(); cin.clear(); cout << "b: "; cin >> b; bb = b; bb = cin.good(); cin.sync(); cin.clear(); if( b == 0 ) cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz" << endl << "\n"; if( !( aa ) || !( bb ) ||!( b == 0 ) ) cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n"; } while( !( aa ) || !( bb ) ||!b ); cout << "\nA / B wynosi: " << a / b << endl << "\n"; break; } case 0: cout << "Wybrales 0, wiec program zostanie zakonczony"; cin.sync(); cin.clear(); } if( !( ww ) ) cout << "Wpisales nieprawidlowe znaki. Sprobuj jeszcze raz.\n\n\n"; } while( liczba != 0 ); cin.sync(); cin.get(); return 0; }
Problem jest taki jak pokazałem na screenie, po wybraniu opcji 4, wpisaniu a=3,b=0, następnie wpisuje a=e,b=s i wyskakuje mi komunikat "Nie dzielimy przez 0" a nie powinien. Jeżeli najpierw wpiszę a=s,b=c to jest wszystko ok. . I jeszcze takie pytanie, czy po za tym problemem, zostały spełnione wszystkie warunki zadania? |
|
alixir |
» 2014-01-29 12:39:50 Na szybkiego twój problem można rozwiązać tak: if( !( aa ) || !( bb ) ||!( b == 0 ) )
cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n"; else if( b == 0 ) cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz" << endl << "\n"; A ogólnie to pętlę sprawdzającą poprawność danych zrobiłbym dla każdej zmiennej osobno. |
|
hhh Temat założony przez niniejszego użytkownika |
» 2014-01-29 12:55:09 Dzięki zadziałało! A mógłbyś mi powiedzieć, co było nie tak z dwoma ifami w pętli, bo to dziwne, jeżeli pierwszy if się wykona("Nie dzielimy przez 0) i pętla się powtórzy, to automatycznie ten if jest uznawany za wykonany i wchodzi do drugiego ifa("Nieprawidlowe znaki"), albo do wartosci b zamiast znaku jest przypisywana wartość 0 hm? |
|
alixir |
» 2014-01-29 14:52:14 Ogólnie pod zmienną liczbową nie da się przypisać litery, więc jeśli we wcześniejszym przebiegu podałeś jako b=0, a następnym razem testujesz dla liter, to b nadal wynosi 0. Stąd też pierwszy z warunków sprawdzający czy b==0 wyświetlał twój niechciany tekst.
|
|
hhh Temat założony przez niniejszego użytkownika |
» 2014-01-29 15:39:49 alixir, hm, sytuacja wyglądała tak: Jest pętla do { if( b == 0 ) if( !( aa )...) } while(...) I sytuacja: 1. Wpisuje pod b literę(np. b='s') 2. warunek if(b==0) jest pomijany, wykonuje się następny if(!(aa)...) --->czyli prawidłowo tak jak ma być II sytuacja: 1.Wpisuje b=0 2. warunek if(b==0) jest wykonywany 3. Pętla się powtarza, tym razem pod b wpisuje literę 4. Wykonują się 2 warunki: if(b==0) i if(!(aa)...) Więc żeby zapobiec takiej sytuacji trzeba by było zmienną b zresetować pod koniec pętli czy jak? |
|
alixir |
» 2014-01-29 17:01:45 Ja bym zapisał to coś w tym stylu: (przeanalizuj sobie) bool aa = true, bb = true; .. .. case 4: { cout << "Wybrales dzielenie( A / B )\n" << "Wpisz liczby a i b ktore chcesz przez siebie podzielic:\n"; do { cout << "a: "; cin >> a; aa = cin.good(); if( !aa ) { cin.sync(); cin.clear(); cout << "Podales nieprawidlowa liczbe. Sproboj jeszcze raz\n"; } } while( !aa ); do { cout << "b: "; cin >> b; bb = cin.good(); if( !bb ) { cin.sync(); cin.clear(); cout << "Podales nieprawidlowa liczbe. Sproboj jeszcze raz\n"; } else if( b == 0 ) { cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz\n"; bb = false; } } while( !bb ); cout << endl << a << " / " << b << " = " << a / b << endl; break; } |
|
« 1 » |