home *** CD-ROM | disk | FTP | other *** search
- {---------------------------------------------------------------------------}
- { Programm Hash: Beispielprogramm zur Verwendung einer Hash-Funktion.
- Diese Funktion verwendet die alphabethische Reihenfolge
- der Zeichen, um einen Speicherplatz zu finden.
- Pascal-System: Pascal ST+ / Atari ST }
-
- PROGRAM Hash;
-
- CONST max_sort = 26; { Feldbegrenzung }
-
- TYPE str10 = STRING[10]; { max Laenge des Eintrages }
- feld = ARRAY[1..max_sort] OF str10; { Feld der Namen }
-
- VAR wahl : CHAR; { Menuewahl }
- ende : BOOLEAN; { Programmende ? }
- namen : feld; { hier stehen die Namen }
- name : str10; { Puffer fuer den Namen }
-
- {---------------------------------------------------------------------------}
- { schreibt in alle Namenfelder 'FREI': }
-
- PROCEDURE Init;
-
- VAR i: INTEGER;
-
- BEGIN
- FOR i := 1 TO max_sort DO namen[i] := '---FREI---';
- END;
-
- {---------------------------------------------------------------------------}
- { wandelt Buchstaben in Alphabethreihenfolge: }
-
- FUNCTION zeichenwert (zeichen: CHAR): INTEGER;
-
- BEGIN
- zeichenwert := Ord(zeichen)-Ord('A')+1;
- END;
-
- {---------------------------------------------------------------------------}
- { speichert unter der Adresse das Wort ab: }
-
- PROCEDURE speicher (adresse: INTEGER; VAR name: str10);
-
- BEGIN
- namen[adresse] := name;
- END;
-
- {---------------------------------------------------------------------------}
- { holt den Inhalt des adressierten Eintrages: }
-
- PROCEDURE lese (adresse: INTEGER; VAR inhalt: str10);
-
- BEGIN
- inhalt := namen[adresse];
- END;
-
- {---------------------------------------------------------------------------}
- { hier werden die Namen eingegeben: }
-
- PROCEDURE eingeben;
-
- VAR zugriff : BOOLEAN; { freier Speicherplatz ? }
- wert, { Wert des ASCII Zeichens }
- i, { Zaehlvariabele }
- speicherzahl, { in diesem Platz wird abgelegt }
- zeiger_wort :INTEGER; { zeigt auf aktuellen Wortbuchstaben}
- zeichen :CHAR;
- inhalt :str10; { Inhalt d. adressierten Namenfeldes}
-
- BEGIN
- speicherzahl := 0;
- zeiger_wort := 1;
- zugriff := FALSE; { kein freier Speicherplatz }
- Write('Bitte den Namen eingeben: ');
- ReadLn(name);
- REPEAT { hole solange Ordnungszahl bis freier... }
- { Speicherplatz gefunden ist }
- IF Length(name) >= zeiger_wort THEN
- BEGIN
- FOR i := 1 TO zeiger_wort DO
- BEGIN
- zeichen := name[i]; { hole zu berechnenden Buchstaben }
- wert := zeichenwert(zeichen);
- WriteLn('Der ', i, '.Buchstabe von ', name, ' ist ', zeichen,
- ' und hat den Wert:', wert);
- speicherzahl := speicherzahl + wert;
- IF speicherzahl > max_sort THEN
- speicherzahl := speicherzahl - max_sort;
- { Ist ein Feldueberlauf eingetreten, so fange von vorne an }
- END;
- WriteLn(name, ' soll auf Platz ', speicherzahl,
- ' gesetzt werden');
- lese(speicherzahl, inhalt);
- IF inhalt = '---FREI---' THEN
- BEGIN { Das Feld ist frei und es kann abgespeichert werden }
- WriteLn;
- WriteLn('Name in Feld:', speicherzahl, ' gespeichert');
- speicher(speicherzahl,name);
- zugriff := TRUE;
- END
- ELSE { Der Platz ist besetzt und der Zeiger, welcher die zu
- berechnende Wortlaenge darstellt, wird um eins erhoeht. }
- WriteLn('Platz bereits besetzt');
- zeiger_wort := Succ(zeiger_wort);
- speicherzahl := 0;
- END
- ELSE
- BEGIN
- { der Name muss nach einem anderen Verfahren gespeichert werden
- z.B. es wird der Name im ersten freien Feld abgelegt }
- WriteLn('Abspeichern nach Hash-Funktion nicht moeglich');
- zugriff := TRUE; { Fertig mit Abspeichern }
- END;
- UNTIL zugriff;
- END;
-
- {---------------------------------------------------------------------------}
- { gibt das ganze Feld aus: }
-
- PROCEDURE ausgeben;
-
- VAR i: INTEGER;
-
- BEGIN
- FOR i := 1 TO Trunc(max_sort/2) DO WriteLn(i:2, ' = ', namen[i]);
- Write(' Taste druecken'); Read(wahl); WriteLn;
- FOR i := Trunc(max_sort/2)+1 TO max_sort DO WriteLn(i:2, ' = ', namen[i]);
- END;
-
- {----------------------------------- MAIN ----------------------------------}
-
- BEGIN
- Init;
- ende := FALSE;
- REPEAT
- WriteLn;
- WriteLn('Auswahlmenue');
- WriteLn('1 -- Namen eingeben');
- WriteLn('2 -- Namen ausgeben');
- WriteLn('3 -- Ende');
- Read(wahl); WriteLn;
- CASE wahl OF
- '1': eingeben;
- '2': ausgeben;
- '3': ende := TRUE;
- END; { OF CASE }
- UNTIL ende;
- END.
-