Musterlösung zu Aufgabe 5 -- Persons.m2
IMPLEMENTATION MODULE Persons;
FROM FtdIO IMPORT Done, FreadCard, FwriteCard,
FwriteString, FreadString, FwriteLn, FwriteChar;
FROM Strings IMPORT StrCmp;
FROM StdIO IMPORT FILE, MODE, stderr, stdout,
stdin, Fopen, Feof;
FROM Storage IMPORT ALLOCATE;
CONST
NameLength = 30;
PhoneLength = 15;
TYPE
Name = ARRAY[0..NameLength] OF CHAR;
Phone = ARRAY [0..PhoneLength] OF CHAR;
Date = RECORD
day : CARDINAL[1..31];
month: CARDINAL[1..12];
year: CARDINAL[1900..2100];
END;
PersRec = RECORD
famName: Name;
firstName: Name;
birthDate: Date;
phone: Phone;
END;
PersDat = POINTER TO PersRec;
PROCEDURE WriteRec(f: FILE; pers: PersDat);
(* f - open stream for writing
* writes data with one blank as separator
*)
BEGIN
WITH pers^ DO
FwriteString(f,famName);
FwriteChar(f,' ');
FwriteString(f,firstName);
FwriteChar(f,' ');
FwriteCard(f,birthDate.day,0);
FwriteChar(f,' ');
FwriteCard(f,birthDate.month,0);
FwriteChar(f,' ');
FwriteCard(f,birthDate.year,0);
FwriteChar(f,' ');
FwriteString(f,phone);
FwriteLn(f);
END;
END WriteRec;
PROCEDURE ReadRec(f:FILE; VAR pers: PersDat):BOOLEAN;
(* f - open stream for reading !
* reads one record assuming whitespace as separator
* TRUE, if done, otherwise FALSE
*)
VAR i, d,m,y: CARDINAL;
BEGIN
IF Feof(f)
THEN
RETURN FALSE
END;
NEW(pers);
IF pers = NIL
THEN
RETURN FALSE
END;
(* necessary because of type compatibility *)
WITH pers^ DO
FreadString(f,famName);
FreadString(f,firstName);
FreadCard(f,d); birthDate.day:=d;
FreadCard(f,m); birthDate.month:=m;
FreadCard(f,y); birthDate.year:=y;
FreadString(f,phone);
END;
IF Done
THEN
RETURN TRUE
ELSE
RETURN FALSE
END;
END ReadRec;
BEGIN
END Persons.
Musterlösung zu Aufgabe 5 || Übungen || Vorlesung || SS 97 || SAI
Franz Schweiggert, 13.06.1997