abcde Temat założony przez niniejszego użytkownika |
[Zadanie 15] Zamykanie klakulatora. » 2012-03-10 21:34:34 Napisałem kalkulator ze zadania, ale mam problem bo nie mogę zakończyć jego pracy.
Problem polega na tym ,że jak wybiorę opcję 5 z mojego to nie zamyka programu.Czy można zatem w warunek zakończenia pętli while wpisać opcje case 5 tak, że jak ona zostanie wybrana to program zakończy pracę.
Podana warunek w poniższym kodzie jest warunkiem tymczasowym tylko dla jego działania w niego próbuje wpisać jakos case 5.
Oto kod:
#include <iostream>
int main()
{ std::cin.clear(); std::cin.sync(); float a; float b; int opcja; float wynik; bool sprawdzanie = std::cin.good(); bool rozne = a != 0; std::cout << "Kalkulator " << std::endl; std::cout << "Menu:" << std::endl; std::cout << "[1] dodawanie" << std::endl; std::cout << "[2] odejmowanie" << std::endl; std::cout << "[3] mnozenie" << std::endl; std::cout << "[4] dzielenie" << std::endl; std::cout << "[5] rezygnuj" << std::endl; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj co chcesz zrobic" << std::endl; std::cin >> opcja; switch( opcja ) { case 1: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dodawanie" << std::endl; do { std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; if( rozne = a == 0 ) std::cout << "Wybierz liczbe rozna od zera." << std::endl; } while( rozne = a == 0 ); } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a + b << std::endl; break; case 2: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales odejmowanie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a - b << std::endl; break; case 3: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales mnozenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a * b << std::endl; break; case 4: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dzielenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl;;\ } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a / b << std::endl; break; case 5: std::cin.clear(); std::cin.sync(); std::cout << "Wybrales koniec" << std::endl; break; default: std::cout << "Bledny wybor. Dostepne opcje: 1,2,3,4,5." << std::endl; break; } } while( wynik != true ); std::cout << "Koniec"; return 0; }
Proszę o porady.
Pozdrawiam.
Podoba mi się ten kurs.
Dawno się tak nie na myślałem. |
|
jsc |
» 2012-03-10 21:41:53 Możesz zrobić osobną zmienną: i od niej uzależnić wyjście z pętli. |
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-10 22:13:11 Dokonałem modyfikacji. Wszystko działa, tylko takie małe ale znalazłem.
Otóż jak wybiorę opcję nr 5 to mam tam napis wybrałeś koniec, ale coś tam muszę nadusić jeszcze jakąś liczbę aby ten koniec nastapił i dopiero wtedy on następuję. I tu mam ten mały problem, powstaje taka linijka przerwy gdzie naciśnięcie liczby obojętnie jakiej powoduje faktyczny koniec.
Mam nadzieję, że zrozumiesz o co chodzi:
Aktualny kod:
#include <iostream>
int main()
{ std::cin.clear(); std::cin.sync(); float a; float b; int opcja; float wynik; bool sprawdzanie = std::cin.good(); bool rozne = a != 0; bool czykoniec = false; std::cout << "Kalkulator " << std::endl; std::cout << "Menu:" << std::endl; std::cout << "[1] dodawanie" << std::endl; std::cout << "[2] odejmowanie" << std::endl; std::cout << "[3] mnozenie" << std::endl; std::cout << "[4] dzielenie" << std::endl; std::cout << "[5] rezygnuj" << std::endl; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj co chcesz zrobic" << std::endl; std::cin >> opcja; switch( opcja ) { case 1: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dodawanie" << std::endl; do { std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; if( rozne = a == 0 ) std::cout << "Wybierz liczbe rozna od zera." << std::endl; } while( rozne = a == 0 ); } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a + b << std::endl; break; case 2: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales odejmowanie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a - b << std::endl; break; case 3: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales mnozenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a * b << std::endl; break; case 4: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dzielenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl;;\ } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a / b << std::endl; break; case 5: std::cin.clear(); std::cin.sync(); std::cout << "Wybrales koniec" << std::endl; std::cin >> czykoniec; break; default: std::cout << "Bledny wybor. Dostepne opcje: 1,2,3,4,5." << std::endl; break; } } while( czykoniec == false ); std::cout << "Koniec"; return 0; }
|
|
jsc |
» 2012-03-10 22:17:47 Chodziło mi o to, żeby po wejściu do case 5 prostym poleceniem zmienić stan zmiennej, a nie korzystać z cin bo jak dostaniesz 0 to pętla przeskoczy. |
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-11 10:35:20 Dobrze zmieniłem. Wydaje mi się, że tak bo wszystko działa, ale czy to miałeś na myśli.
Kod:
#include <iostream>
int main()
{ std::cin.clear(); std::cin.sync(); float a; float b; int opcja; float wynik; bool sprawdzanie = std::cin.good(); bool rozne = a != 0; bool czykoniec = false; std::cout << "Kalkulator " << std::endl; std::cout << "Menu:" << std::endl; std::cout << "[1] dodawanie" << std::endl; std::cout << "[2] odejmowanie" << std::endl; std::cout << "[3] mnozenie" << std::endl; std::cout << "[4] dzielenie" << std::endl; std::cout << "[5] rezygnuj" << std::endl; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj co chcesz zrobic" << std::endl; std::cin >> opcja; switch( opcja ) { case 1: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dodawanie" << std::endl; do { std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); czykoniec = false; if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; if( rozne = a == 0 ) std::cout << "Wybierz liczbe rozna od zera." << std::endl; } while( rozne = a == 0 ); } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a + b << std::endl; break; case 2: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales odejmowanie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); czykoniec = false; if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a - b << std::endl; break; case 3: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales mnozenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); czykoniec = false; if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a * b << std::endl; break; case 4: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dzielenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; sprawdzanie = std::cin.good(); czykoniec = false; if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl;;;\ } while( sprawdzanie == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; sprawdzanie = std::cin.good(); if( sprawdzanie == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( sprawdzanie == false ); std::cout << "Wynik:" << a / b << std::endl; break; case 5: std::cin.clear(); std::cin.sync(); std::cout << "Wybrales koniec" << std::endl; czykoniec = true; break; default: std::cout << "Bledny wybor. Dostepne opcje: 1,2,3,4,5." << std::endl; break; } } while( czykoniec == false ); std::cout << "Koniec"; return 0; }
|
|
Fabjan94 |
» 2012-03-11 11:18:34 A nie mogłeś po prostu w głównej pętli ostatni warunek wybrać while( opcja != 5 ) I myślę że mogłeś sobie jeszcze odpuścić zmienną wynik ponieważ jej nie używasz oraz sprawdzanie i pisać jedynie cin.good() == false zawsze zaoszczędziłbyś na pamięci. |
|
Fabjan94 |
» 2012-03-11 12:04:31 #include <iostream>
int main()
{ std::cin.clear(); std::cin.sync(); float a; float b; int opcja; std::cout << "Kalkulator " << std::endl; std::cout << "Menu:" << std::endl; std::cout << "[1] dodawanie" << std::endl; std::cout << "[2] odejmowanie" << std::endl; std::cout << "[3] mnozenie" << std::endl; std::cout << "[4] dzielenie" << std::endl; std::cout << "[5] rezygnuj" << std::endl; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj co chcesz zrobic" << std::endl; std::cin >> opcja; switch( opcja ) { case 1: std::cout << "Wybrales dodawanie" << std::endl; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; if( std::cin.fail() ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; else if( a == 0 ) std::cout << "Wybierz liczbe rozna od zera." << std::endl; } while( std::cin.fail() || a == 0 ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); std::cout << "Wynik:" << a + b << std::endl; break; case 2: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales odejmowanie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); std::cout << "Wynik:" << a - b << std::endl; break; case 3: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales mnozenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); std::cout << "Wynik:" << a * b << std::endl; break; case 4: do { std::cin.clear(); std::cin.sync(); std::cout << "Wybrales dzielenie" << std::endl; std::cout << "Podaj pierwsza liczbe: "; std::cin >> a; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl;;;;\ } while( std::cin.good() == false ); do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe: "; std::cin >> b; if( std::cin.good() == false ) std::cout << "Bledny wybor. Podaj liczbe: " << std::endl; } while( std::cin.good() == false ); std::cout << "Wynik:" << a / b << std::endl; break; case 5: std::cin.clear(); std::cin.sync(); std::cout << "Wybrales koniec" << std::endl; break; default: std::cout << "Bledny wybor. Dostepne opcje: 1,2,3,4,5." << std::endl; break; } } while( opcja != 5 ); std::cout << "Koniec"; return 0; }
Tak wydaje mi sie że jest wiele lepiej ponieważ ominęliśmy float wynik; bool sprawdzanie = std::cin.good(); bool rozne = a != 0; bool czykoniec = false; Jeszcze jedynie pętle while zaczynasz w złym miejscu, spójrz sobie na dodawanie i porównaj z innymi opcjami ;) |
|
abcde Temat założony przez niniejszego użytkownika |
» 2012-03-11 14:48:36 Rzeczywiście najprościej podać taki warunek:
Powiem, ze nawet z tym kombinowałem chciałem aby właśnie case 5 kończył jakoś ale nie mogłem wpaść jak bo błędy mi waliły.
Zmienna i tak na pewno by odpadła bo to była tylko tymczasowa do pierwszej wersji aby program działał.
Twoja wersja kodu bardzo ciekawa i rzeczywiście prościej napisana. Przeanalizowałem dokładnie cały kod.
Dziękuje za fajne uwagi.
Przechodzę dalej.
Pozdrawiam. |
|
« 1 » 2 |