Beispiel Angabe
Kürzel: | ExtendCalc |
Runde: | 7 |
Name: | Erweiterbarer UPN-Rechner |
Evaluieren als: | Java |
Kette: | Upn-Rechner |
Eingabe: | Double,String |
Kategorie: | Rechner |
Ausgabe: | Double |
Mitgelieferte Datei(en): InvalidParameterException.java, UPNOperation.java, operations.jar, UPNRechner.java
Abzugebende Datei(en): InvalidOperationException.java, Rechner.java, Main.java
Optional abzugebende Datei(en):
Ausführbar: Main
Die Klasse Main 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 (Main).
Kurzbeschreibung:
Implementieren eines erweiterbaren UPN Rechners.
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 Main
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:
Um Ihr Programm auszuführen, können Sie die mitgelieferten Operationen-Klassen in operations.jar verwenden.
Entpacken Sie dazu alle enthaltenen *.class-Dateien in Ihr Arbeitsverzeichnis, oder führen
Sie das Programm mittels java -classpath $CLASSPATH:operations.jar Main bzw. unter Windows
mittels java -classpath %CLASSPATH%;operations.jar Main aus.
Aufgabenstellung:
Schreiben Sie die Klasse Rechner, die das Interface UPNRechner implementiert. Weiters soll eine ausführbare Klasse Main, die die Klasse Rechner benutzt, programmiert werden.
Die Klasse Main soll folgendes tun:
- Ein Objekt der Klasse Rechner instanzieren.
- Das Rechner-Objekt mit allen vordefinierten Operationen "befüllen".
Verwenden Sie hier die Methode addOperation des Rechners. Übergeben werden dieser Methode Objekte der vordefinierten Klassen (siehe Tabelle unten), die UPNOperation implementieren. Die Klassen, die Sie selbst in Runde 4 implementiert haben, werden im Archiv operations.jar mitgeliefert, und sind daher nicht zu programmieren.
- Danach soll die Klasse Main den mit Operationen befüllten Rechner für Berechnungen benutzen. Dazu sollen Daten (Operanden und Operatoren in UPN-Notation) wie üblich eingelesen werden, eine entsprechende Fehlerbehandlung durchgeführt werden.
Dann werden die Operanden und Operatoren an den Rechner weitergegeben (wie beim Bedienen eines UPN-Taschenrechners). Dazu verwenden Sie die Methoden des Rechners:
- enterNumber: Operand wird eingegeben.
- enterOperation Operation wird ausgeführt
- Dann soll vor Beenden des Programms die verlangte Ausgabe (Ergebnis) ausgegeben werden. Dazu muss eine entsprechende Methode des Rechners programmiert werden. Beachten Sie wie immer die Fehlerfälle bei der Eingabe.
Operationen, die Ihr Rechner beherrschen soll (die Klassen werden bereits mitgeliefert):
Symbol | Operation | Klassenname |
+ | Addition | AddOperation |
- | Subtraktion | SubOperation |
* | Multiplikation | MulOperation |
/ | Division | DivOperation |
^ | Potenz (a^b) | PowOperation |
inv | Invers (1/x) | InvOperation |
sin | Sinus | SinOperation |
cos | Cosinus | CosOperation |
Die Rechner-Klasse selbst soll die übergebenen Operationen-Objekte verwalten (z.B. Array o. Collection o. HashMap). Weiters müssen die eingegebenen Operanden verwaltet werden (Stack). Bei Eingabe einer Operation wird diese unter Verwendung des entsprechenden Objektes ausgeführt.
Eingabedaten:
Die Eingabe besteht aus Zahlen und Operationen. Lesen Sie eine Eingabe nach der anderen ein. Wenn
eine Zahl gelesen wurde, wird diese als Double auf den Stack gelegt. Wenn die Eingabe eine Operation
ist, soll diese Operation sofort ausgeführt werden.
Ausgabedaten:
Am Ende der Eingabe geben Sie den Inhalt des Stacks aus. Die Werte sollen als Double ausgegeben werden,
jeweils getrennt durch ein Leerzeichen. Befinden sich noch mehrere Elemente am Stack, so sollen diese
in korrekter Reihenfolge (das unterste Element des Stacks als Erstes) ausgegeben werden.
Fehlerbehandlung:
Enthält der Eingabedatensatz einen ungültigen Datentyp oder einen falschen Operator, so "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgegeben werden. Falls während der Abarbeitung
ein Fehler auftritt (Division durch 0, Stack leer, ...) geben Sie "?", gefolgt von einem
Zeilenvorschub aus.
Testen:
In |
10 0.0 /
|
Out |
?
|
Beschreibung |
Division durch 0 |
|
In |
1.0 4.2 plus 3
|
Out |
FALSCHE EINGABE
|
Beschreibung |
plus ist kein Operator |
|
In |
1 2 3 -4.4 5 6 - + * /
|
Out |
1.0
-0.12345679012345677
|
Beschreibung |
|
|
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 -cp ".;operations.jar" Main < ExtendCalc.i1 > ExtendCalc.out1
(Unter Linux und Mac OS müssen Sie alle Strichpunkte im Classpath durch Doppelpunkte ersetzen)
Das erzeugte File ExtendCalc.out1 können Sie dann mit
dem mitgelieferten Outputfile ExtendCalc.o1 vergleichen.