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

Zadanie 15 poziom 2

Ostatnio zmodyfikowano 2016-07-10 19:40
Autor Wiadomość
neferx
Temat założony przez niniejszego użytkownika
Zadanie 15 poziom 2
» 2016-07-08 23:43:01
Cześć!
W temacie związanym z pętlą do ... while jest zadanie domowe dotyczące kalkulatora. Jego polecenie to:
"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.
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."

Wykonałem zadanie w trochę inny sposób. Proszę odpowiedź czy program może być wykonany tym sposobem, aby spełnił założenia pracy domowej oraz czy wszystko z programem jest w porządku.

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

int main()

{
    int dzialanie;
    float a, b;
    cout << "Kalkulator v0.3" << endl;
    cout << "Witamy!" << endl;
    do
    {
        cin.clear();
        cin.sync();
        cout << "Menu glowne kalkulatora" << endl;
        cout << "[1] Dodawanie" << endl;
        cout << "[2] Odejmowanie" << endl;
        cout << "[3] Mnozenie" << endl;
        cout << "[4] Dzielenie" << endl;
        cout << "[5] Rezygnacja" << endl;
        cout << "Co chcesz zrobic? Wybierz 1,2,3,4 lub 5" << endl;
        cin >> dzialanie;
        switch( dzialanie )
        {
        case 1:
            {
                cout << "Podaj dwie liczby ktore chcesz zsumowac: " << endl;
                cin.clear();
                cin.sync();
                cin >> a;
                bool a_blad = cin.good();
                cin >> b;
                bool b_blad = cin.good();
                if( a_blad == 1 && b_blad == 1 )
                {
                    cout << endl << "Suma tych dwoch liczb wynosi: " << a + b << endl << endl;
                }
                else
                {
                    cout << endl;
                    cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                }
            }
            break;
        case 2:
            {
                cout << "Podaj dwie liczby ktore chcesz odjac: " << endl;
                cin.clear();
                cin.sync();
                cin >> a;
                bool a_blad = cin.good();
                cin >> b;
                bool b_blad = cin.good();
                if( a_blad == 1 && b_blad == 1 )
                {
                    cout << endl << "Roznica tych dwoch liczb wynosi: " << a - b << endl << endl;
                }
                else
                {
                    cout << endl;
                    cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                }
            }
            break;
        case 3:
            {
                cout << "Podaj dwie liczby ktore chcesz pomnozyc: " << endl;
                cin.clear();
                cin.sync();
                cin >> a;
                bool a_blad = cin.good();
                cin >> b;
                bool b_blad = cin.good();
                if( a_blad == 1 && b_blad == 1 )
                {
                    cout << endl << "Iloczyn tych dwoch liczb wynosi: " << a * b << endl << endl;
                }
                else
                {
                    cout << endl;
                    cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                }
            }
            break;
        case 4:
            {
                cout << "Podaj dwie liczby ktore chcesz podzielic: " << endl;
                cin.clear();
                cin.sync();
                cin >> a;
                bool a_blad = cin.good();
                cin >> b;
                bool b_blad = cin.good();
                if( a_blad == 1 && b_blad == 1 )
                {
                    cout << endl << "Iloraz tych dwoch liczb wynosi: " << a / b << endl << endl;
                }
                else
                {
                    cout << endl;
                    cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                }
                break;
            }
        case 5:
            {
                cout << "Do zobaczenia!" << endl;
                Sleep( 1 * 1000 );
            }
            break;
            default:
            cout << "Cos poszlo nie tak!" << endl;
        }
    } while( dzialanie != 5 );
   
}
P-149778
carlosmay
» 2016-07-09 00:30:07
Wykonałem zadanie w trochę inny sposób. Proszę odpowiedź czy program może być wykonany tym sposobem, aby spełnił założenia pracy domowej oraz czy wszystko z programem jest w porządku.
Nie.

