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

Kalkulator C++ z pewnym założeniem

Ostatnio zmodyfikowano 2019-05-28 14:35
Autor Wiadomość
Burzogrzmot
Temat założony przez niniejszego użytkownika
Kalkulator C++ z pewnym założeniem
» 2019-05-28 06:47:32
Jestem totalnym nowicjuszem który pokornie studiuje kolejne lekcje kursu c++. Zaznaczę tylko że wcześniej z programowaniem miałem niewiele do czynienia. Gdy natrafiłem na zadanie domowe "napisz prosty kalkulator" zakasałem rękawy i zacząłem pisać. I wiem że zapewne chodziło o pobieranie zmiennych do obliczeń przy każdym case w switch'u, ale ja uparłem się że chce je pobrać przed switchem. I tak oto powstał mi taki potwór, który teoretycznie działa, ale mam co do niego 2 pytania:

1. Czy da się ten program jakoś uprościć pozostając przy moim założeniu?
2. Czy taka forma będzie bardziej zasobożercza niż w przypadku pobierania zmiennych dopiero na etapie case i tam ich sprawdzanie?

Bardzo dziękuje za każdą odpowiedz. Bardzo mi pomoże w jeszcze lepszym zrozumieniu podstaw :)



C/C++
#include <iostream>
using namespace std;

int main() {
   
    cout << "Witaj w moim kalkulatorku :)" << endl << endl;
    int liczba1;
    do {
        bool brama;
        do {
            cout << "Co chcesz wykonac?" << endl;
            cout << "[1]  Dodawanie" << endl;
            cout << "[2]  Odejmowanie" << endl;
            cout << "[3]  Mnozenie" << endl;
            cout << "[4]  Dzielenie" << endl;
            cout << "[5]  Koniec" << endl << endl;
            cout << "Wprowadz numer czynnosci: ";
            cin >> liczba1;
            bool kontrola = cin.fail();
            brama = kontrola;
            if( kontrola == 1 )
                 cout << endl << "Cos poszlo nie tak." << endl << "Sproboj ponownie." << endl << endl;
           
            cin.clear();
            cin.ignore( 50, '\n' );
           
            if( liczba1 >= 6 )
                 cout << endl << "Spaprales!" << endl << endl;
           
        }
        while( liczba1 > 5 || brama == 1 );
       
        float x;
        float y;
        if( liczba1 == 5 )
             liczba1 = 5;
        else {
            cout << endl << "Wprowadz pierwsza liczbe: ";
            cin >> x;
            bool kontrola1 = cin.fail();
            bool kon1;
            kon1 = kontrola1;
            if( kontrola1 == 1 )
                 cout << endl << "Bledna tresc." << endl << endl;
           
            cin.clear();
            cin.ignore( 50, '\n' );
            cout << "Wprowadz druga liczbe: ";
            cin >> y;
            bool kontrola2 = cin.fail();
            bool kon2;
            kon2 = kontrola2;
            if( kontrola2 == 1 )
                 cout << endl << "Bledna tresc." << endl << endl;
           
            cin.clear();
            cin.ignore( 50, '\n' );
            if( kon1 == 0 && kon2 == 0 ) {
                switch( liczba1 ) {
                   
                case 1:
                    cout << "Twoj wynik: " << x + y << endl << endl;
                    break;
                case 2:
                    cout << "Twoj wynik: " << x - y << endl << endl;
                    break;
                   
                case 3:
                    cout << "Twoj wynik: " << x * y << endl << endl;
                    break;
                   
                case 4:
                    if( y > 0 )
                         cout << "Twoj wynik: " << x / y << endl << endl;
                    else
                         cout << endl << "Nie dziel cholero przez zero!" << endl << endl;
                   
                    break;
                }
               
            }
            else
                 cout << endl << "Cos poszlo nie tak" << endl << endl;
           
        }
       
    } while( liczba1 != 5 );
   
    cout << "Dziekuje i do zobaczenia";
    return 0;
}[ \c pp ]
P-174727
Jacob99
» 2019-05-28 11:20:15
Ad. 1) Przede wszystkim należy usunąć wszystkie
bool
e, one są zupełnie zbędne;
Zamiast nich w razie wystąpienia błędu przerywać/powtórzyć pętlę.

Ad. 2) Nie, nie będzie bardziej zasobożerna. Co więcej, będzie lepsza, bo w kodzie nie będzie tylu powtórzeń.

Nieco uproszczoną formę twojego kodu masz tutaj:

C/C++
#include <iostream>
using namespace std;

