Wie goto elegant vermeiden?
-
entweder
double ergebnis(char *rechenzeichen, double zahl1, double zahl2) { switch(*rechenzeichen) //dereferenzieren //..
oder
double ergebnis(char rechenzeichen, double zahl1, double zahl2) { switch(rechenzeichen) //..
-
Korrekt:
int main() {...}
"return 0;" am Ende ist überflüssig.label: //... goto label;
ist eine Endlosschleife.
Alternativen:for(;;){ //... }
while(true){ //... }
Alle Möglichkeiten sind o.k., Befreiung bei for und while mit "break;"
Bei goto:label: if( !condition ) goto done; //... goto label; done: //...
Bei diesen zwei goto's wird bereits die "Verknäulung" sichtbar, der berüchtigte Spagetti-Code, den man bis in die 80'er Jahre (z.B. in BASIC auf C64) geschrieben hat und den man heute vermeidet. Nachteilig ist auch das ständige Erfinden neuer Label-Namen (Assembler-Programmierer kennen das).
siehe auch: http://www.math.uni-wuppertal.de/~axel/skripte/oop/oop5_4.html
-
@Erhard: Kewl, die Überschrift lautet "Wie elegant goto vermeiden" und du erklärst wie man es verwendet...
-
Es wurde doch auch for und while gezeigt, und vor allem, warum goto schnell verzwickt wird.
-
Erstmal vielen Dank für die Antworten, aber ich habe noch eine Frage:
Das Programm sollten wir im Unterricht erstellen, also wusste ich genau was es können sollte und das es nicht erweitert werden würde.
Was spricht denn in diesem Falle gegen 2 gut platzierte Gotos?
Als mein lehrer das gesehen hatte ist er erstmal "ausgeflippt" (ich denke das trifft es), dass goto hat gereicht um zu sagen spagetti code und er hat sich den restlichen code gar nicht mehr angesehen.Ich programmiere schon länger bin aber der Meinung das bei sehr kleinen Programmen wie diesem hier, die garantiert nicht erweitert werden, ruhig 1-2 gotos SINNVOLL verwendet werden dürfen.
Danach hab ich mir mal den sourcecode meiner mitschüler angesehen und meiner war viel viel leichter zu kapieren und viel viel kürzer.
Was mich nervt ist dieses goto verteufeln, klar bei großen programmen nutze ich es nie, aber dennoch k**** es mich langsam an.
-
Gast0001 schrieb:
Erstmal vielen Dank für die Antworten, aber ich habe noch eine Frage:
[...] ruhig 1-2 gotos SINNVOLL verwendet werden dürfen.
Danach hab ich mir mal den sourcecode meiner mitschüler angesehen und meiner war viel viel leichter zu kapieren und viel viel kürzer.
Was mich nervt ist dieses goto verteufeln, klar bei großen programmen nutze ich es nie, aber dennoch k**** es mich langsam an.
Schau dir den Code von Code-Hacker han... die Schleife ist auf den ersten
Blick sichtbar... nicht so wie bei deinem...
"goto" und "sinnvoll" schliessen sich aus..
in deinem Fall sparrst du nicht mal Tippzeit, weil ein "while(1)" kuerzer ist
Verwende einfach niemals goto... dann hast du weder mit den Lehrern Problem, noch mir uns, noch mit deinem Code :p
-
Na gut ihr habt gewonnen´
-
such mal nach goto in Rund um die Programmierung Forum, da gibt es sehr viele intersante meinung
z.b. kann goto wieder in werden
-
Habs umgebaut
#include <iostream.h> #include <time.h> #include <stdlib.h> #include <math.h> double zahl1, zahl2, benutzerergebnis; char rechenzeichen, antwort; double ergebnis() { switch(rechenzeichen) { case '+': return zahl1+zahl2; case '-': return zahl1-zahl2; case '*': return zahl1*zahl2; case '/': return (ceil((zahl1/zahl2)*10))/10; // Rundung auf eine Nachkommastelle } } void main() { srand((unsigned)time(NULL)); do { zahl1 = rand()%20+1; zahl2 = rand()%20+1; cout<<"Bitte Rechenart waehlen\n"; cout<<"-----------------------\n"; cout<<"Addition +\n"; cout<<"Substraktion -\n"; cout<<"Multiplikation *\n"; cout<<"Division /\n"; cout<<"-----------------------\n"; cout<<"Ihre eingabe "; cin>>rechenzeichen; do { cout<<"\n"<<zahl1<<rechenzeichen<<zahl2<<"= ?\n"; cout<<"Errechnen sie das Ergebnis: "; cin>>benutzerergebnis; if(benutzerergebnis == ergebnis()) { cout<<"Richtig errechnet\n"; } else { cout<<"Falsch errechnet!\n"; } }while(benutzerergebnis != ergebnis()); cout<<"\n"; // Wegen der Uebersicht }while(benutzerergebnis == ergebnis()); }
Also ihr könnte sagen was ihr wollt, die 2 while schleifen machen fast genau das gleiche wie das goto, sie sitzen an den selben stellen, vom endpunkt wird zum anfangspunkt gesprungen ...
wie ein umgewandeltes goto
-
Das die Schleifen das selbe machen ist logisch, aber das Programm ist übersichtlicher, wesentlich übersichtlicher. Außerdem ist ein weiterer Nachteil von goto, außer der übersichtlichkeit, dass es schwer auffindbare Fehler erzeugen kann und solange sich ein goto vermeiden lässt, tut man dieses auch. goto ist vllt. dann nützlich, wenn aus einer tief verschachtelten Schleifenkonstruktion an deren Ende verzweigt werden soll.
Code-Hacker