Praca domowa do lekcji 15 - kalkulator
Ostatnio zmodyfikowano 2015-08-15 16:14
kaczan Temat założony przez niniejszego użytkownika |
Praca domowa do lekcji 15 - kalkulator » 2015-08-12 22:01:54 Mam problem z opuszczeniem pętli w programie. Zastosowałem dwie i testując nie chce opuścić ani jednej zgodnie z mym życzeniem. Przeglądałem kilka razy i nie potrafię sobie z tym poradzić. #include <iostream> int main()
{ double liczba; liczba = 0; double liczba1; bool poprawnosc; bool poprawnosc1; int dzialanie; do { std::cout << "Aktualny wynik działania to: " << liczba << std::endl; std::cout << "Podaj nową liczbę. Pamiętaj, jeśli podasz 0, to zakończysz program: "; std::cin >> liczba1; poprawnosc = std::cin.good(); if( poprawnosc != 1 ) { std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl; std::cin.clear(); std::cin.sync(); } else { if( liczba1 != 0 ) { do { std::cout << std::endl << "Wybierz odpowiednie działanie :" << std::endl; std::cout << "[1] Dodawanie" << std::endl; std::cout << "[2] Odejmowanie" << std::endl; std::cout << "[3] Mnożenie" << std::endl; std::cout << "[4] Dzielenie" << std::endl; std::cout << "[5] Rezygnuj" << std::endl; std::cin >> dzialanie; poprawnosc1 = std::cin.good(); if( poprawnosc1 != 1 ) { std::cout << "Dokonałeś niewłaściwego wyboru. Spróbuj jeszcze raz. " << std::endl; std::cin.clear(); std::cin.sync(); } else { switch( dzialanie ) { case 1: liczba = liczba + liczba1; std::cin.clear(); std::cin.sync(); break; case 2: liczba = liczba - liczba1; std::cin.clear(); std::cin.sync(); break; case 3: liczba = liczba * liczba1; std::cin.clear(); break; case 4: liczba = liczba / liczba1; std::cin.clear(); std::cin.sync(); break; case 5: std::cin.clear(); std::cin.sync(); break; default: std::cout << "Niepoprawny wybór działania. Spróbuj jeszcze raz."; std::cin.clear(); std::cin.sync(); } } } while( dzialanie == 1 || dzialanie == 2 || dzialanie == 3 || dzialanie == 4 || dzialanie == 5 ); } } } while( liczba1 == 0 || dzialanie == 5 ); std::cout << "Koniec programu. Końcowym wynikiem jest: " << liczba; return 0; }
|
|
carlosmay |
» 2015-08-12 22:20:03 Trochę się zakręciłeś. Możesz zrobić to w jednej pętli (łatwiej). Warunek przerwania pętli |
|
C-Objective |
» 2015-08-13 15:27:14 Nieee. Nonsens. Piszesz 'wpisz 0 aby zakonczyc program' a teraz mam wpisać 5 tak? Gdzie pobierasz zmienną liczba? I do pobierania znaku użyj getch. Wtedy ci się nie zapętli. Getch zwraca char, czyli liczbę od 0 do 255. Edit: Kod bardzo rozlazły. |
|
carlosmay |
» 2015-08-13 15:59:08 Nieee. Nonsens. Piszesz 'wpisz 0 aby zakonczyc program' |
Właśnie taka jest treść zadania: 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 |
while( liczba1 != 0 ); oraz gdy w opcjach switch wprowadzi 5 case 5: liczba1 = 0; break;
czy jeszcze czegoś nie rozumiesz? |
|
michal11 |
» 2015-08-13 17:44:33 Zamiast while( dzialanie == 1 || dzialanie == 2 || dzialanie == 3 || dzialanie == 4 || dzialanie == 5 ) while( dzialanie >= 1 && dzialanie <= 5 ) Nie sprawdzasz przy dzieleniu czy nie dzielisz przez zero. poprawnosc = std::cin.good();
if( poprawnosc != 1 ) całkiem źle, if( !std::cin.good() ) wystarczy. Zmienna poprawnosc jest zupełnie niepotrzebna. To samo zresztą z poprawnosc1. Jesteś pewny, że działania mają być wykonywana na obecnym wyniku ? W ogóle ten program można dość znacząco skrócić i uprościć. |
|
kaczan Temat założony przez niniejszego użytkownika |
» 2015-08-14 00:08:31 Nie sprawdzasz przy dzieleniu czy nie dzielisz przez zero.
|
Poprzez zastosowanie warunku if (liczba1 !=0) Nie dopuszczam do dzielenia przez 0. Gdyż wybranie 0 zakończy program. Po co mam dodatkowo sprawdzać? W ogóle ten program można dość znacząco skrócić i uprościć.
|
Domyślam się. Na razie jestem początkującym kandydatem na ucznia w programowaniu, dlatego piszę na forum. Nie znam osobiście nikogo kto by zerkał na moje wypociny, więc zadaję pytania tutaj, abyście jako znacznie bardziej doświadczone osoby pozwolili ustrzec błędów w przyszłości. Zgodnie z Waszymi sugestiami poprawiłem program. Niestety nie działa mi sprawdzanie poprawności błędów. Wypisanie litery powoduje zakończenie programu - zamiast powtórzenia pętli od początku. Gdzie kryje się błąd? #include <iostream> int main()
{ double liczba; liczba = 0; double liczba1; bool poprawnosc; bool poprawnosc1; int dzialanie; do { liczba1 = 1; std::cout << "Aktualny wynik działania to: " << liczba << std::endl; std::cout << "Podaj nową liczbę. Pamiętaj, jeśli podasz 0, to zakończysz program: "; std::cin >> liczba1; poprawnosc = std::cin.good(); if( poprawnosc != 1 ) { std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl; std::cin.clear(); std::cin.sync(); } else { if( liczba1 != 0 ) { do { std::cout << std::endl << "Wybierz odpowiednie działanie :" << std::endl; std::cout << "[1] Dodawanie" << std::endl; std::cout << "[2] Odejmowanie" << std::endl; std::cout << "[3] Mnożenie" << std::endl; std::cout << "[4] Dzielenie" << std::endl; std::cout << "[5] Rezygnuj" << std::endl; std::cin >> dzialanie; poprawnosc1 = std::cin.good(); if( poprawnosc1 != 1 ) { std::cout << "Dokonałeś niewłaściwego wyboru. Spróbuj jeszcze raz. " << std::endl; std::cin.clear(); std::cin.sync(); } else { switch( dzialanie ) { case 1: liczba = liczba + liczba1; std::cin.clear(); std::cin.sync(); break; case 2: liczba = liczba - liczba1; std::cin.clear(); std::cin.sync(); break; case 3: liczba = liczba * liczba1; std::cin.clear(); break; case 4: liczba = liczba / liczba1; std::cin.clear(); std::cin.sync(); break; case 5: std::cin.clear(); std::cin.sync(); liczba1 = 0; break; default: std::cout << "Niepoprawny wybór działania. Spróbuj jeszcze raz."; std::cin.clear(); std::cin.sync(); } } } while( dzialanie <= 1 && dzialanie >= 5 ); } } } while( liczba1 != 0 ); std::cout << "Koniec programu. Końcowym wynikiem jest: " << liczba; return 0; }
|
|
carlosmay |
» 2015-08-14 08:44:40 Niestety nie działa mi sprawdzanie poprawności błędów.
if( poprawnosc != 1 ) { std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl; std::cin.clear(); std::cin.sync(); }
|
Roziązanie: zamien std::cin.sync() na std::cin.ignore() Opis tej metody jest w Obsługa strumienia wejściowegoPatrz: Problemy z czyszczeniem strumienia pod Linuksem. Tutaj są posty temat twojego problemuPowodzenia. |
|
kaczan Temat założony przez niniejszego użytkownika |
» 2015-08-14 17:26:04 Roziązanie: zamien std::cin.sync() na std::cin.ignore()
|
Niestety nie pomaga. Wpisanie litery kończy program. |
|
« 1 » 2 3 |