Es wird immer eine 0 zurückgeliefert
-
Hallo,
wir sollten einen kleinen Taschenrechner bauen und mit goto, switch-case usw. rumspielen. Ich hab dabei folgenden Code:
#include <iostream> using namespace std; int main(){ cout << "\nWillkommen. Ich bin ein Taschenrechner." << endl; cout << "Ich beherrsche die vier Grundrechenarten." << endl; cout << "Sie können auswaehlen: " << endl; //Variablen restart: char eingabe; int funktion; cout << "\t1) 'a' fuer Addition" <<endl; cout << "\t2) 's' fuer Subtraktion" <<endl; cout << "\t3) 'm' fuer Multiplikation" <<endl; cout << "\t4) 'd' fuer Division" <<endl; cout << "\n\tIhre Wahl: "; cin >> eingabe; switch(eingabe){ case 'a' : funktion = 1; break; case 's' : funktion = 2; break; case 'm' : funktion = 3; break; case 'd' : funktion = 4; break; default : cout << "\nSie haben eine falsche Eingabe gemacht."<<endl; goto restart; break; } int x; int y; int result; cout << "\nGeben Sie die erste Zahl ein: " ; cin >> x; cout << "Geben Sie die zweite Zahl ein: "; cin >> y; if(funktion == 1) result = x+y; if(funktion == 2) result = x-y; if(funktion == 3) result = x*y; if(funktion == 4 && (y == 0)){ cout << "\nEine Division ist nicht moeglich. Bitte geben Sie die zweite Zahl erneut ein: "; cin >> y; result = x/y; } else result = x/y; bool weiter; char c; cout << "\nDas Ergebnis ist: " << result <<". Wollen sie erneut rechnen (j/n)?" << endl; cin >> c; if(c == 'j') weiter = true; else weiter = false; if(weiter) goto restart; return 0; }Komischerweise liefert er z.B., wenn ich Addition drücke und dann z.B. x=3 und y=4 mache, als result immer 0...auch in einigen anderen Fällen ist das so. Warum? Ich sehe nirgends einen logischen Fehler...
-
Schau mal genau, was passiert bei den if's. Was wird ausgeführt, was nicht?
Geh da mal mit dem Debugger durch, dann findest du den Logik Fehler.
Kleiner Tipp:
else if ist manchmal sehr nützlich.
-
ok, habs gelöst =). else if ist wirklich gut

-
und tu die verdammten gotos weg... das brauch keine Sau, insbesondere nicht in deinem Anwendungsfall

-
ich weiß ich weiß, die gotos sind hässlich und ich mag sie auch nicht, aber unser prof wollte, dass wir das auch einbauen...er meinte, wir sollen versuchen, alle konzepte einzubauen, die wir an dem tag gelernt haben(ist ein blockkurs c++) und da haben wir halt goto, switch, if, while usw. gelernt.

-
lil_pingu schrieb:
ich weiß ich weiß, die gotos sind hässlich und ich mag sie auch nicht, aber unser prof wollte, dass wir das auch einbauen...er meinte, wir sollen versuchen, alle konzepte einzubauen, die wir an dem tag gelernt haben(ist ein blockkurs c++) und da haben wir halt goto, switch, if, while usw. gelernt.

wenn du while gelernt hast, wirst du auch do-while gelernt haben: also nimm die schleife... sonst hast du die nämlich auch nicht verwendet - und goto braucht man in C++ einfach so gut wie nie - brauchst also auch nicht lernen, wie man es verwendet...
bb
-
unskilled schrieb:
brauchst also auch nicht lernen, wie man es verwendet...
Och.. das würde ich so nicht sagen. Ich finde es lohnt sich durchaus das Konzept zu kennen und zu wissen, warum man es nicht übermässig einsetzen sollte. Und es ist ja nicht gerade viel Aufwand das zu "lernen" und wenn man es mal wirklich braucht, dann weiss man wenigstens, dass es auch noch goto gibt.
Wenn ich goto wirklich brauche (was in der Tat nicht oft ist), dann ist es doch ein ganz nütztliches Sprachfeature.
-
Wenn ich allerdings von meinem Lehrer höre, dass ich das, was wir in der letzten Stunde gelernt haben, nutze (und wir hatten auch schleifen), kann ich mir kaum vorstellen, dass er die Lösung mit label/goto toller findet als die mit do/while...
Ich hab bisher nur einmal goto gesehen, wo ich fand, dass es ne Erleichterung war und so - hatte volkard glaub mal in irgend ner Fkt genommen, die mit irgendwelchen C-APIs arbeitet...
{ R1 a = get_funky_stuff(); if(a == R1_ERROR_CODE) goto end; R2 b = get_very_funky_stuff(a); if(b == R2_ERROR_CODE) goto free_funky; R3 c = get_incredible_stuff(b); if(c == R3_ERROR_CODE) goto free_very_funky; /*...*/ free_incredible_stuff(c); very_free_funky: free_very_funky_stuff(b); free_funky: free_funky_stuff(a); end: }bb
-
unskilled schrieb:
Wenn ich allerdings von meinem Lehrer höre, dass ich das, was wir in der letzten Stunde gelernt haben, nutze (und wir hatten auch schleifen), kann ich mir kaum vorstellen, dass er die Lösung mit label/goto toller findet als die mit do/while...
Habe ich jetzt rein grammatisch nicht ganz verstanden, aber ich wollte nur sagen, dass man sich die 5 Minuten, die es braucht goto zu begreifen ruhig nehmen sollte, weil es durchaus Sinn machen kann und dann ist man froh. Aber man sollte sich dann auch die 20 Minuten nehmen und darüber nachdenken, warum in den meisten Fällen ein goto eben Fehl am Platze ist.
-
unskilled schrieb:
Wenn ich allerdings von meinem Lehrer höre, dass ich das, was wir in der letzten Stunde gelernt haben, nutzen sollen (und wir hatten auch schleifen), kann ich mir kaum vorstellen, dass er [der lehrer] die Lösung mit label/goto toller findet als die mit do/while...
"Habe ich jetzt rein grammatisch nicht ganz verstanden"
jopp, sry - da fehlten 2 wörter
naja, das mit dem nachdenken ist manchmal... komisch 
drakon schrieb:
[...]aber ich wollte nur sagen, dass man sich die 5 Minuten, die es braucht goto zu begreifen ruhig nehmen sollte, weil es durchaus Sinn machen kann und dann ist man froh. Aber man sollte sich dann auch die 20 Minuten nehmen und darüber nachdenken, warum in den meisten Fällen ein goto eben Fehl am Platze ist.
ok - da kann ich mitgehen
bb
-
Ahh.. so macht das natürlich mehr Sinn.

-
drakon schrieb:
Ahh.. so macht das natürlich mehr Sinn.

mir war doch so

gn8^^
-
deshalb nutze ich bei so einem if gefrickel auch immer gerne trotzdem noch die Klammern, ich weiß ich finde das übersichtlicher. und die 4. if-klausel ist etwas
"zu eng".
gehört zur Übersichtlichkeit genauso wie goto, auch wenn goto noch Fehler hervorrufen kann. Bla Bla goto, darüber wurde SOOOOOOO oft diskutiert und das resultat IMMER: NEIN also keine Begründungen bla bla, ist einfach mist (Punkt)
-
Ich programmiere in Scheme, it is the ultimate goto
LAMBDA: The Ultimate GOTO Dort wird das Konzept kritisiert, aber nicht das Sprachkonstrukt. Aber es gibt meist auch bessere Alternativen in Hochsprachen als goto.
-
Du solltest auch die Variablentypen, mit denen du rechnest, auf double umstellen, damit die Division vernünftig funktioniert.