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

Rozdział 15. Pętla do... while - kalkulator

Ostatnio zmodyfikowano 2014-08-20 12:08
Autor Wiadomość
Saiunkoku
Temat założony przez niniejszego użytkownika
Rozdział 15. Pętla do... while - kalkulator
» 2014-07-31 16:03:23
Cześć,
W rozdziale 15. jest zadanie domowe o treści:

Napisz prosty kalkulator, który będzie potrafił dodawać, odejmować, mnożyć i dzielić. Program ten ma działać następująco:
1. Wypisuje obecny wynik
2. Wprowadź liczbę
3. Wybierz działanie (jeżeli liczba różna od 0)
4. Wykonaj obliczenia (jeżeli liczba różna od 0)
5. Wróć do kroku 1.
6. Jeżeli wprowadzoną liczbą jest 0, zakończ program.
Przykładowe menu wyboru działania:
[1] Dodawanie
[2] Odejmowanie
[3] Mnożenie
[4] Dzielenie
[5] Rezygnuj
Zabezpiecz wcześniej napisany kalkulator przed podawaniem niepoprawnych liczb i operacji. Wykorzystaj wiedzę zdobytą z pierwszego zadania pracy domowej niniejszego rozdziału. Zabezpiecz również w analogiczny sposób przed możliwością wyboru nieprawidłowego działania.

Tutaj mój kod:
C/C++
#include <iostream>
using namespace std;

int main()
{
    float a;
    float b = 0;
    int dzialanie;
    do
    {
        cout << "\nObecny stan to: " << b << endl;
        cout << "Wprowadź liczbę (0, by zakończyć): ";
        cin >> a;
        cin.clear();
        cin.ignore( 1000, '\n' );
        if( cin.good() && a != 0 )
        {
            cout << "Wybierz działanie: \n" << "[1] Dodawanie\n" << "[2] Odejmowanie\n" << "[3] Mnożenie\n" << "[4] Dzielenie\n" << "[5] Rezygnuj\n";
            cin >> dzialanie;
            cin.clear();
            cin.ignore( 1000, '\n' );
            switch( dzialanie )
            {
            case 1:
                cout << b << "+" << a << "=" << b + a;
                b = b + a;
                break;
            case 2:
                cout << b << "-" << a << "=" << b - a;
                b = b - a;
                break;
            case 3:
                cout << b << "*" << a << "=" << b * a;
                b = b * a;
                break;
            case 4:
                cout << b << "/" << a << "=" << b / a;
                b = b / a;
                break;
            case 5:
                break;
            default:
                cout << "Nie wybrałeś działania\n";
                break;
            }
           
        } else
             cout << "Nie wprowadziłeś liczby lub wybrałeś 0\n";
       
    } while( a != 0 );
   
    cout << "Wprowadziłeś 0, kończymy zabawę\n";
    return 0;
   
}

Generalnie działa on tak jak chcę, poza jedną rzeczą. Mianowicie, kiedy wprowadzam jakąś literę, zamiast liczby, pętla do... while kończy działanie. W warunku mam a!=0, takie działanie mam rozumieć, że pętla czyta błędny znak jako 0 i się kończy?
Jeżeli tak, to czy ma ktoś może pomysł na to, jak edytować kod, aby po wpisaniu nieprawidłowego znaku, pętla zaczęła działać od nowa, zamiast przechodzić dalej?
(Teoretycznie nie ma tego w treści zadania, ale trochę się nad tym namęczyłam i mnie to męczy :))
P-114766
pekfos
» 2014-07-31 16:17:29
0 to ma być zarezerwowana wartość do zakończenia działania kalkulatora. Błędne dane wejściowe powodują wyzerowanie zmiennej, więc program zakończy się niezależnie od tego, co dokładnie się stało. Użyj zera tylko do kończenia pracy kalkulatora, a good() do określania, czy dane wejściowe były poprawne. Aktualne użycie good() w tym kodzie nie ma sensu.
P-114768
Saiunkoku
Temat założony przez niniejszego użytkownika
» 2014-07-31 16:51:07
Hm, w sumie to tak planowałam, przy czym nie bardzo rozumiem w jaki sposób w takim razie użyć tego good(), aby pętla się nie kończyła.
P-114774
pekfos
» 2014-07-31 17:08:36
Najprościej: nie używaj tego tam.
C/C++
do
{
    int liczba;
    //tu pętla wczytująca.
   
    if( liczba == 0 )
         break;
   
    //tu już liczba jest poprawna i niezerowa. Nic tylko coś z nią zrobić..
}
while( true );
P-114776
Saiunkoku
Temat założony przez niniejszego użytkownika
» 2014-07-31 17:26:13
Edytowałam, jednak nadal działa tak jak na początku, czyli kiedy wybiorę literę zamiast liczby, to kończy pętle i cały program, zamiast wracać na początek pętli (do ponownego wyboru liczby).
P-114777
1aam2am1
» 2014-07-31 17:30:17
Kłania się obsługa wyjątków. Wpisanie litery do zmiennej liczbowej kończy się wyjątkiem, który trzeba przechwycić.
http://pl.wikibooks.org/wiki/C++/Obs%C5%82uga_wyj%C4%85tk%C3%B3w

Nie jest to domyślne zachowanie, ale ja tak kiedyś zrobiłem i podziałało. Miałem podobny problem.
P-114778
pekfos
» 2014-07-31 17:36:05
Pokaż aktualny kod.

Kłania się obsługa wyjątków. Wpisanie litery do zmiennej liczbowej kończy się wyjątkiem, który trzeba przechwycić.
http://pl.wikibooks.org/wiki/C++/Obs%C5%82uga_wyj%C4%85tk%C3%B3w
Od kiedy to domyślne zachowanie..?
P-114779
Saiunkoku
Temat założony przez niniejszego użytkownika
» 2014-07-31 17:42:29
C/C++
#include <iostream>
using namespace std;

int main()
{
    float b = 0;
    int dzialanie;
    do
    {
        float a;
        cout << "\nObecny stan to: " << b << endl;
        cout << "Wprowadź liczbę (0, by zakończyć): ";
        cin >> a;
        cin.clear();
        cin.ignore( 1000, '\n' );
        if( a == 0 )
             break;
       
        cout << "Wybierz działanie: \n" << "[1] Dodawanie\n" << "[2] Odejmowanie\n" << "[3] Mnożenie\n" << "[4] Dzielenie\n" << "[5] Rezygnuj\n";
        cin >> dzialanie;
        cin.clear();
        cin.ignore( 1000, '\n' );
        switch( dzialanie )
        {
        case 1:
            cout << b << "+" << a << "=" << b + a;
            b = b + a;
            break;
        case 2:
            cout << b << "-" << a << "=" << b - a;
            b = b - a;
            break;
        case 3:
            cout << b << "*" << a << "=" << b * a;
            b = b * a;
            break;
        case 4:
            cout << b << "/" << a << "=" << b / a;
            b = b / a;
            break;
        case 5:
            break;
        default:
            cout << "Nie wybrałeś działania\n";
            break;
        }
       
    } while( true );
   
    cout << "Wprowadziłeś 0, kończymy zabawę\n";
    return 0;
   
}
P-114780
« 1 » 2
  Strona 1 z 2 Następna strona