Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2007 W

6. Übungsaufgabe

Thema:

gebundene Generizität

Termine:

Ausgabe: 29.11.2007
reguläre Abgabe: 06.12.2007, 12:45 Uhr
nachträgliche Abgabe: 13.12.2007, 12:45 Uhr

Abgabeverzeichnis:

Aufgabe6

Programmaufruf:

java Test

Grundlage:

Skriptum bis Seite 111

Aufgabe

Welche Aufgabe zu lösen ist:

Ändern und erweitern Sie Ihre Lösung der 5. Aufgabe entsprechend folgenden Vorgaben:

Die generische Klasse Tree ähnelt der gleichnamigen Klasse aus Aufgabe 5. Wie in Aufgabe 5 sind die Typen der Bezeichnungen von Kanten und Knoten durch Typparameter bestimmt, aber Bezeichnungen für Knoten (nicht von Kanten) müssen eine Boolesche Methode better unterstützen. Ein Aufruf von x.better(y) liefert true wenn eine Knotenbezeichnung x auf nicht näher bestimmte Weise besser ist als eine Knotenbezeichnung y. Anders als in Aufgabe 5 kann eine Kante von einem Knoten mit der Bezeichnung x zu einem mit der Bezeichnung y nur eingefügt werden, wenn x.better(y) als Ergebins true liefert. Die Methode zum Einfügen von Kanten und Knoten gibt einen Booleschen Wert zurück, der besagt, ob Kante und Knoten eingefügt wurden.

Das (vermutlich generische) Interface Better beschreibt die Boolesche Methode better, die in Tree benötigt wird.

Instanzen des Typs Computer bieten Methoden zur Abfrage einiger Kennzahlen von Computern. Benötigt werden Informationen zu Hauptspeicher- und Festplattengrößen sowie zur Laufzeit eines bestimmten (nicht näher bekannten) Programms. Die Methode better vergleicht zwei Computer und liefert true, wenn this in mindestens einer abfragbaren Kennzahl besser und in keiner Kennzahl schlechter ist als das Argument von better. Zusätzliche, nur in Untertypen von Computer abfragbare Kennzahlen gehen nicht in better ein. Folgende Untertypen von Computer werden benötigt: Laptop erlaubt zusätzlich die Abfrage der Bildschirmgröße und der Batterielaufzeit, und Server unterstützt die Abfrage des Stromverbrauchs.

Wie in Aufgabe 5 soll es, außer auf die hier und in Aufgabe 5 beschriebenen Methoden sowie Standardmethoden wie equals und toString, keinerlei Zugriffsmöglichkeiten von außen geben, auch nicht von Unterklassen aus oder zu Testzwecken.

Die Klassen ISTree und CTree aus der 5. Aufgabe werden in der 6. Aufgabe nicht benötigt und sollen weggelassen werden.

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. Die durchzuführenden Überprüfungen sind vorgegeben und in der gegebenen Reihenfolge durchzuführen:

  1. Erzeugen Sie eine Instanz von Tree mit mehreren Ebenen (das heißt, der Baum soll neben dem Wurzelknoten und den Blattknoten auch innere Knoten enthalten), wobei Bezeichnungen von Kanten vom Typ Laptop und jene von Knoten vom Typ Server sind. Dieselben Bezeichnungen von Knoten und Kanten können auch mehrfach im Baum vorkommen. Versuchen Sie auch Kanten einzufügen, die nicht erlaubt sind.
  2. Schreiben Sie eine Methode, welche die komplette Struktur eines Baumes ermittelt und die Knoten- und Kantenbezeichnungen (abgekürzt und in lesbarer Form) in der Reihenfolge, in der sie ermittelt werden, ausgibt. Wenden Sie diese Methode auf den in Punkt 1 erzeugten Baum an.
  3. Ermitteln Sie die Knotenbezeichnung mit dem geringsten Stromverbrauch und die Kantenbezeichnung mit der längsten Batterielaufzeit und geben sie diese aus.
  4. Erzeugen Sie eine weitere Instanz von Tree, wobei Bezeichnungen von Kanten vom Typ Server und jene von Knoten vom Typ Computer sind. Die Bezeichnung des Wurzelknotens entspricht der des in Punkt 1 erzeugten Baumes. Die restliche Struktur des Baums ähnelt der des in Punkt 1 erzeugten Baumes, wobei jedoch Bezeichnungen von Knoten und Kanten vertauscht sind. Das heißt, wenn es im in Punkt 1 erzeugten Baum eine Kante mit der Bezeichnung x gibt, die auf einen Knoten mit der Bezeichnung y zeigt, dann wird versucht, eine Kante mit der Bezeichnung y einzufügen, die auf einen Knoten mit der Bezeichnung x zeigt. Schlägt dieser Versuch fehl, kann der gesamte Teilbaum, auf den die Kante zeigt, nicht eingefügt werden. Wählen Sie Knoten- und Kantenbezeichnungen so, dass es sowohl erfolgreiche als auch fehlgeschlagene Einfügungsversuche gibt.
  5. Wenden Sie die Methode aus Punkt 2 an, um die Struktur des in Punkt 4 erzeugten Baumes auszugeben.
  6. Schreiben Sie (optional) weitere Tests, die Ihnen sinnvoll erscheinen.