int main() {
   
    cout << "Witaj w moim kalkulatorku :)" << endl << endl;
    unsigned short choice = 0;
    float x = 0, y = 0;
    do {
        do {
            cout << "Co chcesz wykonac?" << endl;
            cout << "[1]  Dodawanie" << endl;
            cout << "[2]  Odejmowanie" << endl;
            cout << "[3]  Mnozenie" << endl;
            cout << "[4]  Dzielenie" << endl;
            cout << "[5]  Koniec" << endl << endl;
            cout << "Wprowadz numer czynnosci: ";
            cin >> choice;
            cout << endl;
           
            if( cin.fail() || choice > 5 || choice < 1 )
            {
                cout << "Cos poszlo nie tak." << endl << "Sproboj ponownie." << endl << endl;
                cin.clear();
                cin.ignore( 50, '\n' );
                choice = 0;
                continue;
            }
            break;
        } while( true );
       
        if( choice == 5 )
             break;
        else {
            cout << "Wprowadz pierwsza liczbe: ";
            cin >> x;
            if( cin.fail() )
            {
                cout << "Blad wczytywania" << endl;
                cin.clear();
                cin.ignore( 50, '\n' );
                continue;
            }
            cout << "Wprowadz druga liczbe: ";
            cin >> y;
            if( cin.fail() )
            {
                cout << endl << "Blad wczytywania" << endl << endl;
                cin.clear();
                cin.ignore( 50, '\n' );
                continue;
            }
            switch( choice )
            {
            case 1:
                cout << "Twoj wynik: " << x + y << endl << endl;
                break;
            case 2:
                cout << "Twoj wynik: " << x - y << endl << endl;
                break;
               
            case 3:
                cout << "Twoj wynik: " << x * y << endl << endl;
                break;
               
            case 4:
                if( y > 0 )
                     cout << "Twoj wynik: " << x / y << endl << endl;
                else
                     cout << endl << "Nie dziel cholero przez zero!" << endl << endl;
               
                break;
            }
           
        }
    }
    choice = 0;
    x = y = 0;
   
} while( true );

cout << "Dziekuje i do zobaczenia";
return 0;
}
P-174728
pekfos
» 2019-05-28 11:20:46
Wiele tu nie da się zrobić na tym etapie kursu. Lekcja 17. wprowadza możliwości znacznego uproszczenia tego kodu.

Drobne uwagi:
C/C++
if( liczba1 == 5 )
     liczba1 = 5;
Co to?
C/C++
bool brama;
do {
    cout << "Co chcesz wykonac?" << endl;
    cout << "[1]  Dodawanie" << endl;
    cout << "[2]  Odejmowanie" << endl;
    cout << "[3]  Mnozenie" << endl;
    cout << "[4]  Dzielenie" << endl;
    cout << "[5]  Koniec" << endl << endl;
    cout << "Wprowadz numer czynnosci: ";
    cin >> liczba1;
    bool kontrola = cin.fail();
    brama = kontrola;
    if( kontrola == 1 )
         cout << endl << "Cos poszlo nie tak." << endl << "Sproboj ponownie." << endl << endl;
   
    cin.clear();
    cin.ignore( 50, '\n' );
   
    if( liczba1 >= 6 )
         cout << endl << "Spaprales!" << endl << endl;
   
}
while( liczba1 > 5 || brama == 1 );
liczba1 nie ma znaczenia, jeśli brama == 1, więc zamiast wprowadzać dodatkową zmienną brama możesz użyć liczba1 do zasygnalizowania błędu.
C/C++
if( cin.fail() )
{
    cout << endl << "Cos poszlo nie tak." << endl << "Sproboj ponownie." << endl << endl;
   
    cin.clear();
    cin.ignore( 50, '\n' );
    liczba1 = 100;
}
else
if( liczba1 > 5 )
     cout << endl << "Spaprales!" << endl << endl;
Powinieneś też zabezpieczać się przed za małymi wartościami. Użytkownik może podać 0 lub ujemną wartość.
P-174729
Burzogrzmot
Temat założony przez niniejszego użytkownika
» 2019-05-28 14:35:06
Dziękuje bardzo za wszystkie uwagi i sugestie. Kolejne bool'e tworzyłem po to by zapamiętywały wartość cin.fail() bo zauważyłem że od razu po cin.clear() warunek był true. Ale nie wiedziałem że ignore można wsadzić bezpośrednio co if(). Jak widać moje myślenie nie jest jeszcze właściwe.
P-174730
« 1 »
  Strona 1 z 1