Universität Ulm -Abteilung Angewandte Informationsverarbeitung
8.Übungsblatt (06.07.00 bis 13.07.00)
zur Vorlesung Allgemeine Informatik II (SS 00)


Ach, wie schön wäre es doch, bei Eingabe von "Maier", sämtliche "Meyer","Mayer", "Mair" ... in der Hashtabelle zu finden!

Aufgabe 1 (3 Punkte)

Gestalten Sie Ihre oder meine :-) Musterlösung vom letzten Aufgabenblatt (Nr. 7) dahingehend um, dass nicht mehr Name und Vorname einer Person als Schlüssel in die Hashtabelle eingetragen werden, sondern der "Soundexwert" des Nachnamens.
Gleich vorweg: das Soundex-Modul  ist schon fertig und Sie können es verwenden und vielleicht noch die Ersetzungsregeln etwas verbessern. Die Soundex-Funktion versucht ähnlich klingende Wörter auf einen Klangrepräsentanten abzubilden.

Bsp:    (Mayer, Mair, Meyr, Meyer -> meir)
           (Boss, Poos, Bos -> bos)
           (Drappert, Trabert -> drabrd)
Wie geht das?

a) sämtliche doppelten Buchstaben werden durch einfache ersetzt (Booss -> Bos)
b) alles auf Kleinbuchstaben umsetzen (Bos -> bos)
c) es treten Ersetzungsregeln in Kraft (in der Datei soundex.gram abgelegt), die ähnliche Laute auf einen Repräsentanten der Lautfamilie abbilden (ey->ei, ai->ei, ay->ei); die Reihenfolge der Ersetzungsregeln ist signifikant!! (ch->x, h->(nichts) [Stummes h])
d) zum Schluss wird noch mal Regel a) angewendet  (Achxe -> axxe -> axe)

Die Funktion PROCEDURE Compile(ori: ARRAY OF CHAR; VAR comp: ARRAY OF CHAR); aus dem Modul soundex verwandelt den String ori nach obigen Algorithmus in den Soundex-Wert des Strings und speichert diesen in comp ab.
 

Aufgabe 2 (7 Punkte)

Die Funktion SearchItem aus dem Hashmodul hat den grossen Nachteil, dass sie immer nur den ersten gefundenen Eintrag mit gleichem Suchstring aus der Überlauftabelle liefert. Gibt es aber nun mehrere Einträge mit dem gleichen Suchstring (sämtliche "M(e|a)(i|y)[e]r" werden ja auf "meir" abgebildet!), so müssen für eine sinnvolle Soundex-Suche natürlich irgendwie alle angeliefert werden. Ersetzen Sie deshalb die Funktion SearchItem durch die zwei Funktionen SearchFirst und SearchNext.

(* findet ggf. das *erste* Element, das den uebergebenen Namen hat; liefert FALSE,
   wenn kein passendes Element gefunden wurde *)
PROCEDURE SearchFirst(name: ARRAY OF CHAR; VAR elem: EntryPtr; hashptr: HashPtr): BOOLEAN;

(* findet ggf. ein weiteres Element, das den uebergebenen Namen hat; liefert FALSE,
   wenn kein passendes Element mehr in der Liste gefunden wird *)
PROCEDURE SearchNext(name: ARRAY OF CHAR; VAR elem: EntryPtr; hashptr: HashPtr): BOOLEAN;

SearchFirst sucht also den ersten Eintrag, der mit name übereinstimmt und SearchNext liefert dann pro Aufruf den jeweils nächsten Eintrag. Alles klar? Wenn nicht - hier die Kurzanleitung für alle Kurzschliesser: