SAI || Wintersemester 1997/98 || Entwicklung objekt-orientierter Bibliotheken || Übungen

Übungen zu Entwicklung objekt-orientierter Bibliotheken
Blatt 6 (24. 11. - 05. 12. 1997)


Aufgabe 10 (10 Punkte)

Ändern Sie das Modul Dictionaries aus den Übungen so ab, daß anstelle von Dictionaries.First und Dictionaries.Next Iteratoren verwendet werden. Beachten Sie dabei, daß für das, was Iterators.Get liefern soll, eigens ein Datentyp definiert werden muß, der ein Schlüssel-/Objektpaar aufnehmen kann. Ferner sollen Capabilities bestimmen, ob die Operation Remove unterstützt wird, ob Iterieren möglich ist, und ob beim Iterieren ein Parameter berücksichtigt wird, der die Reihenfolge bestimmt.

Passen Sie eine Version von Hashes der neuen Version von Dictionaries so an, daß sie diese mit Löschen und ungeordnetem Iterieren implementiert. Als Testprogramm eignet sich eine leicht abgewandelte Version von TestHashes.

Halten Sie ab jetzt in allen Lösungen die Programmierkonventionen der Ulmer Oberon-Bibliothek ein, die im Vorlesungsskript abgedruckt sind.

Hinweise:

Die zu verändernden Module finden Sie im Lösungsbeispiel zu Blatt 4. Eine Version von Collections, die den Gebrauch von Iteratoren demonstriert, finden Sie bei den Beispielen zu den Übungen unter "http://www.mathematik.uni-ulm.de/sai/ws97/oolib/zb/iter/".

Aufgabe 11 (10 Punkte)

Schreiben Sie ein Oberon-Modul, das sortierte assoziative Arrays implementiert, d.h., Dictionaries mit allen optionalen Fähigkeiten der Basisabstraktion, einschließlich sortiertem Durchlaufen aller Schlüssel-/Objektpaare.

Die Vergleichsoperation für Schlüssel-/Objektpaare soll beim Konstruktor als Parameter angegeben werden. Zweckmäßig ist es, eine solche Vergleichsoperation für den häufig benötigten Fall des einfachen Vergleichs der Schlüssel (per ConstStrings.Compare) gleich mit zur Verfügung zu stellen.

Auch hier empfiehlt es sich, für Testzwecke TestHashes erneut anzupassen.

Aufgabe 12 (10 Punkte)

Verwenden Sie eine Ihrer Implementierungen von Dictionaries, um folgendes kleine Spiel zu realisieren:

Gegeben ist ein gerichteter Graph mit eindeutig benannten Knoten. Die von einem Knoten wegführenden Kanten haben ebenfalls (per Knoten eindeutige) Namen. Das Spiel besteht nun darin, den Graphen aus einer Datei einzulesen (siehe Modul UnixFiles) und interaktiv zu traversieren.

Als Namen für Knoten und Kanten seien Zeichenketten ohne "Whitespace" zugelassen. Die Datei kann einen fest vorgegebenen Namen haben und soll aus einzelnen Zeilen bestehen, die jeweils eine Kante des Graphen in der Form Startknoten Kantenname Zielknoten beschreiben.

Beispiel für eine Eingabedatei

Flur sued Wohnzimmer
Flur nord Schlafzimmer
Schlafzimmer sued Flur
Wohnzimmer nord Flur

Die interaktive Sitzung beginnt bei dem Knoten, der zuerst in der Datei genannt wird. Angezeigt wird der Name des aktuellen Knotens und der von dort weiterführenden Kanten. Nach Eingabe eines vorhandenen Kantennamens wird der Knoten, zu dem die Kante führt, der neue aktuelle Knoten, usw. Das Spiel endet mit dem Ende der Eingabe.

Beispiel für eine Sitzung

% graph
Flur
-> nord
-> sued
? nord
Schlafzimmer
-> sued
? nord
? sued
Flur
-> nord
-> sued
? ^D
%

Modularisieren Sie das Programm in der Weise, daß eine separate Abstraktionsebene einen problembezogenen Objekttyp definiert, dessen Operationen von einem einfachen Modul, das die Eingabe interpretiert, benutzt werden.


SAI || Wintersemester 1997/98 || Entwicklung objekt-orientierter Bibliotheken || Übungen

Martin Hasch, November 1997