Die vierte Programmieraufgabe

Was ist UPN?
Aufgabendetails
Die Stack-Klasse

Ihr sollt in dieser Woche ein Taschenrechner-Applet schreiben. Der Clou dabei ist, dass es sich nicht um einen ganz gewöhnlichen Taschenrechner handeln soll, sondern um einen, der (ausschließlich) Umgekehrt Polnische Notation (UPN) beherrscht.

Es ist wichtig, dass ihr diesen Text hier bis zum Ende durchlest (und versteht natürlich). Bei Unklarheiten fragt einfach einen von uns.

Was ist UPN?

Umgekehrt Polnische Notation (UPN, englisch: Reverse Polish Notation (RPN)) ist eine Postfixnotation von mathematischen Ausdrücken. Im Gegensatz zur herkömmlichen Schreibweise (Infixnotation) wird dabei der Operator (etwa "+") hinter seinen Operanden eingegeben (statt in die Mitte):
  3 4 +
    
Dadurch entfällt die Notwendigkeit von Klammern, denn infix
  (3 + 4) * 5
ist jetzt in UPN
  3 4 + 5 *
Auch ist die Auswertung solcher Ausdrücke durch einen Computer sehr viel einfacher zu programmieren als für Infixnotation (deshalb ist es ja eine Übungsaufgabe). Man benötigt lediglich einen genügend großen Stack, auf den man die Zahlen pusht, die der Benutzer eingibt. Wenn der Benutzer dann eine Operator-Taste klickt (wie '+'), werden entsprechend viele Zahlen vom Stack gepopt, miteinander verrechnet und das Ergebnis wieder auf den Stack gepusht, usw. Wenn nicht mehr genügend Zahlen für eine Operation vorhanden sind, gibt der Rechner eine Fehlermeldung aus.

Den Stack bekommt ihr übrigens von uns unten geschenkt.

Historisch ist UPN durch Taschenrechner von Hewlett Packard sehr populär geworden. Auch heute noch schätzen manche Leute (wie Olaf) die einfache und problemlose Eingabe von UPN-Ausdrücken in den Taschenrechner. Andere Anwendungen von UPN sind die Programmiersprachen Forth und Postscript.

Aufgabendetails

Schreibt ein Applet für einen UPN-Rechner, das aus den gleichen Bestandteilen bestehen sollte wie unser Beispielapplet, aber nicht genau so aussehen muss.

Dein Browser kann das Java-Applet nicht ausführen, daher hier nur ein Bild:
Bild vom Taschenrechner

Allerdings gibt es ein paar Dinge, die (mindestens) sein müssen:

Tipp: Benutzt für eine schöne Benutzeroberfläche am besten ein (hierarchisches) Arrangement von Panels, die ja alle ihren eigenen LayoutManager haben können. Also Panels stecken in Panels stecken in Panels stecken ...
Beispiel:

      Panel p1 = new Panel();
      p1.setLayout(new BorderLayout());
     
      Panel p2 = new Panel();
      p1.setLayout(new GridLayout(3, 1);  // three rows, one column
      // ... fill p2 ...

      Panel p3 = new Panel();
      // No layout set explicitely.
      // ... fill p3 ...

      p1.add("West", p2);
      p1.add("East", p3);
      p1.add("Center", someOtherPanel);
      // etc.

Die Stack-Klasse

Damit ihr unsere Stack-Klasse (für doubles) benutzen könnt müsst ihr sie zunächst für euch sichtbar machen. Das geht mit einem einmaligen
  cp -r ~co1-001/stack ~/programs/program4
Das erzeugt euch in ~/programs/program4/ ein zusätzliches Verzeichnis stack, in das ihr aber nichteinmal reinschauen braucht, um diese Aufgabe zu programmieren.

Zum Benutzen der der neuen Klasse müsst ihr am Anfang eures Applet zusätzlich ein

  import stack.*;
machen. Dann ist alles ganz einfach, zum Beispiel:
  Stack stack = new Stack(30);    // New stack with room for 30 entries.
  stack.push(1.5);
  stack.push(0.0);
  stack.push(23.21);

  // Get whole stack as one multi-line string and display it in our textArea.
  textArea.setText(stack.toString());

  // Pop and print everything:
  while(!stack.isEmpty())
  {
     outputArea.append("in stack: " + stack.top() + "\n"); // Look at topmost item.
     stack.pop();    // Remove from stack.
  }  
Eine genaue Dokumentation der Stack-Klasse ist vorhanden, ebenso wie alle Quellcodes.
[zurück zur CoMa-Seite]
Olaf Jahn
Last modified: Mon Nov 22 10:08:46 MET 1999