Prosty kalkulator (ocena mojej pracy)
Ostatnio zmodyfikowano 2013-11-11 12:18
xordi Temat założony przez niniejszego użytkownika |
Prosty kalkulator (ocena mojej pracy) » 2013-11-11 03:38:28 Witam kolegów, jako iż zacząłem całkiem niedawno moje "programowanie", prosiłbym kolegów programistów o ocenę mojego rozumowania i czy wszystko napisałem w porządku :) #include <iostream> #include <cstdio>
int main( void ) { int Polecenie, a, b; Polecenie = 0; do { std::cout << "[1] Dodawanie" << std::endl << "[2] Odejmowanie" << std::endl << "[3] Mnozenie" << std::endl << "[4] Dzielenie" << std::endl << "[5] Rezygnuj" << std::endl << "Twoje polecenie:"; std::cin >> Polecenie; switch( Polecenie ) { case 1: std::cout << "Podaj pierwsza liczbe:"; std::cin >> a; std::cout << "Podaj druga liczbe:"; std::cin >> b; std::cout << "Wynik: " << a + b << std::endl; break; case 2: std::cout << "Podaj pierwsza liczbe:"; std::cin >> a; std::cout << "Podaj druga liczbe:"; std::cin >> b; std::cout << "Wynik: " << a - b << std::endl; break; case 3: std::cout << "Podaj pierwsza liczbe:"; std::cin >> a; std::cout << "Podaj druga liczbe:"; std::cin >> b; std::cout << "Wynik: " << a * b << std::endl; break; case 4: std::cout << "Podaj pierwsza liczbe:"; std::cin >> a; std::cout << "Podaj druga liczbe:"; std::cin >> b; std::cout << "Wynik: " << a / b << std::endl; break; case 5: break; default: std::cout << "Nieprawidlowe polecenie." << std::endl; } } while( Polecenie != 5 ); std::cout << "No to dowidzenia!"; return 0; } Mam jeszcze jeden problem z tym kodem "sprawdzającym": int a;
std::cout << "Podaj liczbe calkowita: "; std::cin >> a; std::cout << "Czy udalo sie wczytac? " << std::cin.good() << std::endl; std::cout << "Czy cos nawalilo? " << std::cin.fail() << std::endl; std::cout << "Liczba a = " << a << std::endl;
return 0;
Problem polega na tym, że obojętnie jaką liczbę bym nie wpisał np. 2.658, wynik dostaję taki: Podaj liczbe calkowita: 2.658 Czy udalo sie wczytac? 1 Czy cos nawalilo? 0 Liczba a = 2 Process returned 0 (0x0) execution time : 4.730 s Press any key to continue. A powinno wywalić błąd, prawda? Bo wygląda na to że typ liczby został zrzutowany na typ zmiennej... Pozdrawiam :) |
|
Monika90 |
» 2013-11-11 07:51:09 Lubisz pisać zbędne rzeczy, np. to słowo void w int main( void ) , po co? Albo ten frgament std::cout << "Podaj pierwsza liczbe:"; std::cin >> a; std::cout << "Podaj druga liczbe:"; std::cin >> b;
powtarza się cztery razy, a przecież wystarczyło raz przed switch. powinno wywalić błąd, prawda? Bo wygląda na to że typ liczby został zrzutowany na typ zmiennej...
|
Nie powinno wywalić błędu i nie ma tu żadnego rzutowania. Operator >> wczytuje znaki ze strumienia tak długo jak pasują do oczekiwanego formatu. Więc wczyta 2 i próbuje czytać dalej, natrafia na kropkę, kropka nie pasuje do formatu int, więc zostawia kropkę w strumienu i zwraca to co wczytał do tej pory czyli 2. |
|
xordi Temat założony przez niniejszego użytkownika |
Małe zmiany. » 2013-11-11 11:30:52 Slówko void skopiowałem po prostu gdzieś w trakcie przerabiania kursu, z początku sam nie wiedziałem co oznacza ale gdzieś się później dokopałem o co chodzi, no o ile wiem oznacza to że program nie pobiera żadnego argumentu... Dziękuję za uwagę, rzeczywiście mogłem to wyciągnąć przed switch, ogólnie chciałem to zrobić ale po wciśnięciu opcji nr. 5 albo jakiegoś nieprawidłowego wyboru nadal prosiło o liczby, więc wstawiłem warunek i już nie prosi. Ogólnie siedziałem dziś całą noc, i kalkulatorek trochę ewoluował (oczywiście nie pisałem tego całą noc tylko różne inne rzeczy tez :) ): #include <iostream>
int wczytajLiczbe() { int liczba; bool liczbaSpraw; do { std::cin >> liczba; liczbaSpraw = std::cin.good(); std::cin.clear(); std::cin.sync(); if( liczbaSpraw == 0 ) { std::cout << "Ooops! Czyzbys wpisal nieprawidlowa liczbe? Jeszcze raz: "; } } while( liczbaSpraw == 0 ); return liczba; }
int main() { int Polecenie, a, b; Polecenie = 0; do { std::cout << "[1] Dodawanie" << std::endl << "[2] Odejmowanie" << std::endl << "[3] Mnozenie" << std::endl << "[4] Dzielenie" << std::endl << "[5] Rezygnuj" << std::endl << "Twoje polecenie: "; std::cin >> Polecenie; std::cin.clear(); std::cin.sync(); if( Polecenie >= 1 && Polecenie <= 4 ) { std::cout << "Podaj pierwsza liczbe: "; a = wczytajLiczbe(); std::cout << "Podaj druga liczbe: "; b = wczytajLiczbe(); } switch( Polecenie ) { case 1: std::cout << "Wynik: " << a + b << std::endl; break; case 2: std::cout << "Wynik: " << a - b << std::endl; break; case 3: std::cout << "Wynik: " << a * b << std::endl; break; case 4: std::cout << "Wynik: " << a / b << std::endl; break; case 5: break; default: std::cout << "Nieprawidlowe polecenie." << std::endl; } } while( Polecenie != 5 ); std::cout << "No to dowidzenia!"; return 0; }
Ad 2: W takim razie jak najskuteczniej sprawdzić czy user wpisał liczbę całkowitą do strumienia i od razu go o tym poinformować zamiast obcinać wszystko co jest po kropce? |
|
pekfos |
» 2013-11-11 12:18:14 Sprawdź następny znak w strumieniu, lub wczytaj całe słowo do stringa, sprawdź poprawność i skonwertuj do inta. |
|
« 1 » |