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

[Lekcja 15] Zadanie domowe, a instrukcja goto

Ostatnio zmodyfikowano 2011-10-11 18:16
Autor Wiadomość
fufelek
Temat założony przez niniejszego użytkownika
[Lekcja 15] Zadanie domowe, a instrukcja goto
» 2011-10-09 18:56:28
Cześć!

Więc napisałem kalkulator w pętli, a teraz chciałbym - jeśli będzie chwilka na to - żeby ktoś przeanalizował mój kod, czy wszystko jest tak jak powinno tzn. chodzi mi o to, żeby nie utrwalić sobie złych nawyków od samego początku.

C/C++
#include <iostream>
using namespace std;
int main() {
    long int wynik;
    float liczba1;
    float liczba2;
    int dzialanie;
   
    bool licz1;
    bool licz2;
    bool dzial;
   
    do {
        start:
        cout << "\n\nWybierz z menu, co chcesz zrobic z kalkulatorem: ";
        cout << "\n\n[0] Wyjscie z programu";
        cout << "\n[1] Dodawanie";
        cout << "\n[2] Odejmowanie";
        cout << "\n[3] Mnozenie";
        cout << "\n[4] Dzielenie";
        cout << "\n\nJaki jest Twoj wybor?: ";
        cin >> dzialanie;
        dzial = cin.good();
        cin.clear();
        cin.sync();
       
        if( dzial == false ) {
            cout << "\n==== Cos tu jest nie tak, zacznij od nowa... ====";
            goto start;
        }
       
        if( dzialanie > 4 ) {
            cout << "\n==== Nie ten numerek, wpisz jeszcze raz! ====";
            goto start;
        }
       
        if( dzialanie == 0 ) {
            cout << "Czy zamknac program?";
            cout << "\n[1] Tak";
            cout << "\n[inny klawisz] Nie";
            cout << "\n: ";
            cin >> liczba1;
            cin.clear();
            cin.sync();
           
            if( liczba1 == 1 ) {
                return 0;
            }
           
            else {
                goto start;
            }
        }
       
        liczbapierwsza:
        cout << "\nWprowadz pierwsza liczbe: ";
        cin >> liczba1;
        licz1 = cin.good();
        cin.clear();
        cin.sync();
       
        liczbadruga:
        cout << "\nWprowadz druga liczbe: ";
        cin >> liczba2;
        licz2 = cin.good();
        cin.clear();
        cin.sync();
       
        if( licz1 == false ) {
            cout << "\n===== Zle wpisana pierwsza liczba, jeszcze raz =====";
            goto liczbapierwsza;
        }
        if( licz2 == false ) {
            cout << "\n===== Zle wpisana druga liczba, jeszcze raz =====";
            goto liczbadruga;
        }
       
        if( dzialanie == 1 ) {
            wynik = liczba1 + liczba2;
            cout << "\n\nWynik dzialania: " << wynik;
            cout << "\n-------------------------------------------------";
        }
        if( dzialanie == 2 ) {
            wynik = liczba1 - liczba2;
            cout << "\n\nWynik dzialania: " << wynik;
            cout << "\n-------------------------------------------------";
        }
        if( dzialanie == 3 ) {
            wynik = liczba1 * liczba2;
            cout << "\n\nWynik dzialania: " << wynik;
            cout << "\n-------------------------------------------------";
        }
        if( dzialanie == 4 ) {
            wynik = liczba1 / liczba2;
            cout << "\n\nWynik dzialania: " << wynik;
            cout << "\n-------------------------------------------------";
        }
    } while( dzialanie != 0 );
   
    return 0;
}

Dzięki za jakiekolwiek uwagi.
P-41884
malan
» 2011-10-09 19:31:41
goto start;
?! O.o Dalej już sprawdzał nie będę - to mi wystarczy. Najpierw popraw to, a potem porozmawiamy o reszcie.
P-41886
SeaMonster131
» 2011-10-09 19:32:21
Pierwsze co rzuca się w oczy to goto! :D Kiedyś też tak pisałem.. Poczytałem trochę o » Kurs C++ » Poziom 2Pętla do ... while lekcja i nigdy więcej do tego nie wróciłem :) I dobrze ;)
Po drugie.. Tzn ja jestem zwolennikiem if'ów zamiast switcha, ale nieraz też dobrze wykorzystać switch zamiast np 5 if'ów ;) » Kurs C++ » Poziom 1Warunek wielokrotnego wyboru switch ... case lekcja
Powodzenia! ;)
P-41887
fufelek
Temat założony przez niniejszego użytkownika
» 2011-10-09 20:03:25
co do "if" to nie mam problemu ze zmiana na "switch" (pierwszy kalkulator z wcześniejszych lekcji zrobiłem jako dwie aplikacje na te dwa sposoby), ale nie za bardzo wiem, co jest zlego w "goto" i jak zastapic to petla. Szukalem rozwiazania dla tego, co chcialem osiagnac i "goto" dalo mi to :)
P-41889
malan
» 2011-10-10 17:42:25
ale nie za bardzo wiem, co jest zlego w "goto"
Tak na poważnie to goto sprawia, iż kod jest nieczytelny - to raz. Dwa - nawet w jakimś kursie czytałem, że nie powinno się cofać goto (jeśli już się go używa) do wcześniejszych instrukcji programu.
P-41907
DejaVu
» 2011-10-10 17:45:24
P-41908
fufelek
Temat założony przez niniejszego użytkownika
» 2011-10-11 18:16:30
Dzięki DejaVu, teraz mam konkrety kiedy użyć goto (w wyjątkowych okolicznościach a głównie tylko w zagnieżdżonych pętlach), a kiedy nie używać (w 99% pisania). No to będę kombinował inaczej :)

pozbyłem się goto, zastąpiłem to pętlą, ale teraz kalkulator nie chce mi nic liczyć, może jutro uda mi się dojść do tego, co tu jest nie tak, ale jeśli ktoś chciałby spojrzeć:

C/C++
/* NIE DZIAŁA !! */
#include <iostream>
using namespace std;
int main() {
    long double wynik;
    float liczba1;
    float liczba2;
    int dzialanie;
   
    bool licz1;
    bool licz2;
    bool dzial;
   
    do {
        do { //pętla dla menu
            cout << "\n\nWybierz z menu, co chcesz zrobic z kalkulatorem: ";
            cout << "\n\n[0] Wyjscie z programu";
            cout << "\n[1] Dodawanie";
            cout << "\n[2] Odejmowanie";
            cout << "\n[3] Mnozenie";
            cout << "\n[4] Dzielenie";
            cout << "\n\nJaki jest Twoj wybor?: ";
            cin >> dzialanie;
            dzial = cin.good();
            cin.clear();
            cin.sync();
           
            if( dzialanie < 0 || dzialanie > 4 || dzial == false ) {
                cout << "\n==== Cos tu jest nie tak, zacznij od nowa... ====";
            }
           
            if( dzialanie == 0 ) {
                return 0;
            }
        }
        while( dzialanie < 0 || dzialanie > 5 );
       
        do {
            cout << "\nWprowadz pierwsza liczbe: ";
            cin >> liczba1;
            licz1 = cin.good();
            cin.clear();
            cin.sync();
            if( licz1 == false ) {
                cout << "\n===== Zle wpisana pierwsza liczba, jeszcze raz =====";
            }
        }
        while( liczba1 = 0 );
       
        do {
            cout << "\nWprowadz druga liczbe: ";
            cin >> liczba2;
            licz2 = cin.good();
            cin.clear();
            cin.sync();
           
            if( licz2 == false ) {
                cout << "\n===== Zle wpisana druga liczba, jeszcze raz =====";
            }
        }
        while( liczba2 = 0 );
       
        switch( dzialanie )
        {
        case 1:
            wynik = liczba1 + liczba2;
            cout << "\nTwoj wynik: " << wynik;
            break;
        case 2:
            wynik = liczba1 - liczba2;
            cout << "\nTwoj wynik: " << wynik;
            break;
        case 3:
            wynik = liczba1 * liczba2;
            cout << "\nTwoj wynik: " << wynik;
            break;
        case 4:
            wynik = liczba1 / liczba2;
            cout << "\nTwoj wynik: " << wynik;
            break;
           
        default:
            cout << "\n\ncos tu chyba jest spaprane, albo to mi sie juz myli... ;)";
        }
    } while( wynik != 0 );
   
    return 0;
}


ok, znalazłem błąd, nie dawało mi to spokoju...
na końcu pętli odpowiedzialnej za podawanie liczb do kalkulatora wpisałem:
while( liczba1 = 0 );
 zamiast przyrownania
while( liczba1 == 0 );
. Tak na marginesie - jak się chwilę pomyśli, to goto nie jest potrzebne ;)
P-41949
« 1 »
  Strona 1 z 1