Trick 47:
Längsten/kürzesten Satz finden
Aufgabe: Schnell mal eben in einer
Datenbank den längsten Satz finden!
Warum: allegro-Datenbanken haben keine festgelegte Satzlänge, jeder
Satz nimmt nur soviel Platz ein, wie er eben braucht. Grenzenlos lang
können Sätze jedoch nicht sein und auch nicht grenzenlos
zahlreich die
Indexeinträge. Es ist nur nicht leicht zu sagen, wo denn die
Grenzen
wirklich verlaufen. --> Grenzen Schranken, Barrieren
http://www.allegro-c.de/grenzen.htm
Für Testzwecke kann es also interessant sein, mal den
längsten
Datensatz herauszufinden.
Das leistet der folgende FLEX:
#ulg
0
#uks 0
first #
:loop
keycheck
Wurde [Esc] gedrückt?
Wenn ja und Nachfrage mit
ja beantwortet, dann -> :exit
if yes jump exit
var jb
if >#ulg ins #ulg;var i;ins
#uil
if <#uks ins #uks;var i;ins
#uik
next #
if yes jump loop
:exit
Ende, jetzt den Satz noch
zeigen
var "#" #uil
find
sho rec
disp
und Meldung:
var "Laengster Satz
: " #uil ", Laenge " #ulg
var +"Kuerzester Satz : "
#uik ", Laenge " #uks
message
Er findet in der gesamten Datenbank den längsten u. kürzesten
Satz und
zeigt den längsten am Ende an.
Wenn man first # und next # ersetzt durch
first bzw. next,
wird nur die aktuelle Egebnismenge durchgeforstet.
Der Ablauf kann mit Esc unterbrochen werden (Befehl keycheck), dann
erhält man den längsten bis dahin gefundenen Satz.
Der Trick ist nur die interne Sondervariable jb, mit der man die
Länge
des jeweils aktuellen Satzes erhält. Die Zeile
if
>#ulg ins #ulg;var i;ins #uil
vergleicht die so erhaltene Länge mit dem Wert in der Variablen
#ulg. Ist #ulg kleiner, wird der iV-Wert, also der nun
größere,
in #ulg kopiert und die interne Satznummer (denn die wird ja am
Ende gebraucht) wird in #uil aufbewahrt. Am Ende hat man die
gewünschten Werte in diesen beiden Variablen.
Mitgeliefert wird ab V27.4 ein FLEX namens lk.flx, der die drei
längsten
und kürzesten Sätze als Erg.Menge liefert.
Wo ist die Liste der internen Sondervariablen?
Hier:
http://www.allegro-c.de/flex/seite09_3.html#_Kap09_03
oder auch in xcstring.rtf