Einen einfachen Taschenrechner programmieren

Taschenrechner mit polnischer Notation

Wesentlich besser und interessanter ist die Umgehung der eval() Funktion und die Programmierung eines eigenen Taschenrechners. Die einfachste Variante ergibt sich aus der Umwandlung des Terms in die sogenannte polnische Notation und anschließende Durchführung der Berechnung. Was kompliziert klingt, ist letztlich eher simpel.

Polnische Notation (Postfix)

Für die Notation von mathematischen Termen hat sich die Infix Schreibweise etabliert. Hierbei wird der Operator (das Rechenzeichen) zwischen die Zahlenwerte (Operanden) geschrieben, z.B. 1+2. Während die Berechnung von Termen mit zwei Operanden auf diese Weise noch sehr leicht zu durchschauen und zu realisieren ist, wird es komplexer, wenn unterschiedliche Operatoren und mehr Zahlenwerte zum Einsatz kommen: 2+3cdot4.

Bei diesem Beispiel ist eine Abarbeitung von links nach rechts nicht trivial möglich, wenn man die Punkt-vor-Strich Regel berücksichtigen möchte, nach der zunächst 3cdot4 zu berechnen sind und dieses Ergebnis anschließend zur 2 hinzuaddiert werden muss. Um dies zu verdeutlichen, kann man auch (eigentlich unnötige) Klammern setzen: 2+(3cdot4).

Die Postfix Notation (oder polnische Notation) sieht vor, dass der Operator hinter die Zahlenwerte vermerkt wird. Das erste Beispiel (1+2) lautet in polnischer Notation somit 1; 2; +. Das zweite, komplexere Beispiel lautet dann (bei Anwendung der korrekten Rechenregeln) 2; 3; 4; *; +.

Liegt die Rechenaufgabe nun in polnischer Notation vor, ist die Berechnung recht simpel:

Von links nach rechts:

  1. ist es eine Zahl, lege sie auf den Stapel
  2. ist es ein Operator, nimm die obersten beiden Werte vom Stapel und wende den Operator darauf an. Lege das Ergebnis auf den Stapel.
  3. ist kein Wert mehr vorhanden, gib den obersten Wert des Stapels als Ergebnis aus

Für das Beispiel sieht dies dann wie folgt aus:

SchrittEingabestringWertStapelAktion
 1 2; 3; 4; *; + 2  lege die 2 auf den Stapel
 2 3; 4; *; + 3 2 lege die 3 auf den Stapel
 3 4; *; + 4 3; 2 lege die 4 auf den Stapel
 4 *; + * 4; 3; 2 nimm die obersten beiden Werte vom Stapel (4 und 3), multipliziere sie (3*4=12) und lege das Ergebnis (12) auf den Stapel
 5++12; 2 nimm die obersten beiden Werte vom Stapel (12 und 2), addiere sie (2+12=14) und lege das Ergebnis (14) auf den Stapel
 6   14 gib den obersten Wert des Stapels (14) als Ergebnis aus

Doch wie kommt man vom Infix Term zur polnischen Notation?

Letztlich ist auch dies vergleichsweise simpel:

Von links nach rechts:

  1. ist es ein Klammer auf ‘(‘, ignoriere es
  2. ist es ein Operator, dann lege ihn auf einen Stapel
  3. ist es eine Zahl, dann hänge sie an die Ausgabe
  4. ist es eine Klammer zu ‘)’, dann nimm den obersten Operator vom Stapel und hänge ihn an die Ausgabe
  5. ist die Eingabe zu ende, dann nimm alle Operatoren vom Stapel und hänge sie an die Ausgabe

Die Klammern sind hier von Bedeutung, da dieser einfache Algorithmus jegliche Rechenregel ignoriert und die Bindung von Zahlen an Operatoren ausschließlich durch die Klammerung berücksichtigt. Punkt-vor-Strichrechnung wird hier (noch) gänzlich ignoriert. Wer also 2cdot3+4cdot5 korrekt berechnen lassen möchte, der muss Klammern in der Eingabe setzen: (2cdot3)+(4cdot5). Eine Zumutung in modernen Zeiten, die in der verbesserten Form des Algorithmus beseitigt wird.

Schreibe einen Kommentar

Nutze dieses Kommentarfeld um deine Meinung oder Ergänzung zu diesem Beitrag kundzutun. Verhalte dich bitte respektvoll und höflich! Kommentare werden vor der Veröffentlichung in der Regel moderiert und bei Verstößen gegen geltendes Recht, die guten Sitten, fehlendem Bezug oder missbräuchlicher Verwendung nicht freigegeben oder gelöscht.
Über die Angabe deines Namens, deiner E-Mail Adresse und deiner Webseite freuen wir uns, doch diese Felder sind optional. Deine E-Mail Adresse wird dabei zu keinem Zeitpunkt veröffentlicht.

Um mit dem Betreiber dieser Seite nicht-öffentlich in Kontakt zu treten, nutze die Möglichkeiten im Impressum.