Übung 09: OOP und dynamische Datenstrukturen Abgabetermin: 10. 1. 2006 Name: Gruppe: Matrikelnummer: G1 (Löberbauer) Aufgabe Aufgabe 09.1 G2 (Prähofer) G3 (Prähofer) Punkte gelöst abzugeben schriftlich abzugeben elektronisch Korr. 12 Beschreibung in Prosa Java-Programm Java-Programm Pkte Java-Programm Testspezifikation und Ergebnisse Aufgabe 09.2 12 Beschreibung in Prosa Java-Programm Testfälle und Ergebnisse Aufgabe 09.1: Dynamische Datenstrukturen Gegeben seien folgende zwei Klassen List und Node zur Repräsentation von einfach-verketteten linearen Listen mit int-Werten: class List { Node head; // first node in list public List() { … } … } // List class Node { int val; // value in node Node next; // next node in list public Node(int v) {…} public Node(int v, Node n) {…} … } // Node Vervollständigen Sie die beiden Konstruktoren und implementieren Sie in der Klasse List folgende Methoden: - void prepend(int val): fügt den Wert val vorne in die Liste ein, - void append(int val): fügt den Wert val hinten in die Liste ein, - boolean sorted(): stellt fest, ob die Werte der Knoten der Liste aufsteigend sortiert sind, - void insert(int val): fügt den Wert val in eine sortierte Liste an der richtigen Stelle ein, sodass die neue Liste wieder sortiert ist, - delete(int val): Löscht den Wert val aus der Liste. Bei mehrfachem Vorkommen des Wertes sollen alle Knoten mit Wert val aus der Liste gelöscht werden, - String toString(): liefert eine Zeichenkette mit den Werten der Knoten, durch Beistriche voneinander getrennt, - List duplicate(): liefert ein Duplikat der Liste (auch alle Knoten der Liste werden dupliziert) und - void merge(List l): fügt in die sortierte Liste (this) alle Knoten der sortierten Liste l sortiert ein und entfernt diese aus der Liste l, sodass die Liste l nach dem Aufruf der Methode merge leer ist. Testen Sie Ihre Methoden ausführlich, auch für Fehlerfälle. Stellen Sie dazu eine ausführliche Testspezifikation auf. Aufgabe 09.2: Familienstammbaum Realisieren Sie ein Programmsystem zum Aufbau und zur Repräsentation eines Familienstammbaums. Dazu implementieren Sie folgende Klassen: - Person sei eine abstrakte Basisklasse, in der die Gemeinsamkeiten von männlichen und weiblichen Personen implementiert sind - Male ist die Klasse der männlichen Personen - Female sei die Klasse der weiblichen Personen Realisieren Sie Beziehungen zwischen Personen mittels Objektreferenzen (bzw. mittels Arrays von Referenzen). Die folgende Abbildung zeigt die Klassen mit den Beziehungen zwischen den Objekten. Dabei bedeutet [min,max], dass zu mindestens min und höchstens max Objekten eine Beziehung besteht (d.h. es ist angenommen, dass eine Person höchstens 20 Kinder hat und es ist weiters möglich, dass zu einer Person der Vater und die Mutter nicht gesetzt sind). [0,20] children Person [0,1] mother father [0,1] Male [0,1] husband wife [0,1] Female Um den Stammbaum aufzubauen und zu verändern, implementieren Sie Methoden für: - das Heiraten eines Mannes und einer Frau, wobei dadurch Mann und Frau durch Objektreferenzen miteinander verbunden werden - eine Frau bekommt ein männliches oder ein weibliches Kind, wobei der Ehemann Vater wird. Erlauben Sie Abfragen über die familiären Beziehungen, z.B. Kind-Eltern, Ehepartner, Geschwister etc. Implementieren Sie dazu Methoden für Abfragen im Stammbaum, wie z.B. Female getMother(), Person[] getChildren, Male getWife(), Person[] getSiblings() etc. Implementieren Sie Methoden String getName() und String toString(), um auf den Namen und eine Beschreibung einer Person zu erhalten. Verwenden Sie bei toString die Möglichkeit mit super() die Methode der Basisklasse aufzurufen. Implementieren Sie geeignete Konstruktoren für die Klassen. Verwenden Sie dabei die Möglichkeit mit this() einen anderen Konstruktor der selben Klasse und mit super() einen Konstruktor der Basisklasse aufzurufen. Testen Sie Ihr Programm, indem Sie in der main-Methode einen Stammbaum aufbauen, dann Abfragen durchführen und die Ergebnisse auf der Konsole ausgeben (d.h. Sie brauchen keinen Benutzerdialog schreiben). Hinweise: - Überlegen Sie genau, welche Variablen und welche Methoden in welchen Klassen am besten implementiert werden. - Sie brauchen keine weiteren Sonderfälle, wie z.B. unehelicher Kinder oder gleichgeschlechtliche Ehepaare, berücksichtigen.