C++ Taschenrechner programmieren mit mehreren Zahlen = 1+2+3*2.....

4 Antworten

Ich habe noch nie mit C++ gearbeitet, aber es gibt doch bestimmt auch dort sowas wie Arrays, das ist sozusagen eine Ansammlung von vielen Variablen in einer.


Stef4n  05.08.2013, 17:39

viel zu umständlich und kompliziert.

0

Das eleganteste ist die Umgekehrte Polnische Notation: Der Operator (also +, - , *, /, usw.) steht dabei hinter all seinen Operanden (das müssen nicht zwangsläufig zwei sein!). Der Operator "weiß", wieviele Operanden er hat (+ hat z.B. zwei).

Dein Beispiel würde in UPN also lauten:

 1 2 + 3 2 * +

Zur Verdeutlichung mal mit Klammern (die aber unnötig sind!):

 ((1 2 +) (3 2 *) +)  

http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation

Das Schöne daran: Die Klammern sind überflüssig, eine Operatorpräzedenz (wie "Punkt vor Strich") auch. Und das Killerfeature: Das Ganze ist als interpretierte Stackmaschine super schnell (und vor allem vollständig!) zu implementieren!

Du implementierst einen Stack, auf den man nur oben etwas drauflegen ("push") bzw. wegnehmen ("pop") kann. Zahlen im Ausdruck werden direkt gepusht (quasi als Immediate-Operanden eines push-Operators). Operatoren poppen soviele Operanden, wie sie eben konsumieren, und pushen das Ergebnis der Operation.

Beispiel:

Stackinhalt sei der Ausdruck

 1 2 + 3 2 * +

Dieser wird der Reihe nach abgearbeitet, also:

push 1 ### Stackinhalt danach: [1]  
push 2 ### Stackinhalt danach: [1 2]  
+      ### Stackinhalt danach: [3]  
push 3 ### Stackinhalt danach: [3 3]  
push 2 ### Stackinhalt danach: [3 3 2]  
*      ### Stackinhalt danach: [3 6]  
+      ### Stackinhalt danach: [9] 

9 ist das korrekte Endergebnis!

Ein Interpreter für eine Stackmaschine ist ganz simpel z.B. als Subroutine Threaded Code zu implementieren.

en.wikipedia.org/wiki/Stack_machine

en.wikipedia.org/wiki/Threaded_code


Stef4n  05.08.2013, 17:39

mag ja für einen programmierer so einfacher sein, aber für einen Taschenrechner unbrauchbar, da die Leute damit ja auch umgehen können sollen und die obige Schreibweise nunmal Standard ist.
Außerdem ist das verwerten eines normalen Zahlenstrings auch nicht besonders schwer.

0
ArchEnema  05.08.2013, 22:33
@Stef4n

So wie die Frage klingt ist das keine Hausaufgabe, sondern ein Übungs-/Spaßprojekt. Da muss niemand mit umgehen können.

Außerdem gibt es Taschenrechner die genau so funktionieren. Und man muss sich dann auch für unäre Operatoren wie Wurzel- oder trigonometrische Funktionen nicht eine extra Eingabeart ausdenken. Klammern (die bei billigen Modellen fehlen und so die Rechenschritte unnötig einschränken) braucht man auch nicht.

0

Das geht natürlich, so ein Parser ist in C++ aber nicht auf die Schnelle mit 5 Zeilen Code geschrieben. Ich glaub, Arrays braucht man dafür nicht zwangsläufig. Eine Idee wäre es, dass man den String zunächst nach '*' und '/' durchsucht und bei einem Fund die Zahl davor und danach auszuliest und die Berechnung durchzuführen. Wenn es keine Punktrechnungen im String mehr gibt, macht man das gleiche mit '+' und '-' nochmal. Wenn da noch Klammern drin vorkommen sollen, dann muss jeder Klammerausdruck von innen nach aussen einzeln verarbeitet werden.

Angenommen, du hast den Eingabestring 1+2+3*2, dann müsstest du daraus also nacheinander

  • 1+2+3*2
  • 1+2+6
  • 3+6
  • 9

machen.


Stef4n  05.08.2013, 17:45

+1
Am besten arbeitet man mit Funktionen. Z.B. so:
Funktion Rechne bekommt den String mit der Gleichung, sucht zu erst nach Klammern, findet sie welche, übergibt sie den Inhalt wieder an Rechne (ruft sich also selbst auf) und ersetzt ihn dann durch das Ergebnis (inklusive der Klammern).
Anschließend wird mal und geteilt gerechnet und dann + und minus solange diese Zeichen vorhanden sind. Dafür könnte man jeweils eine eigene Funktion machen, aber da der ablauf großteils der gleiche ist, macht es sinn eine funktion zu nehmen.
wenn funktionen wie sinus auch behandelt werden sollen, dann sollte man diese am besten zuerst behandeln (noch vor den Klammern).

0

Die Antwort mit dem Array ist richtig, Du musst aber auch die Rechenregeln berücksichtigen (Mul vor Add, Klammern, ....)!!!!!