TU Kaiserslautern Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J. O. Blech Fachbereich Informatik Dipl.-Inform. M. J. Gawkowski AG Softwaretechnik Dipl.-Inform. N. Rauch Übungsblatt 13: Software-Entwicklung I (WS 2007/08) Ausgabe: 28. Januar 2008 Abgabe: 4. Februar 2008, 12.00 Uhr Abnahme praktischer Teil: 4. Februar - 7. Januar 2008 Aufgabe 1 Parametrische Typen (praktisch) (12 Punkte) Die Datenstruktur Schlange (engl. queue) und Stapel (engl. stack) unterschieden sich voneinander nach dem Prinzip, nach dem sie die von ihnen verwalteten Daten organisieren: Schlange organisiert die Daten nach dem LILO- und Stapel nach dem LIFO-Prinzip. Die Abkürzungen LILO und LIFO stehen für die Prinzipien last in last out und last in first out. Die einzigen zugelassenen Operationen von Stapel sind • initialise() liefert den leeren Stapel s. • empty(s) liefert true g.d.w. s leer ist. • top(s) liefert den Wert des obersten Elements des Stapels s. • push(s, x ) liefert einen Stapel in dem x auf allen Elementen von s liegt. • pop(s) entfernt das oberste Element aus dem Stapel s und liefert es; falls empty(s), ist pop(s) nicht definiert. Die einzigen zugelassen Operationen von Schlange sind • initialise() liefert die leere Schlange q. • empty(q) liefert true g.d.w. q leer ist. • enqueue(q, x ) liefert eine Schlange in der x am Ende der Schlange q steht. • dequeue(q) entfernt das vorderste Element aus der Schlange q und liefert es; falls empty(q), ist dequeue(q) nicht definiert. Siehe auch im Buch "Algorithmen und Datenstrukturen" von T. Ottmann und P. Widmayer oder in Wikipedia nachschlagen. a) Implementieren Sie eine parametrische Klasse Queue < T >, die eine Implementierung der Datenstruktur Schlange ist. Die Klasse Queue < T > soll ähnlich wie die Klasse SLinkedList auf der Vorlesungsfolie 550 sein: Die Klasse besitzt ein Attribut first, das eine Referenz auf das erste Element einer einfach verketteten Liste vom Typ SList < T > ist. Die Methoden der Schnittstelle von Queue < T > sollen die Liste first verwalten, indem sie die Elemente vom Typ T in first einfügen oder aus first entfernen. Im Unterschied zu SLinkedList besitzt die Klasse Queue < T > ein zusätzliches Attribut: eine Referenz last auf das letzte Element der Liste first. last dient als Hilfsreferenz bei der Ausführung der Operation enqueue. (4 Punkte) b) Erweitern Sie Ihre Implementierung der Klasse Queue < T > aus der vorangehenden Teilaufgabe um eine innere parametrische Klasse Iterator < T > nach dem auf den Vorlesungsfolien Nr. 566 und 567 dargestellten Schema. (4 Punkte) c) Schreiben Sie eine neue Version des Programms Listenverwalter, Schlangenverwalter, indem Sie die Methode main der Klasse Main aus der Lösung der Aufgabe 1 in Übungsblatt 11 umschreiben. In der neuen Version des Programms muss der Benutzer nach dem Start des Programms interaktiv eine Option eingeben, die angibt, ob der Schlangenverwalter eine Schlange von Zahlen oder eine Schlange von Punkten verwalten soll. Das Programm soll der eingegebenen Option entsprechend entweder eine Schlange vom Typ Queue < Integer > oder vom Typ Queue < Point > verwalten. (4 Punkte) Aufgabe 2 Java Packages (praktisch) (8 Punkte) a) Betrachten Sie die folgenden Klassendeklarationen-Auszüge: // Datei TextComponent.java package tools.editortools; class TextComponent{ . . . } // Datei TextArea.java package tools.editortools; public class TextArea { private char [] text; int linecount; public void getText(); public void setText(); } // Datei TextEditor.java package tools.editortools; public class TextEditor { . . . } // Datei Book import tools.editortools.*; class Book { . . . } und beantworten Sie die folgenden Fragen: 1. Auf welche Attribute und Methoden der Klasse TextComponent dürfen die Klassen TextArea, TextEditor und Book zugreifen? (2 Punkte) 2. Auf welche Attribute und Methoden der Klasse TextArea dürfen die Klassen TextComponent, TextEditor und Book zugreifen? (2 Punkte) 3. Auf welche Attribute und Methoden der Klasse TextEditor darf die Klasse TextArea zugreifen? (2 Punkte) b) In dieser Teilaufgabe sollen Sie üben Java Programme in Pakete zu verteilen, Zugriffsrechte auf die Schnittstellen der Paketenklassen zu setzen, Pakete zu erzeugen und Programme zu schreiben und zu übersetzen, welche Klassen aus den von ihnen zur Verfügung gestellten Paketen importieren und benutzen. Zum Üben verwenden wir die von Ihnen in der vorangehenden Aufgabe implementierten Klassen Point, SList < T > und Queue < T >. 1. Lesen Sie Dokumentation der Programme javac, java und jar. Insbesondere sollen Sie diejenigen Optionen genauer studieren, welche die Verzeichnise zum Lesen und Speichern von classund jar-Dateien für diese Programme festlegen. 2. Erzeugen Sie aus den Klassen Point, SList < T > und Queue < T > drei java-Dateien Point.java, SList.java und Queue.java. 3. Bündeln Sie dort enthaltene Klassen-Deklarationen in ein Paket softwaretechnik.util. 4. Ändern Sie die Zugriffsrechte im Paket so, dass von außerhalb des Pakets import softwaretechnik.util nur die Klasse Point und Queue verwendet werden dürfen und die Klasse SList gekapselt wird. 5. Übersetzen sie die Dateien Point.java, SList.java und Queue.java.. 6. Erzeugen Sie aus allen class-Dateien, die das Ergebnis der Übersetzung sind, eine jar-Archiv Datei utils.jar mit dem Programm jar. 7. Legen Sie in Ihrem Arbeitsverzeichnis das Verzeichnis lib an. 8. Kopieren Sie utils.jar ins Verzeichnis lib. 9. Legen Sie in Ihrem Arbeitsverzeichnis das Verzeichnis project an. 10. Schreiben Sie im Verzeichnis lib die Klasse Main des Programms Schlangenverwalter aus der vorangehenden Aufgabe folgendermaßen um: Die Datei Main.java soll die ImportKlausel import softwaretechnik.util.*; und die Deklaration der Klasse Main enthalten. 11. Übersetzen Sie die Klasse Main 12. Protokollieren Sie alle Kommandos (einschließlich Optionen, die Sie gebraucht haben), die Sie auf dem Terminal betätigt haben. 13. Demonstrieren Sie Ihrem Tutor, dass ihre Klasse Main nur auf die Schnittstellenkomponenten der Klassen Point und Queue zugreifen können, indem Sie geeignet Quellcode der MainKlassendeklaration verändern. (2 Punkte) Aufgabe 3 Störe meine Kreise nicht 2 (praktisch) (7 Punkte) Betrachten Sie nochmal Ihren Editor von Aufgabenblatt 12 und passen Sie Ihre Implementierung gegebenenfalls an. Die folgenden Teilaufgaben sollen gelöst werden: a) Ihr Editor soll genau ein Feld von Figuren verwalten. Diese Figuren sollen jeweils mit Hilfe eines drawMethodenaufrufs gezeichnet werden. (1 Punkt) b) Zusätzlich zu den Kreis-basierten Figuren sollen jetzt Rechtecke darstellbar sein. Was müssen Sie tun, um mit dem einen Feld in Ihrer Editor-Klasse auszukommen? Entwerfen Sie eine Schnittstelle und implementieren Sie entsprechende Klassen! (5 Punkte) c) Ergänzen Sie Ihr Hauptprogramm so, dass es das Anlegen und Verschieben sowohl von Rechtecken als auch von Kreis-basierten Figuren erlaubt. (1 Punkt) Aufgabe 4 Eine unkonventionelle Listenimplementierung (praktisch) (8 Punkte) Um die Bedeutung und Benutzung einiger Sprachkonstrukte zu üben, soll in dieser Aufgabe eine unkonventionelle Listenimplementierung realisiert werden. Die Implementierung soll aus genau einer Klasse bestehen und folgende Eigenschaften besitzen: • Der Typ der Listenelemente ist int. • Die Klasse realisiert genau eine Liste; diese Liste braucht nicht extra erzeugt zu werden, sondern existiert am Programmstart und ist zunächst leer. • Die Klasse hat genau einen Konstruktor. Verwirrenderweise erzeugt der Konstruktor keine neue Listeninstanz, sondern hängt ein neues Element in die Liste ein. • Die Klasse ermöglicht es dem Anwender, alle Elemente in der Liste auf der Standardausgabe in normaler Reihenfolge und in umgekehrter Reihenfolge auszugeben. a) Implementieren Sie eine Klasse DLL mit den obigen Eigenschaften. b) Testen Sie Ihre Implementierung anhand mehrerer Beispiele. c) Nennen Sie eine Eigenschaft der Liste, die wünschenswert sein könnte. Nennen Sie eine Eigenschaft der Liste, die sehr schlechter Programmierstil ist.