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.
#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. |
|
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. |
|
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 Pętla do ... while 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 ;) Warunek wielokrotnego wyboru switch ... casePowodzenia! ;) |
|
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 :) |
|
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. |
|
DejaVu |
» 2011-10-10 17:45:24 |
|
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ć:
#include <iostream> using namespace std; int main() { long double wynik; float liczba1; float liczba2; int dzialanie; bool licz1; bool licz2; bool dzial; do { do { 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 ;) |
|
« 1 » |