Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2007 W
| Ausgabe: | 06.12.2007 |
| reguläre Abgabe: | 13.12.2007, 12:45 Uhr |
| nachträgliche Abgabe: | 20.12.2007, 12:45 Uhr |
*
/ \
+ trunc
/ \ \
3 5 2.7
Ausdrücke in Baumform können ausgewertet werden, indem in jedem
Teilbaum zuerst die Argumente und danach die Operation im Wurzelknoten
ausgewertet werden (3 + 5 -> 8, trunc(2.7) -> 2, 8 * 2 -> 16). Bei den
binären Operationen müssen die beiden Operanden und das Ergebnis vom
selben Typ sein (ganze Zahlen oder Gleitkommazahlen), bei der unären
Operation trunc ist der Operand eine Gleitkommazahl und das Ergebnis
eine ganze Zahl, bei der unären Operation int2float ist der Operand
eine ganze Zahl und das Ergebnis eine Gleitkommazahl. Stimmen die Typen
der Operanden nicht überein, ist das Ergebnis einer Auswertung eine
spezielle ungültige Zahl (z.B. ergibt trunc(2) -> ungültige Zahl).
Definieren Sie ihre eigene Klassenhierarchie zur Darstellung von
Zahlen mit einem Obertyp Number
und den Untertypen MyInteger
(ganze Zahlen), MyFloat
(Gleitkommazahlen) und NotaNumber
(ungültige Zahl). Diese Klassenhierarchie kann in Zukunft beliebig
erweitert werden, d.h. sowohl Number
selbst als auch alle Untertypen
von Number
können weitere Untertypen haben.
Entwickeln Sie Java-Klassen bzw. Interfaces zur Darstellung von Knoten
von Ausdrücken in Baumform. Es werden eigene Knotentypen für jeden
Operator (+, *, trunc, ...) benötigt. Alle Typen zur Knotendarstellung
müssen mindestens eine Methode mit dem Namen eval
besitzen, die den
Wert des durch den Baum dargestellten Ausdrucks berechnet.
Bei Blattknoten liefert sie den gespeicherten Wert vom Typ Number.
Andere Knoten müssen das Ergebnis aus den Operanden (Teilbäumen)
berechnen. Dabei ist darauf zu achten, dass bei Addition und
Multiplikation nur gleiche Operandentypen erlaubt sind. Sonst liefert
die Berechnung eine ungültige Zahl (NotaNumber). Ein gültiges Ergebnis
liefert trunc
nur, wenn der Operand eine Gleitkommazahl ist, und
int2float
nur, wenn der Operand eine ganze Zahl ist. Der Wert eines
Blattknotens soll jederzeit durch einen anderen Wert (auch von einem
anderen Typ) ersetzt werden können.
Die Klasse Test
soll die wichtigsten Normal- und Grenzfälle (nicht
interaktiv) überprüfen und die Ergebnisse in allgemein verständlicher
Form in der Standardausgabe darstellen. Unter anderem sollen Bäume aus
ganzen Zahlen und Gleitkommazahlen und mit mindestens den Operationen
+, *, trunc und int2float erstellt und ausgewertet werden. Es sollen
auch Bäume ausgewertet werden, die als Ergebnis eine ungültige Zahl
liefern.
instanceofoder
getClassverwenden. Versuchen Sie, statische Typinformation zu verwenden, wo immer dies möglich ist, und setzen Sie dynamische Typabfragen und Typumwandlungen sparsam ein.
Lassen Sie sich durch den Begriff Baum
nicht verwirren: Es werden nur
Typen für Knoten von Bäumen benötigt, und es soll nicht überprüft werden,
ob die erzeugten Strukturen wirklich Bäume sind.
Gruppe/Aufgabe7. Das Programm soll von diesem Verzeichnis aus durch
java Testaufrufbar sein. Schreiben Sie (abgesehen von geschachtelten Klassen) nicht mehr als eine Klasse in jede Datei. Das Verzeichnis soll zu den Abgabezeitpunkten alle .java-Dateien enthalten, die Sie für Ihre Lösung benötigen. Bitte entfernen Sie alle .java-Dateien, die nicht zur Abgabe gehören. Dateien mit anderen Endungen werden bei der Beurteilung nicht berücksichtigt. Verzichten Sie auf die Verwendung von Verzeichnissen innerhalb von
Gruppe/Aufgabe7.