home *** CD-ROM | disk | FTP | other *** search
- (*$P512*) (* Fuer MS-DOS I/O gepufferter System-I/O ueber *)
- (* ANSI-Treiber. Siehe Bildschirm-Steuerzeichen *)
- (*------------------------------------------------------------*)
- (* TELEFON.PAS *)
- (* Telefon-Datei-Verwaltung mit *)
- (* Datenorganisation ueber B-Baeume *)
- (*------------------------------------------------------------*)
-
- PROGRAM Telefon(Input,Output,Datei,Bbaum,FreiSaetze,FreiSeiten);
-
- (* In diesem Programm werden die Vorteile einer B-Baum *)
- (* Datenorganisation anhand dem Beispiel einer Telefondatei *)
- (* aufgezeigt. *)
- (* Das Programm ist auf allen Pascal-Systemen lauffähig, die *)
- (* STRING-Verarbeitung bieten (siehe auch PASCAL 11/87) und *)
- (* weiterhin indizierten Zugriff auf Diskettendateien er- *)
- (* moeglichen. Eventuell muessen die System-spezifischen *)
- (* Routine angepasst werden (seek, filepos, filesize). Das *)
- (* verwendete System beginnt die Zaehlung der Indizes bei 0. *)
-
- {$V-} (* Strenge String-Typpruefung VAR-Parametern abschalten *)
- {$A+} (* Nichtrekursiver, absoluter Object-Code *)
- {$U+} (* Benutzerunterbrechnung erlauben *)
-
- CONST phys_datei = 'telefon.dat'; (* Name Hauptdatei *)
- phys_freisaetze = 'datei.fre'; (* Name freie Daten *)
- phys_bbaum = 'index.bb'; (* Name Indexdatei *)
- phys_freiseiten = 'index.fre'; (* Name freie Seiten *)
- bt_order = 4; (* Ordnungszahl B-Baum *)
- maxanz = 8; (* 2*Ordnungszahl *)
- maxanz_1 = 9; (* 2*Ordnungzahl+1 *)
- cache_anz = 9; (* Groesse des Cache -1 *)
- line_up = #27'[1A'; (* Steuerzeichen "Zeile rauf" *)
- line_dn = #10; (* Steuerzeichen "Zeile runter" *)
-
- TYPE fileindex = INTEGER; (* Indextyp,z.B. MS-DOS:REAL *)
- str016 = STRING[016];
- str025 = STRING[025];
- str079 = STRING[079];
- key = str016; (* Schluessel fuer Indexdatei *)
- ref = RECORD
- stw: key; (* Verweiszeile in Indexdatei *)
- zeiger: fileindex
- END;
- (* Seite im Bayer-Baum *)
- Page = RECORD
- vg: fileindex; (* Vorgaenger *)
- anz: INTEGER; (* belegte Anzahl *)
- info: ARRAY[1..maxanz]OF ref;(* Verweise *)
- nf: ARRAY[0..maxanz] OF fileindex;
- END; (* Folgeseiten *)
- (* Ueberlaufseite *)
- bigpage = RECORD
- vg: fileindex;
- info: ARRAY[1..maxanz_1] OF ref;
- nf: ARRAY[0..maxanz_1]OF fileindex
- END;
- (* Datensatz der Hauptdatei *)
- rec = RECORD
- stw: key;
- Name,Vorname,Tel: str079
- END;
- indexfile = FILE OF fileindex;
- (* >> Typ fuer das Bayer-Baum-Modul << *)
- delta = -1..1;
-
- VAR Datei: FILE OF rec; (* Hauptdatei *)
- Bbaum: FILE OF Page; (* Indexdatei als B-Baum *)
- FreiSaetze, FreiSeiten: indexfile;(* Freie Datensaetze *)
- Wahl: CHAR;
- Name, NrStr : str079;
- datensatz: rec;
- vorhanden: BOOLEAN;
- (* >> Variable fuer das Cache-Modul << *)
- cache: ARRAY[0..cache_anz] OF RECORD
- snr, stat: INTEGER;
- seite: Page;
- update: BOOLEAN
- END;
- (*------------------------------------------------------------*)
- (* Fehlermeldung ausgeben *)
- PROCEDURE fehler(erkl: str079);
- BEGIN
- WriteLn; WriteLn('Fehler: ', erkl)
- END;
- (*------------------------------------------------------------*)
- (* Auf RETURN warten *)
- PROCEDURE WaitKey;
- BEGIN
- Write(' ! <RETURN> druecken ! '); ReadLn;
- END;
- (*------------------------------------------------------------*)
- (* Gibt Zeichenkette OHNE erstes Zeichen zurueck *)
- FUNCTION butfirst(zk: str079): str079;
- BEGIN
- IF Length(zk)>1 THEN butfirst := Copy(zk, 2, Pred(Length(zk)))
- ELSE butfirst := ''
- END;
- (*-------------------------------------------------------------------------*)
- (* Ausgabe eines Hauptdatensatzes auf dem Bildschirm, *)
- (* an Datenform anpassen! *)
- PROCEDURE write_rec(VAR datensatz: rec);
- BEGIN
- WriteLn;
- WriteLn('========================================================');
- WriteLn; WriteLn(' Schluessel: ', datensatz.stw);
- WriteLn(' ------------------------------------------------------ ');
- WriteLn(' Name: ',datensatz.Name);
- WriteLn(' Vorname: ',datensatz.Vorname);
- WriteLn(' Telef.-Nr.: ',datensatz.Tel);
- WriteLn('========================================================');
- WriteLn;
- END;
- (*-------------------------------------------------------------*)
- (* Einlesen eines Hauptdatensatzes von der Console, an *)
- (* Datenform anpassen! *)
- PROCEDURE read_rec(VAR datensatz: rec);
- BEGIN
- WITH datensatz DO BEGIN
- Name := '';
- REPEAT
- Write(' Name: '); ReadLn(Name)
- UNTIL Length(Name) <> 0;
- Write(' Vorname: '); ReadLn(Vorname);
- Write(' Telef.-Nr.: '); ReadLn(Tel);
- datensatz.stw := Name;
- END
- END;
-
- (*$I cache.inc *) (* Cache-Modul fuer Modul Bayer-Baum laden *)
- (*$I bbacc.inc *) (* Bayer-Baum Modul laden *)
-
- (*-------------------------------------------------------------*)
- (* Ausgabe einer Seite des Bayer-Baumes. So kann der inter- *)
- (* essierte Benutzer die Vorgaenge beim Speichern und Loeschen *)
- (* verfolgen. *)
- PROCEDURE zeige_seite(seiten_nr_str: str016);
-
- VAR seite: Page;
- seiten_nr: fileindex;
- dummy: INTEGER;
-
- BEGIN
- Val(seiten_nr_str, seiten_nr, dummy);
- IF (abs(seiten_nr)<FileSize(Bbaum)) AND (dummy=0) THEN BEGIN
- get_page(seiten_nr, seite);
- write_page(seiten_nr, seite)
- END
- ELSE IF (dummy>0) OR (seiten_nr<0) THEN
- fehler(seiten_nr_str+' ist keine Zahl')
- ELSE fehler('Seite existiert nicht')
- END;
-
- BEGIN (* Hauptprogramm *)
- ClrScr; (* Bildschirm loeschen, Cursor nach links oben *)
- WriteLn(' >>>> TELEFON-DAT <<<<');
- WriteLn;
- WriteLn(' *** ***');
- WriteLn(' ******************* ');
- WriteLn(' **********************');
- WriteLn(' ***** ** ** *****');
- WriteLn(' ** ** ');
- WriteLn(' ************ ');
- WriteLn(' ******* ******** ');
- WriteLn(' ****** 0561/ ******* ');
- WriteLn(' ****** 8702 ******* ');
- WriteLn(' ******** ********* ');
- WriteLn(' *** Dienstag 17-20 Uhr ***');
- WriteLn(' **************************');
- WriteLn(' *** PASCAL - HOTLINE ***');
- WriteLn; WriteLn; WriteLn;
- Write(' Schnelle Telefondatei mit ');
- WriteLn('B-Baum-strukturierter Indexdatei ');
- WriteLn;
- Write(' (C) Copyright 1987 by ');
- WriteLn('PASCAL INTERNATIONAL & Michael Hoennig');
- WriteLn; WriteLn;
- Write('Schon vorhandene Telefon-Datei erweitern ? (j,n): ');
- REPEAT ReadLn(Wahl) UNTIL Wahl IN ['j','J','n','N'];
- Assign(Datei, phys_datei);
- Assign(FreiSaetze, phys_freisaetze);
- Assign(Bbaum, phys_bbaum);
- Assign(FreiSeiten, phys_freiseiten);
- IF Wahl IN ['n','N'] THEN create;
- access(TRUE);
- REPEAT
- ClrScr; (* Bildschirm loeschen, Cursor nach links oben *);
- WriteLn(' ************ DAS HAUPTMENUE ***************');
- WriteLn; WriteLn; WriteLn;
- WriteLn(' Datensatz einfuegen ............... + '); WriteLn;
- WriteLn(' Datensatz loeschen ................ - '); WriteLn;
- WriteLn(' Datensatz suchen .................. ? '); WriteLn;
- WriteLn(' Datensatz aendern ................. / '); WriteLn;
- WriteLn(' Ende & Abspeichern ................ * '); WriteLn;
- WriteLn;
- WriteLn('Sonderfunktion Seitenanzeige ....... # '); WriteLn;
- WriteLn; WriteLn;
- Write(' Ihre Wahl: ');
- ReadLn(Wahl);
- CASE Wahl OF
- '+': BEGIN
- ClrScr;
- WriteLn('##### Datensatz Eingeben #####');
- WriteLn; WriteLn; WriteLn;
- read_rec(datensatz);
- insert_rec(datensatz, vorhanden);
- IF vorhanden THEN BEGIN
- fehler('Schluessel ist schon vorhanden');
- WriteLn; WaitKey;
- END;
- END;
- '-': BEGIN
- ClrScr;
- WriteLn('###### Datensatz Loeschen ######');
- WriteLn; WriteLn; WriteLn;
- Write(' Name: '); ReadLn(Name); WriteLn;
- delete_rec(Name, vorhanden); WriteLn;
- IF NOT(vorhanden) THEN
- fehler('Schluessel ist nicht vorhanden');
- WriteLn; WaitKey;
- END;
- '?': BEGIN
- ClrScr;
- WriteLn('###### Datensatz Suchen ######');
- WriteLn; WriteLn; WriteLn;
- Write(' Name: '); ReadLn(Name); WriteLn;
- search_rec(Name, vorhanden); WriteLn; WriteLn;
- IF NOT(vorhanden) THEN
- fehler('Schluessel ist nicht vorhanden');
- WriteLn; WaitKey;
- END;
- '/': BEGIN
- ClrScr;
- WriteLn('###### Datensatz Aendern ######');
- WriteLn; WriteLn; WriteLn;
- Write(' Name: '); ReadLn(Name);
- search_rec(Name, vorhanden);
- IF NOT(vorhanden) THEN BEGIN
- fehler('Schluessel ist nicht vorhanden');
- WriteLn; WaitKey;
- END
- ELSE BEGIN
- WriteLn('---- Geaenderten Satz eintragen ----');
- WriteLn;
- read_rec(datensatz);
- delete_rec(Name,vorhanden);
- insert_rec(datensatz,vorhanden);
- END;
- END;
- '#': BEGIN
- ClrScr;
- WriteLn('##### SONDERFUNKTION: Seite Anzeigen #####');
- WriteLn; WriteLn; WriteLn;
- Write(' Seiten-Nr.: '); ReadLn(NrStr);
- zeige_seite(NrStr); WriteLn; WriteLn;
- WaitKey;
- END;
- '*': ;
- ELSE ; (* Leeres Statement f. 'sauberen' Programmablauf *)
- END;
- UNTIL Wahl='*';
- access(FALSE)
- END.
-
-
-
-
-