Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prosty kalkulator (ocena mojej pracy)

Ostatnio zmodyfikowano 2013-11-11 12:18
Autor Wiadomość
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 :)

C/C++
#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":

C/C++
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 :)
P-95981
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
C/C++
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.
P-95982
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 :) ):

C/C++
#include <iostream>

int wczytajLiczbe() {
    int liczba;
    bool liczbaSpraw;
   
    do {
        std::cin >> liczba;
        liczbaSpraw = std::cin.good();
        //std::cout << liczbaSpraw;
        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?
P-95997
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.
P-96009
« 1 »
  Strona 1 z 1