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