Wie die Aufgabe zu lösen ist:

Der Schwerpunkt liegt auf der richtigen Verwendung von gebundener Generizität. Verwenden Sie keine raw types bzw. type erasures. Die Aufgabenstellung ist durch Verwendung von Wildcards als Typen vermutlich einfacher zu lösen als ohne. Verwenden Sie keine vorgefertigten Container und Iteratoren. Schreiben Sie keinen unnötigen Code, und achten Sie wie üblich auf Ersetzbarkeit, saubere Zusicherungen und richtige Sichtbarkeit. Verzichten Sie auf die Verwendung von Paketen sowie von instanceof, getClass und Typumwandlungen (type casts). Die vorgegebenen Testfälle werden ihnen dabei helfen, die häufigsten Fehler in der Lösung dieser Aufgabe selbst zu finden, wenn Sie Warnungen des Compilers ernst nehmen. Achtung: Es gibt häufig verwendete Java-Compiler (vor allem unter Eclipse), die nicht alle Fehler im Zusammenhang mit Generizität richtig erkennen. Testen Sie Ihre Lösung daher bitte rechtzeitig auf der g0.

Hinweise zur Beurteilung:

Der Schwerpunkt bei der Beurteilung liegt auf der richtigen Verwendung von Typschranken und Wildcards zusammen mit Generizität. Starke Punkteabzüge gibt es für vermeidbare Warnungen des Compilers, die mit (der falschen Verwendung von) Generizität in Zusammenhang stehen, vor allem für die Verwendung von raw types bzw. type erasures, ebenso wie für Verwendungen von instanceof, getClass und Typumwandlungen, die dazu dienen, Probleme im Umgang mit Generizität zu verschleiern. Punkteabzüge gibt es, wie bereits üblich, auch für unnötigen (oder unnötig komplexen) Code, mangelhafte Zusicherungen, inkorrekte Untertypbeziehungen, schlechte Verwendung von Sichtbarkeit, sowie fehlende oder nicht der Aufgabenstellung entsprechende Funktionalität.

Was im Hinblick auf die Abgabe zu beachten ist:

Schreiben Sie Ihre Lösung in das bereits existierende Verzeichnis Gruppe/Aufgabe6. Das Programm soll von diesem Verzeichnis aus durch java Test aufrufbar 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/Aufgabe6. Stellen Sie sicher, dass ein Aufruf von javac *.java in Gruppe/Aufgabe6 keine Fehlermeldungen und keine Warnungen, die mit Generizität in Zusammenhang stehen, liefert.
Complang
Puntigam
   Kontakt
   Research
   Lehre
      OOP
      Typsysteme
      EP2
      FOOP
      Prog.spr.
      frühere Lehre
         LVAs 2017 W
         LVAs 2017 S
         LVAs 2016 W
         LVAs 2016 S
         LVAs 2015 W
         LVAs 2015 S
         LVAs 2014 W
         LVAs 2014 S
         LVAs 2013 W
         LVAs 2013 S
         LVAs 2012 W
         LVAs 2012 S
         LVAs 2011 W
         LVAs 2011 S
         LVAs 2010 W
         LVAs 2010 S
         LVAs 2009 W
         LVAs 2009 S
         LVAs 2008 W
         LVAs 2008 S
         LVAs 2007 W
            OOP
               Laborübung
               1. Aufgabe
               2. Aufgabe
               3. Aufgabe
               4. Aufgabe
               5. Aufgabe
               6. Aufgabe
               7. Aufgabe
               8. Aufgabe
            Typsysteme
            Seminar
         LVAs 2007 S
         LVAs 2006 W
         LVAs 2006 S
         LVAs 2005 W
         LVAs 2005 S
         LVAs 2004 W
         LVAs 2004 S
         LVAs 2003 W
   Links
Sitemap
Kontakt
Schnellzugriff:
Laborübung
Tutoren
Skriptum
Folien
Aufgaben
vorige Aufgabe
nächste Aufgabe
Fakultät für Informatik
Technische Universität Wien
Anfang | HTML 4.01 | Datenschutzerklärung | letzte Änderung: 2007-11-29 (Puntigam)