[QUIZ#2] Polnischer Taschenrechner

Quiz #2
Polnischer Taschenrechner

Regeln
Die Regeln und der Ablauf der Quizrunde können wie immer in der entsprechenden Ankündigung eingesehen werden. Bitte lest sie euch aufmerksam durch, da sie alle wichtigen Informationen enthält.

Abgabe
Die Abgabe erfolgt wie immer im Abgabeforum. Abgabefrist ist Sonntag, der 28. September 2008 um ca. 20 Uhr.

Das Problem
Der Suchmaschinenbetreiber Hupf strebt weiter nach der Weltherrschaft und drängt dabei immer mehr auf den Markt mobiler Endgeräte. Als nächster großer Coup ist die Veröffentlichung einer Office-Suite für Handys geplant. Dazu soll auch eine Taschenrechneranwendung namens "Calcoid" gehören.

Im Gegensatz zu den bei vielen Handys schon integrierten Taschenrechnern soll Calcoid nicht eine Operation nach der anderen ausführen, sondern komplette Terme berechnen können. Da es auf üblichen Handys umständlich ist, Klammern zu tippen, soll dabei die klammernfreie polnische Notation zum Einsatz kommen.

Deine Aufgabe ist es nun, die erste Version von Calcoid zu entwickeln[1]. Sie soll Terme in polnischer Notation einlesen, diese auswerten und das Ergebnis ausgeben. Dabei sollen die vier Grundrechenarten + - * / sowie Fließkommazahlen als Operanden unterstützt werden.

[1]: Sie muss natürlich nicht auf einem Handy laufen und kann wie immer in der Programmiersprache eurer Wahl umgesetzt werden.

Erweiterung
Als optionale Erweiterungen stehen euch diesmal mehrere Vorschläge zur Verfügung, von denen ihr beliebig viele umsetzen könnt. Gebt in eurer Lösung bitte mit an, welche ihr implementiert habt.
  • Calcoid soll zusätzlich Variablen unterstützen. Sie können im Term als Operanden auftauchen. Vergesst auch nicht dem Benutzer eine Möglichkeit zu geben, die Variablen zu setzen. Wie das aussehen könnte, seht ihr in der Beispielsitzung.
  • Calcoid soll bei jeder Berechnung zusätzlich zum Ergebnis den Term zur Kontrolle nochmal in der gewohnten Infixnotation ausgeben (hier ist möglicherweise die Verwendung von Klammern notwendig).
  • Calcoid soll zusätzliche Operationen wie Potenzieren, Logarithmieren, Ziehen von Wurzeln, trigonometrische Funktionen etc. unterstützen. Konzipiert das Programm so, dass das Hinzufügen von neuen Operationen (durch einen Programmierer) so einfach wie möglich wird.
  • Überlegt euch selbst eine sinnvolle Erweiterung für Calcoid und implementiert diese. Vergesst bitte nicht, die Erweiterung ausführlich zu dokumentieren.

Beispiele
Beispielsitzung (ohne Erweiterungen):
Code:
> 123
123

> * 6 7
42

> * * + 1 2 + 3 4 2
42

> :quit
Bye.

Beispielsitzung (mit Variablen):
Code:
> 123
123

> _
123

> :vars
_ = 123

> a := * 6 7
42

> b := + a 12
54

> :vars
_ = 54
a = 42
b = 54

> :clear
Ok.

> :vars

> :quit
Bye.
Anmerkung: _ soll eine spezielle Variable sein, die stets das Ergebnis der letzten Berechnung speichert.

Beispielsitzung (mit Infixausgabe):
Code:
> * 6 7
6 * 7 = 42

> + * 1 2 * 3 4
1 * 2 + 3 * 4 = 14

> * + 1 2 + 3 4
(1 + 2) * (3 + 4) = 21

> :quit
Bye.
 

Alexander Schuc

crazy-weasel
Ausgezeichnet. :)

Hoffe wieder auf eine rege Beteiligung, mit einem breit gefächertem Spektrum an Programmiersprachen.. vielleicht kommt da ja auch nochwas neues dazu. :)

Allen Teilnehmern wünsche ich viel Spass!
 

Masterclavat

Erfahrenes Mitglied
Das ist schon mal viel schwerer, als das Quiz von letzter Woche. Schön. :D

Aber kann mir mal jemand diesen Term in Infixschreibweise ausgeben. Ich blick da nicht so durch. :D

Code:
* * + 1 2 + 3 4 2
 
Ich tu mich auch noch schwer. Irgendwie wärs einfacher zu kapieren, wenn die Eingabe von hinten gemacht werden könnte.
Dann wäre es aber keine polnische Notation mehr. Es steht dir natürlich frei, die Eingabe bei der Auswertung durch dein Programm nach Belieben umzuformen.

In eurem Beispiel
Code:
* * + 1 2 + 3 4 2
denk ich zuerst an die 2, wenn ich 2 mal 3 + 4 mal 1 + 2 haben will.
Könntest du das etwas ausführlicher erläutern? Ich verstehe nicht ganz, worauf du hinaus willst bzw. wo genau dein Problem liegt.
 

tecla

Erfahrenes Mitglied
Ich denk an die armen Handy-Benutzer. :)
Ist einfach gewöhnungsbedürftig.
Das vorderste * ist doch die letzte Operation, oder? Und gehört zur 2 die zuhinterst steht, grrhh. D.h. ich muss zuallererst den Operanden eingeben, den ich als letztes abarbeite.

Ich würds wohl einfach schneller umgekehrt checken, weil ich mir die Rechnung im Kopf eben so zurecht leg: 2 mal 3 + 4 mal 1 + 2. Aber egal, ist ja nicht die Aufgabe. ;-) Und verwirrend ist es so oder so..

Könnte man das Beispiel denn auch so eingeben? Das fände ich schon reichlich übersichtlicher:
Code:
* 2 * + 1 2 + 3 4

Oder nicht? Und warum nicht?