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

[C++] Lekcja 15 Zadanie domowe KALKULATOR

Ostatnio zmodyfikowano 2014-08-16 17:21
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[C++] Lekcja 15 Zadanie domowe KALKULATOR
» 2014-08-15 23:09:01
Wyczytalem w Gręboszu o fonkcji goto i tak mi została, że nie mogę nic innego wymyśleć.
Jak mozna goto zastąpic?
Jest w case 5: żeby wyskoczyc na koniec programu (realizuje rezygnuj).

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

int main()
{
    float liczba;
    float wynik = 10;
   
    do
    {
        cout << "wynik = " << wynik << endl;
        cout << "Wprowadz liczbe: ";
        cin >> liczba;
        int x;
       
        if( liczba != 0 )
        {
            cout << "\nDostepne opcje:\n\n [1] dodawanie\n [2] odejmowanie\n";
            cout << " [3] mnozenie\n [4] dzielenie\n [5] rezygnuj\n\n";
            if( liczba != 0 )
            {
                cout << "Wybierz dzielanie:\n";
                cin >> x;
               
                switch( x )
                {
                case 1:
                    cout << wynik << " + " << liczba << " = " << wynik + liczba << endl;
                    break;
                case 2:
                    cout << wynik << " - " << liczba << " = " << wynik - liczba << endl;
                    break;
                case 3:
                    cout << wynik << " * " << liczba << " = " << wynik * liczba << endl;
                    break;
                case 4:
                    cout << wynik << " / " << liczba << " = " << wynik / liczba << endl;
                    break;
                case 5:
                    goto konczymy;
                   
                   
                default:
                    cout << "Wprowadz poprawne oznacznie działania\n";
                    break;
                }
            }
        }
    } while( liczba != 0 );
   
    cout << "Podales liczbe 0.\n\n";
    konczymy:
   
    cout << "Konczymy\n\n";
   
    system( "pause" );
    return 0;
}
P-115549
1aam2am1
» 2014-08-15 23:13:06
0 to koniec 5 jest niepotrzebne
P-115550
carlosmay
Temat założony przez niniejszego użytkownika
» 2014-08-15 23:24:35
Trymałem się zamysłu autora, stąd ta 5-tka.
wiem, że goto nie jest wskazane w użyciu, więc powstał temat.
P-115552
1aam2am1
» 2014-08-15 23:46:57
powiem tak przeanalizuj program wychodzi dla zero to wpisz tam pięć i usuń instrukcjie goto to beędzie rezygnacja
P-115554
Jacob99
» 2014-08-16 11:25:50
Zamiast
goto
 napisz
break;
. Btw. Grębosz w Symfonii C++ Standard odradza używania
goto
.
P-115561
kubek3898
» 2014-08-16 14:12:57
@up

Może się mylę, ale wydaje mi się, że samo break nie spowoduje opiszczenia pętli. Ja zrobiłbym to tak:

C/C++
bool koniec = false;
//...
do
{
    //...
case 5:
    koniec = true;
    break;
    //...
} while( liczba != 0 && !koniec )

if( koniec )
{
    cout << "Zrezygnowales";
}
else {
    cout << "Wcisnales 0";
}

@edit x2

I zastanawia mnie jeszcze po co autor tematu umieścił dwa razy taki sam warunek if, zaraz jeden po drugim.

@edit x3

Kolejnym rozwiązaniem może być rzucenie wyjątku ;)
P-115572
carlosmay
Temat założony przez niniejszego użytkownika
» 2014-08-16 16:46:56
C/C++
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float liczba;
    float wynik = 10;
    bool koniec;
    do
    {
        cin.clear();
        cin.sync();
        cout << "wynik = " << wynik << endl;
        cout << "Wprowadz liczbe: ";
        cin >> liczba;
        int x;
        if( liczba != 0 & cin.good() )
        {
            cout << "\nDostepne opcje:\n\n [1] dodawanie\n [2] odejmowanie\n";
            cout << " [3] mnozenie\n [4] dzielenie\n [5] rezygnuj\n\n";
            cout << "Wybierz dzialanie:\n";
            cin >> x;
            if( x >= 1 || x <= 5 )
            {
               
                switch( x )
                {
                case 1:
                    cout << "Dodawanie\n" << wynik << " + " << liczba << " = " << wynik + liczba << endl << endl;
                    break;
                case 2:
                    cout << "Odejmowanie\n" << wynik << " - " << liczba << " = " << wynik - liczba << endl << endl;
                    break;
                case 3:
                    cout << "Monzenie\n" << wynik << " * " << liczba << " = " << wynik * liczba << endl << endl;
                    break;
                case 4:
                    cout << "Dzielenie\n" << wynik << " / " << liczba << " = " << wynik / liczba << endl << endl;
                    break;
                case 5:
                    koniec = true;
                    break;
                   
                }
            }
           
        }
        else cout << "Dane wejsciowe nieprawidlowe!\n\n";
       
    } while( liczba != 0 & !koniec );
   
    if( koniec )
         cout << "Rezygancja.\n\n";
    else
         cout << "Podales liczbe 0.\n\n";
   
    cout << "Konczymy\n\n";
   
    system( "pause" );
    return 0;
}

Run-Time Check Failure #3 - The variable 'koniec' is being used without being initialized.

Run-Time Check Failure #3 - The variable 'koniec' is being used without being initialized.

Zamiana 0 na 5 nie powoduje wyjścia z pętli.
Break zamiast goto także.
kubek3898: najciekawsza podpowiedź. W Code::Blocks działa bez zarzutów, jednak w Visual C++ wykrzykuje jak w logu.
Kompiluje się, ale zawsze z ostrzeżeniem.
P-115580
kubek3898
» 2014-08-16 16:49:51
Spróbuj przy definicji zmiennej ją również zainicjalizować:

C/C++
bool koniec = false;

@edit

Masz zły operator:

} while( liczba != 0 & !koniec );

nie masz używać operatora sumy bitowej '&' tylko operatora koniunkcji '&&'
P-115581
« 1 » 2
  Strona 1 z 2 Następna strona