Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 16. Juli 2001 Stefan Holland Informatik II Hinweise: Klausur Verwenden Sie für Ihre Lösungen ausschließlich den Platz unterhalb der jeweiligen Aufgabe. Bei den Multiple Choice-Aufgaben genügt es, die richtigen Antworten anzukreuzen. Die Klausur besteht aus fünf Aufgaben: 1. Objektorientierte Programmierung und Java (Multiple Choice) 2. Entwicklung einer Klassenhierarchie (konzeptionelle Aufgabe, Programmieraufgabe) 3. Implementierung eines Binärbaums (Programmieraufgabe) 4. Implementierung einer Personenverwaltung (Programmieraufgabe) 5. Einlesen von URLs mit Threads (Programmieraufgabe) Die Bearbeitungszeit beträgt 120 Minuten. Füllen Sie folgende Felder leserlich aus: Name Vorname Matrikelnummer Punkte: Aufgabe 1 Aufgabe 2 Aufgabe 3 Aufgabe 4 Aufgabe 5 P Note
Aufgabe 1 (5 Punkte): Multiple Choice Kreuzen Sie die richtige(n) Antworte(n) an. Pro Teilaufgabe gibt es einen Punkt, falls alle richtigen Antworten angekreuzt und alle falschen Antworten nicht angekreuzt sind. (a) Eine Java-Klasse mit dem Modifikator final (A) darf kein Interface implementieren. (B) darf keine abstrakten Methoden enthalten. (C) darf keine private Methoden enthalten. (D) darf keine private Attribute enthalten. (b) Ein Java-Attribut mit dem Modifikator static (A) wird für jedes Objekt höchstens 1 mal erzeugt. (B) wird für jedes Objekt mindestens 1 mal erzeugt. (C) wird für jedes Objekt genau 1 mal erzeugt. (D) wird für die gesamte Klasse 1 mal erzeugt. (c) Java-Methoden mit dem Modifikator abstract (A) dürfen keinen Rumpf enthalten. (B) dürfen keine Signatur enthalten. (C) dürfen weder Signatur noch Rumpf enthalten. (D) dürfen nur den Rückgabetyp void haben. (d) Ein Java-Programm, dass nur die Import-Anweisung import java.util.*; enthält (A) darf nicht die Standardklassen aus dem Paket java.lang verwenden. (B) darf die Klasse StringTokenizer verwenden. (C) darf die Klasse StreamTokenizer verwenden. (D) darf die Klasse Hashtable verwenden. (e) Die Java-Klasse Object (A) ist Oberklasse jeder anderen Java-Klasse. (B) ist eine Schnittstelle (Interface), die von jeder Klasse implementiert werden muss. (C) darf nicht Oberklasse einer anderen Klasse sein. (D) ist Oberklasse der Java-Klasse Class.
Aufgabe 2 (9 Punkte): Vererbung (a) Stellen Sie eine Vererbungshierarchie für die Klassen Text, NatuerlichSprachlicherText, ComputerProgramm, DeutscherText, EnglischerText, AssemblerProgramm, ObjektorientiertesProgramm, ProgrammInC++ und ProgrammInJava graphisch dar (Baumstruktur). (b) Überlegen Sie sich, in welchen Klassen die Attribute String text Vector programmier_befehle Vector umlaute Vector modifikatoren definiert werden sollten. Dabei soll die Vererbung möglichst gut ausgenützt werden. (c) Implementieren Sie für die Klassen Text, NatuerlichSprachlicherText, DeutscherText und EnglischerText Konstruktoren. Diese sollen sich soweit wie möglich auf den jeweiligen Oberklassenkonstruktor abstützen und soweit sinnvoll den in (b) angegeben Attributen Werte zuweisen. (d) In welchen Klassen muss die Methode quellcodesyntaxcheck definiert bzw. implementiert werden? Geben Sie die Signaturen der Methode für alle betroffenen Klassen an. Sie können dabei davon ausgehen, dass es mehrere verschiedene Assemblersprachen gibt.
Aufgabe 3 (9 Punkte): Binärer Suchbaum Ein Binärbaum ist folgendermassen definiert: Der leere Baum ist ein Binärbaum. Ein nichtleerer Binärbaum hat genau eine Wurzel. Die Wurzel und alle anderen Knoten haben keinen, einen oder zwei Söhne. Jeder Knoten enthält einen ganzzahligen Schlüssel. Ein binärer Suchbaum besitzt zusätzlich die Suchbaumeigenschaft, d.h. für jeden Schlüssel x gilt: Alle Söhne am linken Teilbaum von x haben nur Schlüssel, die kleiner oder gleich x sind. Alle Söhne am rechten Teilbaum von x haben nur Schlüssel, die größer sind als x. Entwickeln Sie eine Klasse BinaerSuchBaum, die diese Datenstruktur implementiert. Gehen Sie dabei folgendermaßen vor: (a) Schreiben Sie den Klassenrahmen und die globalen Attribute, die für den Binärbaum nötig sind. Schreiben Sie zwei Konstruktoren, die den leeren bzw. den einelementigen Binärbaum erzeugen. Dem zweiten Konstruktor wird dabei ein int als Wurzelelement übergeben. Überlegen Sie sich dabei auch, wie Sie den leeren Baum implementieren! (b) Implementieren Sie eine Methode suchen(int elem), die überprüft, ob ein bestimmtes Element in dem Baum vorkommt. (c) Implementieren Sie das Einfügen eines Schlüssels in einen binären Suchbaum. Die Suchbaumeigenschaft soll dabei natürlich erhalten bleiben. (d) Implementieren Sie die Methode loeschen(), die alle Elemente des Baums entfernt.
Aufgabe 4 (10 Punkte): Personenverwaltung Es soll eine Personenverwaltung in Java implementiert werden. Für die Klasse Person sollen Informationen über Name, Vorname, Alter, Kinder, Vater und Mutter gespeichert werden. Sie können davon ausgehen, dass eine Person durch Name und Vorname eindeutig bestimmt ist. (a) Zeichnen Sie ein UML-Diagramm zur Modellierung dieses Sachverhalts. Eltern-Kind-Beziehungen sollen durch Assoziationen realisiert werden, bei denen auch die Kardinalitäten (mit Begründung!) zu definieren sind. (b) Schreiben Sie die Klasse Person einschließlich der Attribute. Wählen Sie auch geeignete Typen und Modifikatoren. (c) Implementieren Sie eine Methode Vector getkinder(), die die Kinder zu einer Person zurückgibt. (d) Implementieren Sie eine Methode Vector geteltern(), die die Eltern einer Person zurückgibt. (e) Implementieren Sie eine Methode Vector getvorfahren(), die alle (auch die indirekten!) Vorfahren einer Person zurückgibt. (f) Implementieren Sie eine Methode boolean istkonsistent(), die eine Person auf Inkonsistenzen prüft, d.h. es soll false zurückgeben werden, falls deren Kinder nicht diese Person als Vater oder Mutter haben oder umgekehrt falls Vater oder Mutter nicht diese Person als Kind haben. Ansonsten soll true zurückgegeben werden.
Aufgabe 5 (13 Punkte): Einlesen von URLs Es soll die zu einer gegebenen URL gehörende HTML-Seite und die zu deren Links gehörenden HTML-Seiten eingelesen werden. Gehen Sie dabei folgendermaßen vor: (a) Schreiben Sie eine Klasse ReadURL extends Thread, in der eine Methode zum Einlesen einer HTML- Seite aus einer gegebenen URL implementiert ist. Da aus Effizienzgründen auch das gleichzeitige Einlesen mehrerer URLs möglich sein soll, sollen Java-Threads verwendet werden. Denken Sie auch daran, mögliche Exceptions abzufangen. (b) Schreiben Sie eine weitere Klasse Html, die eine Methode String gethtml(string url) enthält, mit der die HTML-Seite einer URL ermittelt wird (verwenden Sie die Klasse ReadURL). (c) Implementieren Sie die Methode Vector getlinks(string inhalt), die mit Hilfe des StringTokenizer alle Links der HTML-Seite inhalt, die auf weitere HTML-Seiten verweisen, zurückgibt. Ein Link ist in HTML stets so aufgebaut: <A HREF="http://www.uni-augsburg.de/"> Text</A>, wobei der Text zwischen den Anführungszeichen den eigentlichen Link (=URL) angibt. Sie dürfen unterstellen, dass A HREF stets einen Link einleitet. (d) Schreiben Sie eine Methode Vector getall(string url), die die zu url gehörenden verlinkten HTML- Seiten zurückliefert. Das Lesen dieser Seiten soll parallel mithilfe der Thread-Methoden start() und join() realisiert werden.