Universität Ulm - Abteilung Angewandte Informationsverarbeitung

6. Übungsblatt (21.06.01 bis 28.06.01)
zur Vorlesung Allgemeine Informatik II für Wirtschaftswissenschaftler

SS 2001


Mein kleines Handy-Telefonbuch (15 Punkte)

Zur Zeit besitzen ca. 50 Millionen Deutsche ein Handy - Tendenz steigend. Unter Studenten ist es ebenfalls sehr beliebt; die meisten von Ihnen werden selbst eins haben. Die häufigste Anwendung fuer das Handy ist das Schreiben von SMS (kurz: sms-en), pro Monat werden zig Millionen Kurznachrichten durch die vier deutschen Handynetze verschickt.

Egal ob Sie eine SMS verschicken oder einfach nur einen Freund anrufen wollen, in jedem Fall benutzen Sie garantiert die Telefonbuch-Funktion Ihres Handys. Darin sind die Nummmern all Ihrer Freunde und Bekannten immer griffbereit und abrufbar, außerdem halten sie es natürlich auch immer up-to-date. Ihre Aufgabe in diesem Übungsblatt wird es nun sein, solch ein Handy-Telefonbuch in Oberon zu implementieren.

Die Datenstruktur, die sich für dieses Problem anbietet, ist eine sogenannte Hash-Organisation. Was ist das? Ein Hash Table ist eine Mischung aus einem klassischen ARRAY und einer Liste. Die Elemente werden mit Hilfe eines Schlüssels (dem Hash Key) klassifiziert und dann dem entsprechenden ARRAY-Element zugeordnet. In jedem ARRAY-Element ist nun wiederum der Kopfzeiger für eine Liste abgelegt.
In unserem Fall wird der Hash Key diejenige Taste sein, unter der der Name der betreffenden Person im Handy abgelegt ist. Ein Beispiel: Ihr Übungsleiter (David) würde unter dem Hash Key 3 (steht für DEF als Anfangsbuchstaben) stehen.

Grafisch sieht ein entsprechendes Hash Table für ein Handy folgendermaßen aus:

Ich empfehle Ihnen die folgende Typ-Deklaration für Ihr Hash Table:

TYPE BookEntry = RECORD
name : ARRAY 80 OF CHAR;
number : ARRAY 13 OF CHAR;
END;
PhoneList = POINTER TO PhoneListRec;
PhoneListRec = RECORD
entry : BookEntry;
next : PhoneList;
END;
PhoneBook = ARRAY 10 OF PhoneList;

Die Steuerung des Telefonbuchs wird über ein Menü erfolgen. Sie haben in einem anderen Beispielprogramm ja bereits solch eine Programmierung gesehen. Die wesentlichen Funktionen sollten sein:

Alles in allem brauchen Sie also (mindestens) die folgenden Prozeduren:

PROCEDURE CreateBook(VAR book : PhoneBook) : BOOLEAN;
(* Creates an empty hash table for the phonebook
* returns FALSE if any errors occur
*)

PROCEDURE GetKey(name : ARRAY OF CHAR) : INTEGER;
(* returns the phonebook key for a given name *)

PROCEDURE IsEmpty(key : INTEGER; book : PhoneBook) : BOOLEAN;
(* returns TRUE if the list entry in the hash table is empty *)

PROCEDURE Find(name : ARRAY OF CHAR; book : PhoneBook) : INTEGER;
(* searches the phonebook for the given name
* returns the hash index on success,
* 0 if the name could not be found and 1 if there was an error
*)

PROCEDURE Insert(entry : BookEntry; VAR book : PhoneBook);
(* inserts a name into the phonebook
* does not insert if the name already exists or if any errors occur
*)

PROCEDURE Delete(name : ARRAY OF CHAR; VAR book : PhoneBook);
(* deletes the given name from the phonebook (if it exists)
* use Find() first to check if the entry exists!
*)

PROCEDURE PrintName(name : ARRAY OF CHAR; book : PhoneBook);
(* looks for the given name in the phonebook and prints this entry
* use Find() first to check if the entry exists!
*)

PROCEDURE PrintBook(book : PhoneBook);
(* prints the whole phonebook sorted by hash keys *)

PROCEDURE ReadNames(fileIN : ARRAY OF CHAR; VAR book : PhoneBook);
(* reads names and phone numbers from the file specified by 'fileIN'
* The line format in the infile is 'NAME:PHONE NUMBER'
* All names are stored in the phonebook using Insert()
*)

Sie finden das komplette DEFINITION File hier. Außerdem gibt es wie immer eine kleine Demonstration des Programms.

Nützliche Hinweise:

Viel Erfolg!!!