Lekcja 15 kalkulator
Ostatnio zmodyfikowano 2013-02-13 21:02
Eldakar Temat założony przez niniejszego użytkownika |
Lekcja 15 kalkulator » 2013-02-13 18:52:14 napisałem troche inaczej niż było w poleceniu zadania ale to głównie w celach doświadczalnych #include <iostream> int main() { double a; double b; char znak = '+' || '-' || '*' || '/' || '='; do { std::cout << "0" << std::endl; std::cin >> a; std::cin >> znak; do { std::cin >> b; switch( znak ) { case '-': std::cout << a - b << std::endl; a = a - b; std::cin >> znak; break; case '+': std::cout << a + b << std::endl; a = a + b; std::cin >> znak; break; case '/': if( b != 0 ) { std::cout << a / b << std::endl; a = a / b; std::cin >> znak; } else { std::cout << "error" << std::endl; std::cin >> znak; } break; case '*': std::cout << a * b << std::endl; a = a * b; std::cin >> znak; break; } } while( znak != '=' && "error" ); std::cin.clear(); std::cin.sync(); } while( a != 0 || znak != '/' ); return 0; }
(żeby program działał poprawnie wystarczy wpisywać na przemian liczba znak liczba znak...) program działa bez zarzutów do momentu wpisania w miejsce znaku liczby i na odwrót (o co łatwo, szczególnie po dzieleniu przez 0, ponieważ mój program w tym wypadku daje możliwość zmiany działania a nie sprowadza go do wartości wyjściowej / początkowej czyli 0 ) lub wpisania litery wtedy nie działa jak powinien moje pytania: 1. czy po 15 lekcjach programowania jestem w stanie to naprawić, sprawić żeby po każdym błędnym znaku program wracał do pierwszego w zapisie 0 2. Jak przebudować ten program żeby po dzieleniu przez 0 i wyświetleniu 'wyniku' error program samoczynnie wracał do wartości początkowej 0 bez konieczności wpisywania znaku zerującego (u mnie to jest '=') , bo próbowałem wpisywać wszystko w założeniach while i nic nie działa |
|
Adam3423 |
» 2013-02-13 19:40:17 char znak = '+' || '-' || '*' || '/' || '='; z tego co mi wiadomo tak sie nie inicjalizuje zmiennych;) case '/': if( znak != '/' || b != 0 ) znak!='/'- tu nie potrzebne skoro zeby wejsc do tej instrukcji znakiem musialo byc dzielenie poza tym zmiennej error w ogole nie uzywasz, a ją zdeklarowales to tez nie potrzebne wiele nie pomoglem ale takie rzeczy mi sie w oczy rzucily;) |
|
Eldakar Temat założony przez niniejszego użytkownika |
» 2013-02-13 19:58:02 masz racje, poprawiłem co do inicjalizacji, wydaje mi się że jest poprawna, to jak suma logiczna cyfr, tylko że ja wykorzystałem znaki :) |
|
Berux |
» 2013-02-13 21:02:24 @Eldakar Ta inicjalizacja nie jest poprawna. Popatrz znak = '+' || '-' || '*' || '/' || '=' , to wyrażenie logiczne. Nawet nie jest ono napisane poprawnie, bo tłumacząc to na instrukcje jakie ma wykonać kompilator będzie to wyglądało mniej więcej tak: Przypisz do zmiennej o nazwie "znak" wartość '+' lub '-' lub '*' lub '/' lub '=' Instrukcja sterująca "switch" przyjmuje jako argument(to argument?:)) wartość zmiennej, którą ma porównać z "case'ami". Powinno być więc: #include <iostream> int main() { double a; double b; char znak; do { std::cout << "0" << std::endl; std::cin >> a; std::cin >> znak; do { std::cin >> b; switch( znak ) { case '-': std::cout << a - b << std::endl; a = a - b; std::cin >> znak; break; case '+': std::cout << a + b << std::endl; a = a + b; std::cin >> znak; break; case '/': if( b != 0 ) { std::cout << a / b << std::endl; a = a / b; std::cin >> znak; } else { std::cout << "error" << std::endl; std::cin >> znak; } break; case '*': std::cout << a * b << std::endl; a = a * b; std::cin >> znak; break; } } while( znak != '=' && "error" ); std::cin.clear(); std::cin.sync(); } while( a != 0 || znak != '/' ); return 0; } Ale ogólnie to gratulacje za sposób rozwiązywania wielu działań naraz, a nie pojedynczo (np. 3+ 3 = 9) :) Dobrze Ci idzie. Życzę Ci powodzenia w dalszej przygodzie z C++. /edit: Odpowiedzi na pytania: 1. Możesz. Właśnie Ci podałem sposób. 2. Zmień : while( znak != '=' && "error" ); na while( znak != '=' || a == 0 && znak == '/' || b == 0 && znak == '/' );
|
|
« 1 » |