Neulich ergab sich der folgende Dialog in der Mensa:
``Schau' mal: der Typ an der Kasse, der sieht aus wie Richard Gere!'' ``Richard Gere? Aus welchem Film kenne ich den?'' ``Zum Beispiel aus Pretty Woman!''. ``Ach ja richtig! Der Film ist toll! Wer hat da nochmal die weibliche Hauptrolle gespielt?'' ``Julia Roberts!'' ``Na klar, die hat doch auch in Ocean's Elevens mitgespielt.'' ``Hmm, macht in Ocean's Eleven nicht auch Brad Pitt1 mit?''. ``Ja, genau, den find' ich seit seinem Film Sieben Jahre in Tibet ganz toll!'' ``Sieben Jahre in Tibet? Da macht doch auch B.D. Wong mit. In welchem Film hat der denn noch mitgespielt?'' ``Keine Ahnung!'' ``Ich auch nicht!''
Was hat das mit unserem Übungsblatt zu tun? Nun, jetzt, wo bald die Ferien anfangen und Sie nicht wissen, was Sie ohne unterhaltsame Übungsblätter mit Ihrer Zeit anfangen werden, sind Sie dankbar für jede Anregung, die den Geist auf Trab hält. Und warum nicht mal die Internet Movie Database auswendig lernen?
Und wenn Sie dann alles auswendig können, möchten Sie ihr Wissen auch testen, und dazu können Sie dann das Programm verwenden, das Sie in dieser Aufgabe schreiben sollen:
Schreiben Sie ein Oberon-Programm, mit dem Sie einen Dialog wie im Beispiel angegeben ``führen'' können. Sie geben also zu Beginn den Namen eines Schauspielers2 ein. Als nächstes erwartet das Programm die Eingabe eines Filmtitels (leider müssen dies hier bei uns die Originaltitel sein!), in dem dieser Schauspieler mitgespielt hat. War die Eingabe korrekt, fragt das Programm als nächstes nach einem anderen Schauspieler, der ebenfalls in dem zuletzt genannten Film dabei war. Bezogen auf diesen neuen Schauspieler wird nun wieder nach einem Filmtitel gefragt, in dem der genannte Schauspieler mitmacht. So geht es immer weiter. Wenn Sie eine falsche Antwort gegeben haben, ist das Spiel beendet, und Sie bekommen Ihre Punktzahl (Anzahl korrekter Antworten) genannt.
verwendet sowie
umgesetzt werden.
Die Beziehung lässt sich entweder dadurch realisieren, daß entweder jeder Schauspieler ``weiß'', an welchen Filmen er teilgenommen hat oder bei jedem Film steht, welche Schauspieler daran beteiligt waren.
Empfohlen sei hier die erstgenannte Möglichkeit, denn wenn bei den Schauspielern jeweils ein Hash mit den Filmtiteln untergebracht wird4, reduziert das die Gesamtzahl der Hash-Tabellen, da die Zahl der Schauspieler geringer als die der Filme ist. Wichtig ist hier, daß in den Hash für die Schauspieler direkt die Film-Objekte eingetragen werden. Das geht problemlos, da ein Objekt in beliebig viele Hash-Tabellen eingefügt werden kann (zumindest ist das der Fall, wenn Hashes verwendet wird). Keinesfalls darf ein referenziertes Objekt für jede Referenz neu erzeugt werden, da dies zur Explosion des benötigten Speichervolumens führen würde.
Nachstehend finden Sie eine kurze Erklärung der für diese Aufgabe benötigten Module. Die genauen Spezifikationen entnehmen Sie bitte den zugehörigen od-Dateien, die sie wie immer auf unserem FTP-Server finden. Die Module sind in topologischer Reihenfolge erklärt und geben in der ersten (kursiv gesetzten) Zeile jeweis an, wie sie sich gegenseitig verwenden:
Dieses Modul entspricht - zumindest in der Beispiellösung - vollständig dem Beispiel Hashes aus der Vorlesung.
Dies müssen Sie für diese Aufgabe nicht verwenden, wenn Sie gerne ein eigenes Hash-Modul schreiben möchten. Aber selbstverständlich können Sie es gerne verwenden!
(unterstützt Hashes für Objekte mit einem Namen)
Diese Abstraktion ist als Hilfestellung gedacht, um besser mit dem Hash-Modul aus der Vorlesung arbeiten zu können, welches als Datentyp Erweiterungen von Objects.Object erwartet.
Dementsprechend stellt NameObjects einen Datentyp zur Verfügung, der eine Erweiterung von Objects.Object ist und Strings verwalten kann. Letztlich braucht man sowohl für das Speichern von Schauspielern als auch für das Speichern der Filmtitel jeweils nur einen String - aber eben in einem vom das Hash-Modul erwarteten Weise. Genau dies wird durch NameObjects zur Verfügung gestellt: abgesehen vom Datentyp selber, werden hier auch die notwendigen Funktionen zur Aufnahme einer Variablen vom Typ NameObjects in den Hash definiert.
Das bedeutet konkret, daß es sich bei NameObjects um eine Faktorisierung des Namensteils von Schauspielern und Filmen handelt, die es einem erspart, die drei Prozeduren für Hashes doppelt zu schreiben.
Damit ergibt sich die folgende Typ-Hierarchie:
(nutzt NameObjects und Hashes zum Aufbau einer Datenbank)
Dieses Modul stellt die für den Aufbau der Datenbank erforderliche Datenstruktur sowie die notwendigen Zugriffsmechanismen zur Verfügung.
(füllt eine Datenbank aus dem Database-Modul)
Dieses Modul stellt die Funktion Load zur Verfügung, mit der eine Filmdatenbank eingelesen wird.
(füllt ein Spiel durch mit einer gefüllten Datenbank)
Dieses Modul bietet die Prozedur Run an, die ein Spiel steuert.
Dieses Modul ist das Hauptmodul des Spiels. Hier wird insbesondere auch der Pfad zur Datenbank-Datei angegeben. Abgesehen von dieser Anpassung können Sie das Modul aber ohne Änderungen übernehmen. Dies stellen wir Ihnen zur Verfügung.
Wie immer geben wir zum Schluß der Aufgabenstellung noch ein Beispiel an (dies entspricht dem eingangs geschilderten ``Mensa-Dialog''):
*** Schauspieler / Filme Raten *** Schauspieler: Richard Gere Film: Pretty Woman Schauspieler: Julia Roberts Film: Ocean's Eleven Schauspieler: Brad Pitt Film: Seven years in tibet Schauspieler: B.D. Wong Film: Lethal Weapon Pech! Leider hat B.D. Wong nicht in Lethal Weapon mitgespielt! Gut! Sie haben 3 Punkte erreicht!
Erweitern Sie das Programm so, daß die Groß- und Kleinschreibung nicht mehr relevant ist. Die Eingabe ``Seven years in Tibet'' soll zum Beispiel genauso gewertet werden wie ``Seven Years In Tibet''.
Viel Erfolg!