home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 12 / adrewa.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-10-07  |  9.8 KB  |  259 lines

  1. (*$U+,R+*)
  2. (* Jedes Pascalprogramm muss einen Namen haben ! *)
  3. PROGRAM AdressVerwaltung(Input, Output, Datenfile, Indexfile);
  4.     (* In den Klammern hinter dem Programmname muessen die Kanaele stehen*)
  5.     (* ueber die das Programm mit der Aussenwelt kommuniziert. INPUT und *)
  6.     (* OUTPUT ist die Standard Ein- und Ausgabe auf dem Terminal.        *)
  7.     (* "Datenfile" ist der Name der FILE-Variablen fuer die Adressdaten. *)
  8.     (* "Indexfile" ist der Name der FILE-Variablen, mit der die Index-   *)
  9.     (* felder auf Massenspeicher gerettet werden.                        *)
  10.  
  11. (* Als erstes muessen die Konstantendefinitionen kommen. *)
  12. CONST MaxDaten = 300;  (* Maximal 300 Adressen koennen verwaltet werden. *)
  13.                        (* Dieser Wert kann auch beliebig hoeher ange-    *)
  14.                        (* setzt werden. Dabei muss aber beachtet werden, *)
  15.                        (* dass das Indexfeld in den Hauptspeicher passt! *)
  16.       Schluessellaenge = 30; (* Ein Schluessel kann 30 signifikante *)
  17.                              (* Zeichen lang sein. Auch dieser Wert *)
  18.                              (* kann individuellen Beduerfnissen    *)
  19.                              (* angepasst werden.                   *)
  20.       EintragLaenge = 80; (* Laenge der Eintraege i. d. Adressverwaltung *)
  21.  
  22.  
  23. (* Als zweites kommen TYPE-Definitionen. *)
  24. TYPE tSchluessel = STRING[Schluessellaenge]; (* Schluesselstrings dimen- *)
  25.                                              (* sionieren.               *)
  26.  
  27.      tEintrag = STRING[EintragLaenge]; (* Stringtyp fuer Eintraege *)
  28.                                        (* in die Datensaetze.      *)
  29.  
  30.      tDatum = RECORD                         (* Einen Typ fuer Datumein- *)
  31.                 Tag, Monat, Jahr : INTEGER;  (* traege definieren.       *)
  32.               END;
  33.  
  34.      tDatensatz = RECORD          (* Dieser Datensatz kann natuerlich *)
  35.                     Name,         (* persoenlichen Beduerfnissen ent- *)
  36.                     Vorname,      (* sprechend variiert werden.       *)
  37.                     Strasse,
  38.                     Wohnort : tEintrag;
  39.                     PLZ : INTEGER;
  40.                     Geburtstag : tDatum;
  41.                     Kommentar : tEintrag;
  42.                   END;
  43.  
  44.      tDatenfile = FILE OF tDatensatz;
  45.  
  46.      tIndex = RECORD
  47.                 Schluessel : tSchluessel;
  48.                 RecNr : INTEGER;          (* Nr des Datensatzes im File *)
  49.               END;
  50.  
  51.      tIndexfeld = ARRAY[1..MaxDaten] OF tIndex; (* Schluesselfeld *)
  52.  
  53.      tIndexfile = FILE OF tIndexfeld;           (* Zum sichern des Index. *)
  54.  
  55. VAR Datenfile : tDatenfile;
  56.     Indexfile : tIndexfile;
  57.     Wahl : CHAR;            (* Fuer Auswahl im Hauptmenue. *)
  58. (* !!!!!!!! Neue Variablen !!!!!!!!*)
  59.     Indexfeld : tIndexfeld;
  60.     Datensatz : tDatensatz;
  61.  
  62.  
  63. (*               HIER SIND DIE NEUEN ROUTINEN                 *)
  64. (*------------------------------------------------------------*)
  65. (*         Meldung ausgeben und auf <RETURN> warten           *)
  66. PROCEDURE WaitKey;
  67.  
  68. BEGIN
  69.   Write(' <RETURN> druecken ! '); ReadLn;
  70. END;
  71.  
  72.  
  73. (*------------------------------------------------------------*)
  74. (* Versuchen, eine Zeichenkette aus Ziffern zu einem INTEGER- *)
  75. (* Wert zu konvertieren. Ggf. Fehlermeldung zurueckgeben.     *)
  76. PROCEDURE StrToInt(ZahlStr : tEintrag; VAR Zahl : INTEGER;
  77.                    VAR Fehler : BOOLEAN                   );
  78.  
  79. VAR KonvertFehler : INTEGER;
  80.  
  81. BEGIN
  82.   Val(ZahlStr,Zahl,KonvertFehler);
  83.   (* "Val" ist eine Turbo Pascal Prozedur fuer solche *)
  84.   (* Konvertierungszwecke. Gibt ggf. im dritten Para- *)
  85.   (* meter eine Fehlernummer zurueck. Siehe Handbuch  *)
  86.   (* Seite 70.                                        *)
  87.   Fehler := (KonvertFehler <> 0); (* Bool'scher Ausdruck *)
  88. END;
  89.  
  90.  
  91. (*------------------------------------------------------------*)
  92. (*      n-mal hintereinandern dasselbe Zeichen ausgeben       *)
  93. PROCEDURE ZieheLinie(Zeichen : CHAR; n : INTEGER);
  94.  
  95. VAR i : INTEGER;
  96.  
  97. BEGIN
  98.   FOR i := 1 TO n DO
  99.     Write(Zeichen);
  100. END;
  101.  
  102. (*------------------------------------------------------------*)
  103. (*   Schrift in einer Zeile mit Laenge "Laenge" zentrieren    *)
  104. PROCEDURE SchreibeZentriert(Schrift : tEintrag;
  105.                             Laenge : INTEGER    );
  106.  
  107. VAR SchriftLaenge, FuehrendeLeerzeichen : INTEGER;
  108.  
  109. BEGIN
  110.   SchriftLaenge := Length(Schrift);
  111.   (* Length ist eine "eingebaute" Funktion, *)
  112.   (*die die Laenge eines Strings bestimmt.  *)
  113.   FuehrendeLeerzeichen := (Laenge - SchriftLaenge) DIV 2;
  114.   ZieheLinie(' ',FuehrendeLeerzeichen);
  115.   Write(Schrift);
  116. END;
  117.  
  118. (*------------------------------------------------------------*)
  119. (*          Programmteilueberschriften schreiben              *)
  120. PROCEDURE SchreibeUeberschrift(Schrift : tEintrag);
  121.  
  122. BEGIN
  123.   ZieheLinie('-',79);
  124.   WriteLn;
  125.   SchreibeZentriert(Schrift,80);
  126.   WriteLn;
  127.   ZieheLinie('-',79);
  128. END;
  129.  
  130. (*------------------------------------------------------------*)
  131. (*        Einen Datensatz von der Konsole einlesen            *)
  132. PROCEDURE Eingeben(VAR Datensatz : tDatensatz);
  133.  
  134. VAR DatumString : STRING[5]; (* Hilfsvariable fuer sichere     *)
  135.                              (* Zahleneingabe. S. "StrToInt"   *)
  136.     Fehler : BOOLEAN;        (* Fehler-Anzeige                 *)
  137.  
  138. BEGIN
  139.   ClrScr;
  140.   SchreibeUeberschrift('Datensatz Eingeben');
  141.   WriteLn; WriteLn; WriteLn;
  142.   (* Die folgenden Anweisungen muessen falls eine *)
  143.   (* andere Datensatzstruktur verwendet wird, ggf.*)
  144.   (* geaendert werden. Jeweils Frage ausgeben,    *)
  145.   (* Eingabe entgegennehmen und Zeilenvorschub    *)
  146.   (* machen.                                      *)
  147.   Write('      Name: '); ReadLn(Datensatz.Name);
  148.   Write('   Vorname: '); ReadLn(Datensatz.Vorname);
  149.   Write('   Strasse: '); ReadLn(Datensatz.Strasse);
  150.   Write('   Wohnort: '); ReadLn(Datensatz.Wohnort);
  151.   Write('      PLZ.: '); ReadLn(Datensatz.PLZ);
  152.   WriteLn('-- Geburts-Datum --');
  153.   (* Die drei Datumseintraege, jeweils abfragen bis fehlerfrei *)
  154.   REPEAT
  155.     Write('    Tag: '); Read(DatumString);
  156.     StrToInt(DatumString, Datensatz.Geburtstag.Tag, Fehler);
  157.   UNTIL NOT Fehler;
  158.   REPEAT
  159.     Write('  Monat: '); Read(DatumString);
  160.     StrToInt(DatumString, Datensatz.Geburtstag.Monat, Fehler);
  161.   UNTIL NOT Fehler;
  162.   REPEAT
  163.     Write('   Jahr: '); Read(DatumString);
  164.     StrToInt(DatumString, Datensatz.Geburtstag.Jahr, Fehler);
  165.   UNTIL NOT Fehler;
  166.   WriteLn;
  167.   WriteLn('-- Kommentar zu Datensatz --');
  168.   Write('  Kommentar: '); ReadLn(Datensatz.Kommentar);
  169. END;
  170.  
  171. (*------------------------------------------------------------*)
  172. (*          Einen Datensatz auf der Konsole ausgeben          *)
  173. PROCEDURE Ausgeben(Datensatz : tDatensatz);
  174.  
  175. BEGIN
  176.   ClrScr;
  177.   SchreibeUeberschrift('Datensatz Ausgabe');
  178.   WriteLn; WriteLn; WriteLn;
  179.   (* Die folgenden Anweisungen muessen falls eine *)
  180.   (* andere Datensatzstruktur verwendet wird, ggf.*)
  181.   (* geaendert werden. Jeweils Eintrag ausgeben.  *)
  182.   WriteLn('         Name: ',Datensatz.Name);
  183.   WriteLn('      Vorname: ',Datensatz.Vorname);
  184.   WriteLn('      Strasse: ',Datensatz.Strasse);
  185.   WriteLn('      Wohnort: ',Datensatz.Wohnort);
  186.   WriteLn('         PLZ.: ',Datensatz.PLZ);
  187.   WriteLn(' Geburtsdatum: ',Datensatz.Geburtstag.Tag,'.',
  188.                             Datensatz.Geburtstag.Monat,'.',
  189.                             Datensatz.Geburtstag.Jahr);
  190.   WriteLn;
  191.   WriteLn('    Kommentar: ',Datensatz.Kommentar);
  192.   WriteLn; WriteLn;
  193.   WaitKey;
  194. END;
  195.  
  196. (*$I ADREWA1.INC *)   (* Hier werden die neuen *)
  197. (*$I ADREWA2.INC *)   (* Routinen includiert.  *)
  198.  
  199.  
  200. (* Hier beginnt das Hauptprogramm *)
  201. BEGIN
  202.   REPEAT (* Haupt-Schleife *);
  203.     ClrScr;      (* Bildschirm loeschen, Cursor nach links oben  *)
  204.     (* Menue ausgeben *)
  205.     WriteLn('              > > >  P A S C A L  < < <');
  206.     WriteLn('                  Adressverwaltung');
  207.     WriteLn; WriteLn; WriteLn;   (* Einige Leerzeilen *)
  208.     WriteLn('  O           Oeffnen Adress-Datei');
  209.     WriteLn;
  210.     WriteLn('  E           Eingeben Adressen');
  211.     WriteLn;
  212.     WriteLn('  S           Suchen Adressen');
  213.     WriteLn;
  214.     WriteLn('  R           soRtieren Adressen');
  215.     WriteLn;
  216.     WriteLn('  L           Loeschen Adressen');
  217.     WriteLn;
  218.     WriteLn('  A           Ausgeben Adressen');
  219.     WriteLn;
  220.     WriteLn('  C           sChliessen Adress-Datei');
  221.     WriteLn;
  222.     WriteLn;
  223.     WriteLn('  Q           Quit');
  224.     WriteLn; WriteLn; WriteLn;
  225.     Write('  Ihre Wahl: '); Read(Wahl);
  226.     (* Gueltiges Auswahl-Zeichen ? *)
  227.     IF (Wahl IN ['o','O','e','E','s','S','r','R',
  228.                  'l','L','a','A','c','C','q','Q']) THEN
  229.       CASE Wahl OF  (* Fallunterscheidung *)
  230.         'o','O' : Oeffnen;
  231.         'e','E' : BEGIN
  232.                     Eingeben(Datensatz);
  233.                     If Datensatz.Name <> '' then
  234.                       Einfuegen(Datensatz);
  235.                   END;
  236.         's','S' : Suchen;     (* <--- NEU *)
  237.         'r','R' : Sortieren;  (* <--- NEU *)
  238.         'l','L' : Loeschen;   (* <--- NEU *)
  239.         'a','A' : Ausgabe;    (* <--- NEU *)
  240.         'c','C' : Schliessen;
  241.         'q','Q' : BEGIN  (* Programm verlassen ? *)
  242.                     ClrScr;   (* Bildschirm loeschen *)
  243.                     (* Ueberschrift *)
  244.                     WriteLn('          ##### Programm beenden #####');
  245.                     WriteLn;  (* Zwei Leerzeilen     *)
  246.                     WriteLn;
  247.                     (* Sicherheitsabfrage *)
  248.                     Write(' Programm verlassen ');
  249.                     Write('(Datei geschlossen !?) ? (j/n) ');
  250.                     ReadLn(Wahl);
  251.                     IF (Wahl IN ['j','J']) THEN
  252.                       Wahl := 'q'   (* Anzeigen, dass Programmende *)
  253.                     ELSE
  254.                       Wahl := '0';  (* Weiter geht's ! *)
  255.                   END;
  256.       END;
  257.   UNTIL (Wahl IN ['q','Q']);  (* Benutzer will raus ! *)
  258. END.
  259.