home *** CD-ROM | disk | FTP | other *** search
- (*$U+,R+*)
- (* Jedes Pascalprogramm muss einen Namen haben ! *)
- PROGRAM AdressVerwaltung(Input, Output, Datenfile, Indexfile);
- (* In den Klammern hinter dem Programmname muessen die Kanaele stehen*)
- (* ueber die das Programm mit der Aussenwelt kommuniziert. INPUT und *)
- (* OUTPUT ist die Standard Ein- und Ausgabe auf dem Terminal. *)
- (* "Datenfile" ist der Name der FILE-Variablen fuer die Adressdaten. *)
- (* "Indexfile" ist der Name der FILE-Variablen, mit der die Index- *)
- (* felder auf Massenspeicher gerettet werden. *)
-
- (* Als erstes muessen die Konstantendefinitionen kommen. *)
- CONST MaxDaten = 300; (* Maximal 300 Adressen koennen verwaltet werden. *)
- (* Dieser Wert kann auch beliebig hoeher ange- *)
- (* setzt werden. Dabei muss aber beachtet werden, *)
- (* dass das Indexfeld in den Hauptspeicher passt! *)
- Schluessellaenge = 30; (* Ein Schluessel kann 30 signifikante *)
- (* Zeichen lang sein. Auch dieser Wert *)
- (* kann individuellen Beduerfnissen *)
- (* angepasst werden. *)
- EintragLaenge = 80; (* Laenge der Eintraege i. d. Adressverwaltung *)
-
-
- (* Als zweites kommen TYPE-Definitionen. *)
- TYPE tSchluessel = STRING[Schluessellaenge]; (* Schluesselstrings dimen- *)
- (* sionieren. *)
-
- tEintrag = STRING[EintragLaenge]; (* Stringtyp fuer Eintraege *)
- (* in die Datensaetze. *)
-
- tDatum = RECORD (* Einen Typ fuer Datumein- *)
- Tag, Monat, Jahr : INTEGER; (* traege definieren. *)
- END;
-
- tDatensatz = RECORD (* Dieser Datensatz kann natuerlich *)
- Name, (* persoenlichen Beduerfnissen ent- *)
- Vorname, (* sprechend variiert werden. *)
- Strasse,
- Wohnort : tEintrag;
- PLZ : INTEGER;
- Geburtstag : tDatum;
- Kommentar : tEintrag;
- END;
-
- tDatenfile = FILE OF tDatensatz;
-
- tIndex = RECORD
- Schluessel : tSchluessel;
- RecNr : INTEGER; (* Nr des Datensatzes im File *)
- END;
-
- tIndexfeld = ARRAY[1..MaxDaten] OF tIndex; (* Schluesselfeld *)
-
- tIndexfile = FILE OF tIndexfeld; (* Zum sichern des Index. *)
-
- VAR Datenfile : tDatenfile;
- Indexfile : tIndexfile;
- Wahl : CHAR; (* Fuer Auswahl im Hauptmenue. *)
- (* !!!!!!!! Neue Variablen !!!!!!!!*)
- Indexfeld : tIndexfeld;
- Datensatz : tDatensatz;
-
-
- (* HIER SIND DIE NEUEN ROUTINEN *)
- (*------------------------------------------------------------*)
- (* Meldung ausgeben und auf <RETURN> warten *)
- PROCEDURE WaitKey;
-
- BEGIN
- Write(' <RETURN> druecken ! '); ReadLn;
- END;
-
-
- (*------------------------------------------------------------*)
- (* Versuchen, eine Zeichenkette aus Ziffern zu einem INTEGER- *)
- (* Wert zu konvertieren. Ggf. Fehlermeldung zurueckgeben. *)
- PROCEDURE StrToInt(ZahlStr : tEintrag; VAR Zahl : INTEGER;
- VAR Fehler : BOOLEAN );
-
- VAR KonvertFehler : INTEGER;
-
- BEGIN
- Val(ZahlStr,Zahl,KonvertFehler);
- (* "Val" ist eine Turbo Pascal Prozedur fuer solche *)
- (* Konvertierungszwecke. Gibt ggf. im dritten Para- *)
- (* meter eine Fehlernummer zurueck. Siehe Handbuch *)
- (* Seite 70. *)
- Fehler := (KonvertFehler <> 0); (* Bool'scher Ausdruck *)
- END;
-
-
- (*------------------------------------------------------------*)
- (* n-mal hintereinandern dasselbe Zeichen ausgeben *)
- PROCEDURE ZieheLinie(Zeichen : CHAR; n : INTEGER);
-
- VAR i : INTEGER;
-
- BEGIN
- FOR i := 1 TO n DO
- Write(Zeichen);
- END;
-
- (*------------------------------------------------------------*)
- (* Schrift in einer Zeile mit Laenge "Laenge" zentrieren *)
- PROCEDURE SchreibeZentriert(Schrift : tEintrag;
- Laenge : INTEGER );
-
- VAR SchriftLaenge, FuehrendeLeerzeichen : INTEGER;
-
- BEGIN
- SchriftLaenge := Length(Schrift);
- (* Length ist eine "eingebaute" Funktion, *)
- (*die die Laenge eines Strings bestimmt. *)
- FuehrendeLeerzeichen := (Laenge - SchriftLaenge) DIV 2;
- ZieheLinie(' ',FuehrendeLeerzeichen);
- Write(Schrift);
- END;
-
- (*------------------------------------------------------------*)
- (* Programmteilueberschriften schreiben *)
- PROCEDURE SchreibeUeberschrift(Schrift : tEintrag);
-
- BEGIN
- ZieheLinie('-',79);
- WriteLn;
- SchreibeZentriert(Schrift,80);
- WriteLn;
- ZieheLinie('-',79);
- END;
-
- (*------------------------------------------------------------*)
- (* Einen Datensatz von der Konsole einlesen *)
- PROCEDURE Eingeben(VAR Datensatz : tDatensatz);
-
- VAR DatumString : STRING[5]; (* Hilfsvariable fuer sichere *)
- (* Zahleneingabe. S. "StrToInt" *)
- Fehler : BOOLEAN; (* Fehler-Anzeige *)
-
- BEGIN
- ClrScr;
- SchreibeUeberschrift('Datensatz Eingeben');
- WriteLn; WriteLn; WriteLn;
- (* Die folgenden Anweisungen muessen falls eine *)
- (* andere Datensatzstruktur verwendet wird, ggf.*)
- (* geaendert werden. Jeweils Frage ausgeben, *)
- (* Eingabe entgegennehmen und Zeilenvorschub *)
- (* machen. *)
- Write(' Name: '); ReadLn(Datensatz.Name);
- Write(' Vorname: '); ReadLn(Datensatz.Vorname);
- Write(' Strasse: '); ReadLn(Datensatz.Strasse);
- Write(' Wohnort: '); ReadLn(Datensatz.Wohnort);
- Write(' PLZ.: '); ReadLn(Datensatz.PLZ);
- WriteLn('-- Geburts-Datum --');
- (* Die drei Datumseintraege, jeweils abfragen bis fehlerfrei *)
- REPEAT
- Write(' Tag: '); Read(DatumString);
- StrToInt(DatumString, Datensatz.Geburtstag.Tag, Fehler);
- UNTIL NOT Fehler;
- REPEAT
- Write(' Monat: '); Read(DatumString);
- StrToInt(DatumString, Datensatz.Geburtstag.Monat, Fehler);
- UNTIL NOT Fehler;
- REPEAT
- Write(' Jahr: '); Read(DatumString);
- StrToInt(DatumString, Datensatz.Geburtstag.Jahr, Fehler);
- UNTIL NOT Fehler;
- WriteLn;
- WriteLn('-- Kommentar zu Datensatz --');
- Write(' Kommentar: '); ReadLn(Datensatz.Kommentar);
- END;
-
- (*------------------------------------------------------------*)
- (* Einen Datensatz auf der Konsole ausgeben *)
- PROCEDURE Ausgeben(Datensatz : tDatensatz);
-
- BEGIN
- ClrScr;
- SchreibeUeberschrift('Datensatz Ausgabe');
- WriteLn; WriteLn; WriteLn;
- (* Die folgenden Anweisungen muessen falls eine *)
- (* andere Datensatzstruktur verwendet wird, ggf.*)
- (* geaendert werden. Jeweils Eintrag ausgeben. *)
- WriteLn(' Name: ',Datensatz.Name);
- WriteLn(' Vorname: ',Datensatz.Vorname);
- WriteLn(' Strasse: ',Datensatz.Strasse);
- WriteLn(' Wohnort: ',Datensatz.Wohnort);
- WriteLn(' PLZ.: ',Datensatz.PLZ);
- WriteLn(' Geburtsdatum: ',Datensatz.Geburtstag.Tag,'.',
- Datensatz.Geburtstag.Monat,'.',
- Datensatz.Geburtstag.Jahr);
- WriteLn;
- WriteLn(' Kommentar: ',Datensatz.Kommentar);
- WriteLn; WriteLn;
- WaitKey;
- END;
-
- (*$I ADREWA1.INC *) (* Hier werden die neuen *)
- (*$I ADREWA2.INC *) (* Routinen includiert. *)
-
-
- (* Hier beginnt das Hauptprogramm *)
- BEGIN
- REPEAT (* Haupt-Schleife *);
- ClrScr; (* Bildschirm loeschen, Cursor nach links oben *)
- (* Menue ausgeben *)
- WriteLn(' > > > P A S C A L < < <');
- WriteLn(' Adressverwaltung');
- WriteLn; WriteLn; WriteLn; (* Einige Leerzeilen *)
- WriteLn(' O Oeffnen Adress-Datei');
- WriteLn;
- WriteLn(' E Eingeben Adressen');
- WriteLn;
- WriteLn(' S Suchen Adressen');
- WriteLn;
- WriteLn(' R soRtieren Adressen');
- WriteLn;
- WriteLn(' L Loeschen Adressen');
- WriteLn;
- WriteLn(' A Ausgeben Adressen');
- WriteLn;
- WriteLn(' C sChliessen Adress-Datei');
- WriteLn;
- WriteLn;
- WriteLn(' Q Quit');
- WriteLn; WriteLn; WriteLn;
- Write(' Ihre Wahl: '); Read(Wahl);
- (* Gueltiges Auswahl-Zeichen ? *)
- IF (Wahl IN ['o','O','e','E','s','S','r','R',
- 'l','L','a','A','c','C','q','Q']) THEN
- CASE Wahl OF (* Fallunterscheidung *)
- 'o','O' : Oeffnen;
- 'e','E' : BEGIN
- Eingeben(Datensatz);
- If Datensatz.Name <> '' then
- Einfuegen(Datensatz);
- END;
- 's','S' : Suchen; (* <--- NEU *)
- 'r','R' : Sortieren; (* <--- NEU *)
- 'l','L' : Loeschen; (* <--- NEU *)
- 'a','A' : Ausgabe; (* <--- NEU *)
- 'c','C' : Schliessen;
- 'q','Q' : BEGIN (* Programm verlassen ? *)
- ClrScr; (* Bildschirm loeschen *)
- (* Ueberschrift *)
- WriteLn(' ##### Programm beenden #####');
- WriteLn; (* Zwei Leerzeilen *)
- WriteLn;
- (* Sicherheitsabfrage *)
- Write(' Programm verlassen ');
- Write('(Datei geschlossen !?) ? (j/n) ');
- ReadLn(Wahl);
- IF (Wahl IN ['j','J']) THEN
- Wahl := 'q' (* Anzeigen, dass Programmende *)
- ELSE
- Wahl := '0'; (* Weiter geht's ! *)
- END;
- END;
- UNTIL (Wahl IN ['q','Q']); (* Benutzer will raus ! *)
- END.