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

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