Beispiel Angabe
Kürzel: | simpleUPN |
Runde: | 4 |
Name: | Simpler UPN Rechner |
Evaluieren als: | Java |
Kette: | Upn-Rechner |
Eingabe: | Interger, String |
Kategorie: | Rechner |
Ausgabe: | Integer |
Mitgelieferte Datei(en):
Abzugebende Datei(en): UpnApplication.java, Stack.java, UpnCalculator.java
Optional abzugebende Datei(en):
Ausführbar: UpnApplication
Die Klasse UpnApplication ist zu erstellen und soll eine
ausführbare Klasse sein und muss daher die public static void main(String args[])
Methode beinhalten.
Ihr Programm wird automatisch auf Korrektheit überprüft.
Die Überprüfung erfolgt durch die Ausführung der als
ausführbar bezeichneten Klasse (UpnApplication).
Kurzbeschreibung:
UPN Rechner mit Grundrechenarten.
Allgemeine Hinweise:
-
Die Groß- und Kleinschreibung ist relevant! Beachten Sie ganz genau die Angaben zu den
Funktions- und Dateinamen.
-
Die abzugebende Datei(en) müssen für die Abgabe ausnahmslos archiviert werden.
Das Format der Archiv muss Zip sein, Programme wie WinZip, WinRar, jar (kommt mit der Java JDK Distribution)
können Sie für die Archivierung verwenden. Dateiendung des Archivs muss .zip oder .jar sein.
jar syntax:
-
Archivierung: jar Mcvf archiv_name.jar * (oder einzelne Dateien statt *)
-
Inhalte anzeigen: jar tf archiv_name.jar
-
Extrahieren: jar xvf archiv_name.jar
-
Ihr Programm darf nur genau jene Ausgabedaten liefern, die in der Spezifikation
verlangt werden. Die Ausgaben Ihres Programms werden automatisch mit
Referenzdaten verglichen; etwaige Abweichungen führen zu Punkteabzügen!
-
Testen Sie Ihr Programm vor der Abgabe mit den mitgelieferten Eingabedateien.
Geben Sie Ihre Lösung erst ab, wenn die Ausgaben Ihres Programms mit der
ebenfalls mitgelieferten Ausgabedatei übereinstimmen! Testen Sie Ihr
Programm auch mit anderen Eingabedaten.
-
Ihr Programm muss immer den Prozess Return Code 0 liefern. Verwenden Sie daher
keine
System.exit(1)
-artige Unterbrechungen in Ihrem Programm.
Am besten verzichten Sie völlig auf System.exit() Aufrufe da dadurch der
laufende JVM gewaltsam terminiert wird.
-
Verwenden Sie die Klasse
Scanner
zum Einlesen von Daten.
Für die Ausgabe können Sie die Methoden System.out.print
und
System.out.println
benutzen. Zum Erzeugen formatierter Ausgaben können
Sie auch System.out.printf
benutzen (wird im Allgemeinen aber nicht benötigt).
Beachten Sie, dass wir bei der Beurteilung einen US-amerikanischen Region- und
Spracheinstellungssatz (locale) f¨r die Beurteilung benutzen.
Das bedeutet, dass wir für die Darstellung von double
-Werten auch bei
der Ein-/Ausgabe immer den Dezimalpunkt (und nicht Beistrich) benutzen
(z.B. 3.14159 und nicht 3,14159). Falls Sie auf Ihrem Rechner eine andere Einstellung haben,
können Sie zum Testen zuhause auch die Darstellung mit Beistrich benutzen (ist aber nicht
konsistent mit den mitgelieferten Ein-/Ausgabe-Paaren) oder beim Aufruf von Java auch folgenden Befehl
benutzen:
java -Duser.language=en -Duser.country=US UpnApplication
Sie werden sehen, dass dann während des Ablaufs des Programmes bei der Eingabe
von double
-Werten eine Darstellung mit Dezimalpunkt erwartet wird.
Wenden Sie sich bei Problemen mit den Ein-/Ausgabefunktionen bitte an die Tutoren im Labor.
-
Programme, die Packages oder Klassen außerhalb der verwendeten Übungsumgebung
(J2SE Development Kit (JDK) 5.0)
verwenden, können von uns nicht getestet und beurteilt werden!
-
Schreiben Sie Ihr Programm möglichst allgemein und kommentieren Sie es
gut. Die Kommentare im Programm gelten als Dokumentation.
Die Dokumentation Ihrer Programme wird ebenfalls beurteilt. Es ist
erlaubt/erwünscht die Kommentare javadoc-konform zu erstellen.
Spezifikationsspezifische Hinweise:
In diesem Beispiel werden Sie eine spezielle Datenstruktur namens Stack benötigen. Ein Stack ist ein Listentyp, bei
dem das zuletzt eingefügte Element, das Erste ist, das gelesen wird. Es wird kann immer nur das zuletzt eingefügte gelesen werden. Sie sollen diesen Stack selbst auf der Basis eines Arrays implementieren. Dieser Stack sollte mindestens 20 Elemente beinhalten können.
Für weitere Informationen lesen Sie bitte:
Wikipedia:
Stacks und
Wikipedia: UPN
Aufgabenstellung:
Lesen Sie die Eingabefolge ein und werten Sie die Befehle aus. Ein UPN Rechner
verwaltet einen Stack, auf den die eingegebenen Zahlen gelegt werden.
Eine Operation nimmt sich zwei Elemente vom Stack, berechnet das Ergebnis und legt
das Ergebnis wieder auf den Stack.
Am Ende der Eingabe geben Sie den Inhalt des Stacks aus. Die Werte sollen als
Integer ausgegeben werden, jeweils getrennt durch ein Zeilenvorschub. Befinden sich
noch mehrere Elemente am Stack, so sollen diese in korrekter Reihenfolge (das
zuletzt auf den Stack gelegte Element als letztes) ausgegeben werden.
Wir empfehlen folgenden Entwurf:
- Eine Klasse
UpnApplication
, die Daten einliest, ausgibt und die Fehlerbehandlung durchführt,
- eine Klasse
UpnCalculator
, die die Funktionalität des Rechners implementiert. Der Rechner soll folgende Funktionen haben:
- eine Methode zum Einlesen eines Operanden. Dieser wird vom Rechner auf seinen Stack gelegt
- eine Methode zum Einlesen eines Operators. Diese Methode nimmt die obersten 2 Operanden vom Stack, berechnet das Ergebnis und legt dieses wieder auf den Stack zurück.
- eine Methode
public String toString()
, die eine lesbare Repräsentation des Stacks des Rechners zurückliefert.
- weitere zu Ihrem Entwurf passende Methoden (z.B. eine Methode die den Fehlerstatus des Rechners liefert).
- eine Klasse
Stack
, die den Stack implementiert. Implementieren Sie den Stack mit Hilfe eines Arrays. Die Klasse Stack soll folgende Methoden besitzen:
public void push(int n)
legt eine ganze Zahl als oberstes Element auf den Stack (oberstes Element)
public int pop()
nimmt das oberste Element vom Stack und liefert es zurück. Falls der Stack leer ist, wird keine Aktion durchgeführt.
public boolean hasNext()
liefert true
wenn noch mindestens ein Element am Stack liegt, sonst false
.
public String toString()
liefert eine lesbare Repräsentation des Stack zurück. In dieser werden die Elemente des Stacks durch Zeilenvorschübe getrennt.
- Dem Konstruktor des Stacks soll die maximale Anzahl der Elemente, die der Stack speichern kann, als Parameterwert übergeben werden können.
Eingabedaten:
Die Eingabe besteht aus Integer-Zahlen und Operationen. Lesen Sie eine Eingabe nach
der anderen ein. Wenn eine Zahl gelesen wurde, wird diese auf den Stack gelegt. Wenn
die Eingabe eine Operation ist, werden die Operanden vom Stack gelesen und das
Ergebnis der Operation auf den Stack gelegt. Danach fahren Sie mit der Verarbeitung
fort. Achten Sie darauf, dass bei mehrstelligen Operationen die Operanden in der
falschen Reihenfolge auf dem Stack liegen (z.B.: 5 6 - bedeutet 5 - 6). Der UPN
Rechner soll die Operationen +,-,* und / beherrschen. Die Eingabe wird mit EOF beendet.
Ausgabedaten:
Bei korrekter Eingabe geben Sie den resultierenden Stack aus. Die Zahlen werden als int ausgegeben!
Fehlerbehandlung:
Enthält der Eingabedatensatz einen ungültigen Datentyp oder einen falschen Operator,
so soll "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgegeben werden.
Falls während der Abarbeitung ein Fehler auftritt (Undefiniertes Ergebnis, zuwenig Operanden,
...) geben Sie "?", gefolgt von einem Zeilenvorschub aus.
Testen:
In |
1 3 5 * +
|
Out |
16
|
Beschreibung |
1+3*5 = 16 |
|
In |
1 2 3
|
Out |
1
2
3
|
Beschreibung |
Resultierender Stack |
|
Bemerkung: Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und
müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie
bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung
können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei
erzeugen:
java UpnApplication < simpleUPN.i1 > simpleUPN.out1
Das erzeugte File simpleUPN.out1 können Sie dann mit
dem mitgelieferten Outputfile simpleUPN.o1 vergleichen.