Nie ma zabezpieczenia przed niepoprawnymi danymi.
Pobieranie liczb od użytkownika wykonaj przed instrukcją
switch
 (teraz niepotrzebnie powtarzasz tą operację w każdym
case
.
Nie ma zabezpieczenia przed dzieleniem przez zero.
Liczba zero nie kończy działania programu.
P-149779
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-09 00:40:00
No tak, ale jeśli pobiorę liczby od użytkownika przed
switch
, to użytkownik najpierw wybierze liczby, z którymi chce coś zrobić, a dopiero potem wybierze "dzialanie" (sumowanie, mnozenie), prawda?
P-149780
Gibas11
» 2016-07-09 00:55:57
Zrobi to w takiej kolejności w jakiej będziesz chciał, wystarczy odpowiednio użyć std::cin.
P-149781
carlosmay
» 2016-07-09 02:15:57
2. Wprowadź liczbę
3. Wybierz działanie (jeżeli liczba różna od 0)
4. Wykonaj obliczenia (jeżeli liczba różna od 0)

to użytkownik najpierw wybierze liczby, z którymi chce coś zrobić, a dopiero potem wybierze "dzialanie"
Sprawdzi czy liczba nie jest zerem. Od tego zależy, czy wprowadzi działanie.
P-149783
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-09 12:08:13
Nie jestem pewien czy do końca zrozumiałem, ale zrobiłem to tak (wprowadziłem również zabezpieczenie przed dzieleniem przez 0):
C/C++
#include <iostream>
#include <windows.h>
using namespace std;

int main()

{
    int dzialanie;
    float a, b;
    cout << "Kalkulator v0.4" << endl;
    cout << "Witamy!" << endl;
    Sleep( 1300 );
    system( "cls" );
    do
    {
        cin.clear();
        cin.sync();
        cout << "Menu glowne kalkulatora" << endl;
        cout << "[1] Dodawanie" << endl;
        cout << "[2] Odejmowanie" << endl;
        cout << "[3] Mnozenie" << endl;
        cout << "[4] Dzielenie" << endl;
        cout << "[5] Rezygnacja" << endl;
        cout << "Co chcesz zrobic? Wybierz 1,2,3,4 lub 5" << endl;
        cin >> dzialanie;
        if(( dzialanie > 0 ) &&( dzialanie < 5 ) )
        {
            cout << "Dobrze!" << endl;
            cout << "Teraz podaj dwie liczby na ktorych chcesz przeprowadzic dzialanie: " << endl;
            cin.clear();
            cin.sync();
            cin >> a;
            bool a_blad = cin.good();
            cin >> b;
            bool b_blad = cin.good();
            if(( a != 0 ) ||( b != 0 ) )
                 system( "cls" );
           
            {
                switch( dzialanie )
                {
                case 1:
                    {
                        if( a_blad == 1 && b_blad == 1 )
                        {
                            cout << "Suma tych dwoch liczb wynosi: " << a + b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 2:
                    {
                        if( a_blad == 1 && b_blad == 1 )
                        {
                            cout << "Roznica tych dwoch liczb wynosi: " << a - b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 3:
                    {
                        if( a_blad == 1 && b_blad == 1 )
                        {
                            cout << "Iloczyn tych dwoch liczb wynosi: " << a * b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 4:
                    {
                       
                        if(( a_blad == 1 ) &&( b_blad == 1 ) &&( b != 0 ) )
                        {
                            cout << "Iloraz tych dwoch liczb wynosi: " << a / b << endl << endl;
                        }
                        else if( b == 0 )
                        {
                            cout << "Nie dzielimy przez 0!!!" << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 5:
                    {
                        cout << endl << "Do zobaczenia!" << endl;
                        Sleep( 1 * 1000 );
                    }
                    break;
                    default:
                    cout << "Cos poszlo nie tak!" << endl;
                }
            }
        }
        else if( dzialanie == 5 )
        {
            cout << endl << "Do zobaczenia!" << endl;
            Sleep( 1 * 1000 );
        }
        else
        {
            cout << endl << "Wystapil blad! Sprobuj ponownie." << endl;
        }
    } while( dzialanie != 5 );
   
    return 0;
}
@Edit: Poprawiłem kod o automatyczne czyszczenie ekranu konsoli po wprowadzeniu zmiennych.
P-149788
carlosmay
» 2016-07-09 14:40:09
sync()
 nie wszędzie działa. Efektem ubocznym jest czyszczenie bufora strumienia.
Do tego celu służy
ignore()
, lub czyszczenie na piechotę.

Rozwiązanie nie jest zgodne z treścią.

W porównaniach używaj boolowskich wartości:
C/C++
if( a_blad == true && b_blad == true )
 Kod zyska na czytelności.
P-149790
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-09 15:33:56
Teraz?
Swoją drogą myślałem,że
ignore();
 używamy tylko na linuxie.
W takim wypadku
ignore();
 czyści mi całe "menu".
C/C++
#include <iostream>
#include <windows.h>
using namespace std;

int main()

{
    int dzialanie;
    float a, b;
    cout << "Kalkulator v0.4" << endl;
    cout << "Witamy!" << endl;
    Sleep( 1300 );
    system( "cls" );
    do
    {
        cin.clear();
        cin.ignore();
        cout << "Menu glowne kalkulatora" << endl;
        cout << "[1] Dodawanie" << endl;
        cout << "[2] Odejmowanie" << endl;
        cout << "[3] Mnozenie" << endl;
        cout << "[4] Dzielenie" << endl;
        cout << "[5] Rezygnacja" << endl;
        cout << "Co chcesz zrobic? Wybierz 1,2,3,4 lub 5" << endl;
        cin >> dzialanie;
        if(( dzialanie > 0 ) &&( dzialanie < 5 ) )
        {
            system( "cls" );
            cout << "Ok!" << endl;
            Sleep( 800 );
            system( "cls" );
            cout << "Teraz podaj dwie liczby na ktorych chcesz przeprowadzic dzialanie." << endl;
            cin.clear();
            cin.ignore();
            cout << "Podaj pierwsza liczbe: " << endl;
            cin >> a;
            bool a_blad = cin.good();
            cout << "Podaj druga liczbe: " << endl;
            cin >> b;
            bool b_blad = cin.good();
            if(( a != 0 ) ||( b != 0 ) )
                 system( "cls" );
           
            {
                switch( dzialanie )
                {
                case 1:
                    {
                        if( a_blad == true && b_blad == true )
                        {
                            cout << "Suma tych dwoch liczb wynosi: " << a + b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 2:
                    {
                        if( a_blad == true && b_blad == true )
                        {
                            cout << "Roznica tych dwoch liczb wynosi: " << a - b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 3:
                    {
                        if( a_blad == true && b_blad == true )
                        {
                            cout << "Iloczyn tych dwoch liczb wynosi: " << a * b << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 4:
                    {
                       
                        if(( a_blad == true ) &&( b_blad == true ) &&( b != 0 ) )
                        {
                            cout << "Iloraz tych dwoch liczb wynosi: " << a / b << endl << endl;
                        }
                        else if( b == 0 )
                        {
                            cout << "Nie dzielimy przez 0!!!" << endl << endl;
                        }
                        else
                        {
                            cout << "Wystapil blad! Sprobuj ponownie." << endl << endl;
                        }
                    }
                    break;
                case 5:
                    {
                        cout << endl << "Do zobaczenia!" << endl;
                        Sleep( 1 * 1000 );
                    }
                    break;
                    default:
                    cout << "Cos poszlo nie tak!" << endl;
                }
            }
        }
        else if( dzialanie == 5 )
        {
            cout << endl << "Do zobaczenia!" << endl;
            Sleep( 1 * 1000 );
        }
        else
        {
            cout << endl << "Wystapil blad! Sprobuj ponownie." << endl;
        }
    } while( dzialanie != 5 );
   
    return 0;
}
P-149791
« 1 » 2
  Strona 1 z 2 Następna strona