Taschenrechner - Klammern
-
Ich werde ein Taschenrechner programmieren.
Aber in etwas komplizierter Weise.
Also eine Eingabe von ungf:1+(2+(3+4)+5)
Ich dachte mir mit einer Rekursion suche ich alle Klammern und rechne sie aus (andere Rechnungstypen kommen noch dazu). Aber leider gehts nicht so wie ich wollte.
void Rekursion(std::string Rechenteil, int beginn) { Rechnen = Rechenteil; int i = beginn; int Klammern = 0; while (i < Rechnen.length()) { i++; char Teil = Rechnen[i-1]; if (Teil == '(') { Klammern++; Klammer_auf[Klammern-1] = i; } if (Teil == ')') { Klammern--; Klammer_zu[Klammern] = i; Teile[Klammern] = Rechnen.substr(Klammer_auf[Klammern],Klammer_zu[Klammern] - Klammer_auf[Klammern]-1); Ergebnis += 1; MessageBox::Show(gcnew String(Teile[Klammern].c_str())); Rekursion(Teile[Klammern], i); } } }
Zuerst wollt ich mir die Anzahl der Rekursionen ausgeben lassen und merke: Ergebnis ist gleich 1.
Er gibt dann als Teile[Klammern] gibt er 3+4. zuerst muss aber 2+(3+4)+5 kommen.
Hat jemand ne idee wie ich da ran gehen sollte ? Also bei Klammer auf bis Klammer zu geht ja nicht immer.EDIT: Globale Variablen:
std::string Rechnen;
std::string Teile[100];
int Klammer_auf[100];
int Klammer_zu[100];
int Ergebnis;da könn ein paar auch in die reku (oder müssen ?) aber zum Prinzip testen sind die erstmal global
-
Das geht auch ohne Rekursion, wenn man Dijkstras Shunting Yard-Algorithmus so anpasst, dass statt der Ausgabepipe ein Zahlenstack für Zwischenergebnisse benutzt wird. Zahlen werden statt in die Ausgabepipe halt auf den Stack gelegt, und wo im ursprünglichen Algorithmus ein Operator vom Stack genommen und in die Ausgabepipe gelegt wird, werden stattdessen die obersten beiden Zahlen auf dem Zahlenstack miteinander verrechnet.
Die Geschichte ist zwar nicht ganz so robust wie ein recdesc-Parser; einige fehlerhafte Ausdrücke werden nicht als solche erkannt (etwa "+ 3 4"), dafür ist sie aber wesentlich einfacher umzusetzen. In der Annahme, dass du das ganze als Übung betrachtest und selbst ausklamüsern willst, gebe ich jetzt mal keinen Code vor, ggf. habe ich sowas aber irgendwo hier rumliegen.
-
Tim06TR schrieb:
Ich werde ein Taschenrechner programmieren. ...
Hat jemand ne idee wie ich da ran gehen sollte ?Hallo Tim,
guckst Du hier - Die Klammern liest die Klasse Factor<T> (s.Link)
-
Oh Gott...
1. Zu meinem Code: man o man, ich werd demnächst erst mal überlegen, bevor ich schreibe, anfänglicher gehts kaum.
2. @Werner_logoff: Nett, aber das ist ja schon ne komplettlösung
RESIST TEMPTATION ... SUCCESSFULL
3. @seldon: Ja das ist was, dass seh ich mir mal an.
4. Ich werd mir übers Wochenende mal was nettes ausdenken.