Die Telefonbuchsuche: »GENIE-SUCH« Eine spezielle Maschinensprache-Routine, die in einem String-Array blitzschnell beliebige Texte findet. Das Besondere: Es erfolgt kein einfacher 1:1 Vergleich, sondern die Routine drückt auf Wunsch ein »Auge zu«, wenn der Suchstring nur fast, nicht aber exakt gefunden wird. Nebenbei erhalten Sie auch eine blitzschnelle Suchroutine, die stundenlange Basic-Schleifen endgültig überflüssig macht. Nikolaus M. Heusler Nehmen wir einmal an, Sie wollen ein Telefonbuch-Programm schreiben. Dazu würden Sie in je einem Variablen-Array (indizierte Variable) die Namen der Personen und die Telefonnummern speichern. Jetzt wird der Name vom Anwender eingegeben, und eine Suchroutine tritt in Aktion, die jedes Element des Namensfeldes mit der Eingabe vergleicht. Bei Übereinstimmung wird die entsprechende Telefonnummer ausgegeben, sonst eine Fehlermeldung. Wenn Sie jedoch zum Beispiel statt des gespeicherten »MEIER« auf der Tastatur »MAIER« eingeben, muß das Programm passen. Um es etwas bedienerfreundlicher zu gestalten, wäre eine Suchroutine praktisch, die kleine Tippfehler oder Ungenauigkeiten im Suchstring automatisch korrigiert. Eine solche Routine ist die hier vorgestellte Routine »GENIE-SUCH«. Sie heißt so, weil sie bei der Suche nach einem genialen System vorgeht, um auch Tippfehler wie »Dreher« (»HBUER« statt »HUBER«), falsche Buchstaben (»HUPER« statt »HUBER«), Vertauschungen in der Groß/Kleinschrift oder zu lange und zu kurze Suchbegriffe (etwa »HUBR« oder »HUBAER« statt »HUBER«) erkennt. Da sie vollkommen in Maschinensprache geschrieben wurde, arbeitet sie recht schnell. Zudem ist sie nur wenige Bytes (drei Blocks) lang. Laden Sie die Routine mit dem Befehl LOAD "GENIE-SUCH",8,8 von Diskette in den Speicher. Geschieht dies im Direktmodus, sollte danach NEW eingegeben werden, um alle Zeiger wieder richtigzustellen. Die Routine kann und soll aber auch von Basicprogrammen aus nachgeladen werden, etwa so: 1 IFA=0THENA=1:LOAD"GENIE-SUCH",8,8 Jetzt kann das Utility mit dem Befehl SYS 49152,SU$,MODE,FE$(ANF),FE$(END),FI% gestartet werden. Dabei haben die Parameter folgende Bedeutung: SU$ ist der nicht leere String, der den Suchtext enthält. Es kann sich um eine Variable, einen Text in Anführungszeichen oder einen Stringausdruck handeln. MODE gibt die Betriebsart an, eine Zahl oder Variable oder ein Term mit einem Wert zwischen 0 und 255 nach untenstehender Tabelle. FE$(...) ist die Arrayvariable, in der gesucht werden soll. Es soll sich um ein eindimensionales Stringfeld handeln. ANF ist die erste Indexnummer, END die letzte Indexnummer. Diese beiden Parameter können auch größer als 255 sein, sie geben den Bereich im Array an, der durchsucht werden soll. ANF sollte nicht Null sein, da die Routine die Nummer des Feldes zurückmeldet, in der der Begriff gefunden wurde. Wird eine Null zurückgegeben, bedeutet dies, daß nichts gefunden wurde. Das Unterprogramm gibt aber auch dann eine Null zurück, wenn der Begriff im Feld Nummer Null gefunden wurde. Da in diesem Fall das steuernde Basicprogramm beide Fälle nicht unterscheiden kann, sollte die Null als Parameter hier vermieden werden. END darf nicht kleiner als ANF und nicht größer als die Anzahl der Elemente in FE$(...) sein. FI% schließlich muß eine Integer-Variable sein, in der die Nummer des Feldes zurückgemeldet wird, in dem der Suchbegriff gefunden wurde. Wird FI% Null, wurde nichts gefunden. Für MODE gibt es 256 Möglichkeiten, die durch Addition der folgenden Optionen entstehen: 1 = Suche falsche Zeichen (»HABER« statt »HUBER«) 2 = Keine Berücksichtigung Groß/Kleinbuchstaben 4 = »Dreher« finden (»HUBRE« statt »HUBER«) 8 = Das Fragezeichen ist als Joker zugelassen 16 = Das erste Zeichen MUSS übereinstimmen 32 = Leerzeichen ignorieren 64 = überflüssige Zeichen ignorieren (»HUBBER« statt »HUBER«) 128 = fehlende Zeichen ignorieren (»HUER« statt »HUBER«) Diese Werte können direkt für MODE eingesetzt werden. Ist MODE=0, wird nur dann ein Fund gemeldet, wenn der Suchbegriff wirklich 1:1 mit dem Feld übereinstimmt (alle Optionen abgeschaltet). Soll zum Beispiel die Suche nach falschen Zeichen (Option 1) und die Suche nach Drehern (Option 4) erlaubt sein, so addieren Sie 1 und 4 und setzen somit die 5 als MODE ein. Sind alle Optionen eingeschaltet, wird MODE=255. Beachten Sie jedoch, daß die Routine intern immer nur maximal eine Option pro Feld zuläßt. Ist der Suchbegriff etwa »PEULAENR«, und enthält ein Feld den Inhalt »PAULANER« (Fehler: ein falsches Zeichen und ein Dreher), so wird dieses Feld nicht gefunden, auch wenn Sie die beiden Optionen gleichzeitig erlaubt haben. Diese Einschränkung ist programmbedingt und mußte getroffen werden, um die Routine nicht unnötig komplex, umständlich und damit langsam werden zu lassen. Ausnahme: Die Optionen Leerzeichen ignorieren, Groß/Kleinschrift ignorieren, Fragezeichen als Joker können zusammen mit anderen Optionen verwendet werden. Erklärung der Option 8: Das Fragezeichen kann als »Joker« verwendet werden, wenn Sie einzelne Zeichen des Suchbegriffes nicht wissen. Die Anwendung entspricht der des Fragezeichens beim Befehlskanal der Floppy: Geben Sie als Suchbegriff »PE?ER« vor, findet der Computer ein Feld mit dem Inhalt »PETER«, allerdings nur, wenn Sie die Option 8 zulassen. Ein Anwendungsbeispiel: Das Feld A$(1) bis A$(15) enthält einige Vornamen. Sie wollen prüfen, in welchem Feld der »PETER« enthalten ist. Als Optionen lassen Sie zu: falsche Zeichen, Dreher, Vertauschung Groß/Kleinschrift, Leerzeichen ignorieren, Fragezeichen als Joker. Die Addition der Optionen ergibt MODE=47. Das Ergebnis soll in F% vermerkt werden. Der Befehl lautet: SYS 49152,"PETER",47,A$(1),A$(15),F% Wird nach diesem Befehl F%=5, so ist »PETER« in A$(5) enthalten. Ist F%=0, so ist »PETER« in A$(1) bis A$(15) nicht enthalten (aber vielleicht zum Beispiel in A$(16)). Zur praktischen Anwendung: Eine sinnvolle Vorgehensweise wird sein, die Suchroutine erst einmal ohne alle Optionen durchlaufen zu lassen, um bei korrekter Eingabe auch wirklich nur das gewünschte Element zu finden. Blieb die Suche erfolglos, können Sie nun nacheinander einige SYS 49152-Aufrufe verwenden und dabei nacheinander die zur Verfügung stehenden Optionen einschalten. Wir wünschen Ihnen viel Spaß mit dieser Routine, die Ihnen sicher helfen wird, Ihre Datenverwaltungsprogramme und andere Projekte komfortabler zu gestalten. Das Demoprogramm gibt noch ein weiteres Anwendungsbeispiel.