Mini Taschenrechner
-
Es geht nicht darum sich ueber Anfaenger lustig zu machen, hat er auch nicht. Er hat lediglich mal
seinedie Gedanken vieler zusammengefasst.helenchen schrieb:
Nur weil ich fehlerhaften Code poste heißt es nicht ,dass ich faul bin.
Doch, genau das heisst es. Denn du weisst genau, dass muemmel gleich wieder vorbeikommt und dir das Flaeschchen gibt. Haettest du
deinen code einfach mal selbst durch den compiler gejagt, haette er dir naemlich**tmp.cpp:21:5: error: function definition is not allowed here
**gesagt.helenchen schrieb:
[...] deswegen bin ich hier um das Programmieren in C++ richtig zu lernen.
Das halte ich ebenfalls fuer ein starkes Geruecht, waere dem so, wuerdest du auch mal was davon umsetzten was muemmel dir zuwirft.
Sobald ein bisschen eigeninitiative deinerseits notwendig ist, passiert nichts; und muemmel posted dir den kompletten code.
-
habe alles ausgegoogelt verstehe nicht warum Compiler mit getOperator Funktion Probleme hat . Er sagt:
main.cpp:48:16: error: invalid conversion from 'int (*)()' to 'int' [-fpermissive
]
int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; int getOperator(); while (cin >> op && op != ';', ')') { switch (op) { case '+': rval = getOperator; lval += rval; break; case '-': rval = getOperator; lval -= rval; break; case '*': rval = getOperator; lval *= rval; break; case '/': rval = getOperator; lval /= rval; break; } return lval; } }
PS: Keinen fertigen Code posten sondern nur Ratschlag
bin übrigens ne Russin aus Kasachstan, deswegen Grammatikprobleme
-
Hi Helenchen,
eigentlich hast Du meine Hinweise nicht beachtet, sonst würde Dein Programm jetzt laufen.
Daher noch mal die Fehler zusammengefasst:warte ist jetzt OK.
Main müsste auch OK sein.
Getoperator:
Die Funktion ist überflüssig, und Du kannst auch nicht in einer Funktion eine weitere definieren.Getoperand:
Keine Parameter für Getoperand nehmen. die beiden Variablen am Anfang der Funktion definieren.
wenn of ='(' dann return rechne();
sonst operand von cin einlesen und mit return zurückgeben.
Nach dem else-Zweig nichts weiterrechne:
int Getoperator(){...} muss weg.
die schleife als reine Endlosschleife gestalten while( 1 ) oder for( ; ; )
in der while-Schleife zuerst op von cin einlesen.
in der switch-Auswahl 6 Fälle:
neben +, -, * und / noch
';' und ')', da nur einfach return lval;
Nach switch nichts mehr.und benutze endlich mal das von mir vorgeschlagene Formatiertool oder formatiere selbst von Hand richtig. Du kannst nicht erwarten, dass ich mir sonen unformatierten Müll reinziehe. Wenn Du in Zukunft nicht formatierst werde ich mir das nicht mehr angucken.
Gruß Mümmel
-
Hi alle anderen,
nein, ich liefere nicht gleich wieder einen fertigen Quelltext.
Am Anfang war das erst mal notwendig, damit Helenchen begreift, was ich meine.
Aber ich will mir nicht nur selbst auf die Schulter klopfen, sondern Helenchen helfen, dass sie die nächsten Prüfungen hinbekommt. Da kann ich nicht nur fertige Arbeit rüberreichen. Für den Anfang hab ich ihr eine Vorlage gemacht, und nun muss sie das selber hinbekommen, Ich meckere da nur was noch falsch ist und gebe Hinweise wie es (aus meiner Sicht) sein müsste.
Spätestens wenn es über den Rand den ich noch im Kopf habe hinaus geht, kann ich ihr sowieso nicht mehr allzu viel helfen. Also muss sie bis dahin so weit sein, dass sie sich dann selber helfen kann. Aber dabei kann ich ihr nur helfen. Den entscheidenden Schritt muss sie selber tun. Ich hoffe, wenn ich meine Grenze erreicht habe (bin seit über 10 Jahren überwiegend Delphi-Programmierer), werden sich hoffentlich andere finden die dann mit mehr Wissen weiterhelfen. Aber auch dazu muss Helenchen noch selber was beitragen.
Da ich schon vorher wusste, dass sie nicht aus Deutschland ist hab ich über das eine oder andere hinweggesehen. Das hätten aber auch andere am Stil ihres Deutsch erkennen können.Gruß Mümmel
-
Meine Lösung mit code formater formatiert , bisschen selbst schön nachgerückt.
Hoffe es geht, wenn nicht bescheid sagen .Das Programm selbst gibt 1 ständig aus.
Ich nehme an etwas mit der Funktion Rechne stimmt nicht bzw ich habe etwas missverstanden.
Suche morgen wieder nach dem Fehler.#include <iostream> #include <stdexcept> using namespace std; void warte() { string x; cin.ignore(); getline(cin, x); } int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; while (cin >> op && op != ';', ')') { switch (op) { case '+': lval += rval; break; case '-': lval -= rval; break; case '*': lval *= rval; break; case '/': lval /= rval; break; case ';': break; case ')': break; return lval; } } } int getoperand() { int operand; char op; cin >> op; if (op == '(') { rechne(); } else { int operand; cin.unget(); cin >> operand; } return operand; } int main() { try { while (1) { cout << "Rechenausdruck (mit +,-,*,/, Ende mit ;) " << endl; // wie z.B. 2*3+4; cout << "Ergebnis: " << rechne << endl; warte(); } return 0; } catch (const runtime_error& re) { cerr << "Fehler: " << re.what() << endl; warte(); return -1; } }
-
Hi Helenchen,
Du hast keinen meiner Tips berücksichtigt. Ich hatte geschrieben, was Du wo ändern sollst.
Und formatieren mit der Einstellung file damit die öffnende Klammer vorne steht.Gruß Mümmel
-
Hi Helenchen,
wenn Du meine Hinweise von 23:28 Uhr auf Deine Version von 17:44 Uhr anwendest, dann läuft das Programm.
Noch ein Hinweis: in main nicht rechne sondern rechne( ) nach cout ausgebenGruß Mümmel
-
Hier ist mein Code mit File formatiert und per Hand, hoffe es gefällt ihnen
#include <iostream> #include <stdexcept> using namespace std; void warte() { string x; cin.ignore(); getline(cin, x); } int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; while (1) { while (cin >> op) { switch (op) { case '+': lval += rval; break; case '-': lval -= rval; break; case '*': lval *= rval; break; case '/': lval /= rval; break; case ';': return lval; break; case ')': return lval; break; } } } } int getoperand(int operand, char op) { cin >> op; if (op == '(') { rechne(); } else { cin.unget(); cin >> operand; return operand; } return operand; } int main() { try { while (1) { cout << "Rechenausdruck (mit +,-,*,/, Ende mit ;) " << endl; // wie z.B. 2*3+4; cout << "Ergebnis: " << rechne() << endl; warte(); } return 0; } catch (const runtime_error& re) { cerr << "Fehler: " << re.what() << endl; warte(); return -1; } }
leider das Ergebnis ist nicht korrekt, liefert nach Eingabe immer Null.
Nach Ursache habe ich gesucht , habe versucht mich an die Hinweise zu halten.
Irgendwo vermute im rechne Funktion in switch case Block ist mir ein Fehler unterlaufen. Letzen beiden cases mit zwei mal return lval gefallen mir nicht.Kann es vielleicht sein, das die beiden returns sich gegenseitig auslöschen?
-
Hi Helenchen,
ich schreibe mal am einfachsten gleich meine Kommentare in Deine Quelle rein.
helenchen schrieb:
Hier ist mein Code mit File formatiert und per Hand, hoffe es gefällt ihnen
// hier im Forum sagen wir Du.
// zumindest die Formatierung ist besser geworden, aber nicht so viele Leerzeilen reinbauen.#include <iostream> #include <stdexcept> using namespace std; void warte() { string x; cin.ignore(); getline(cin, x); } int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; /* Zuerst wird lval mit //hatte irrtümlich hier rval geschrieben lval = getoperator(); eingelesen. Dann kommt eine Endlosschleife while ( 1 ) oder for (;;) Du hast also lval nicht vorher eingelesen */ while (1) { /* in der Schleife wird zuerst op von cin eingelesen es steht nichts da, dass Du op gleich rudelweise einlesen sollst, also das while weg, nur einfach einlesen */ while (cin >> op) { /* ab hier würde es jetzt weiter gehen */ switch (op) { case '+': /* rval =getoperator(); lval += rval; break; Du musst schon rval vorher einlesen, wenn Du es auswerten willst */ lval += rval; break; case '-': /* bei den anderen ebenso */ lval -= rval; break; case '*': lval *= rval; break; case '/': lval /= rval; break; /* die beiden case kanst Du direkt hintereinander schreiben. dann gilt der Rumpf für beide. und nach dem Return brauchts auch kein break mehr, weil du da schon weg bist. case ';': case ')': return lval; */ case ';': return lval; break; case ')': return lval; break; } /* die überflüssige Klammer vom unnötigen while weg */ } } } int getoperand(int operand, char op) { cin >> op; if (op == '(') { /* wenn of ='(' dann return rechne(); Du sollst rechne nicht nur aufrufen, sondern das Ergebnis gleich zurück geben */ rechne(); } else { cin.unget(); cin >> operand; return operand; } /* Nach dem else-Zweig nichts weiter an der Stelle ist also nichts mehr zu tun, also raus damit */ return operand; } int main() { try { /* warum hier noch ne Endlosschleife, die wird nur in Rechne gebraucht. hier sollte das Programm nach einmal rechnen enden also weg mit dem while( 1 ) */ while (1) { cout << "Rechenausdruck (mit +,-,*,/, Ende mit ;) " << endl; // wie z.B. 2*3+4; cout << "Ergebnis: " << rechne() << endl; warte(); } return 0; } catch (const runtime_error& re) { cerr << "Fehler: " << re.what() << endl; warte(); return -1; } }
leider das Ergebnis ist nicht korrekt, liefert nach Eingabe immer Null.
Nach Ursache habe ich gesucht , habe versucht mich an die Hinweise zu halten.
Irgendwo vermute im rechne Funktion in switch case Block ist mir ein Fehler unterlaufen. Letzen beiden cases mit zwei mal return lval gefallen mir nicht.so isses, da haben die Fehler gesteckt.
Kann es vielleicht sein, das die beiden returns sich gegenseitig auslöschen?
nein, das würden die nie tun, solche fFerkeleien machen returns nicht.
Du siehst, es stand alles weiter oben schon mal da.
Ich hoffe, ich hab nichts übersehen.
arbeite dieKommentare von mir ein und versuchs noch mal.Gruß Mümmel
-
Unendliches Ergebnis 0 Problem:
#include <iostream> #include <stdexcept> using namespace std; void warte() { string x; cin.ignore(); getline(cin, x); } int getoperand(void); int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; lval = getoperand(); while (1) { cin >> op; switch (op) { case '+': lval = getoperand(); lval += rval; break; case '-': lval = getoperand(); lval -= rval; break; case '*': lval = getoperand(); lval *= rval; break; case '/': lval = getoperand(); lval /= rval; break; case ';': case ')': return lval; } } } int getoperand() { char op; cin >> op; if (op == '(') { return rechne(); } else { int operand; cin.unget(); cin >> operand; return operand; } } int main() { try { cout << "Rechenausdruck (mit +,-,*,/, Ende mit ;) " << endl; // wie z.B. 2*3+4; cout << "Ergebnis: " << rechne() << endl; warte(); return 0; } catch (const runtime_error& re) { cerr << "Fehler: " << re.what() << endl; warte(); return -1; } }
-
I'm finished . Funktioniert alles . Hier ist Endversion von meinen Mini_Taschenrechner:
#include <iostream> #include <stdexcept> using namespace std; void warte() { string x; cin.ignore(); getline(cin, x); } int getoperand(void); int rechne() { char op{ ' ' }; signed int lval{ 0 }; signed int rval{ 0 }; lval = getoperand(); while (1) { cin >> op; switch (op) { case '+': rval = getoperand(); lval += rval; break; case '-': rval = getoperand(); lval -= rval; break; case '*': rval = getoperand(); lval *= rval; break; case '/': rval = getoperand(); lval /= rval; break; case ';': case ')': return lval; } } } int getoperand(void) { char op; cin >> op; if (op == '(') { return rechne(); } else { int operand; cin.unget(); cin >> operand; return operand; } } int main() { try { cout << "Rechenausdruck (mit +,-,*,/, Ende mit ;) " << endl; // wie z.B. 2*3+4; cout << "Ergebnis: " << rechne() << endl; warte(); return 0; } catch (const runtime_error& re) { cerr << "Fehler: " << re.what() << endl; warte(); return -1; } }