SAI || Vorlesungen im SS 97 || Programmieren II / Allg. Informatik II || Übungen

Übungen zu Programmieren II / Allg. Informatik II SS 97
Blatt 3 (05.05.97 - 15.05.97)


Aufgabe 3 ( Punkte)

Das in der letzten Aufgabe (Blatt 2) zu erstellende Programm soll nun nach folgenden Vorgaben restrukturiert und erweitert werden:

(* ----------- Data of a Person with its Operations -------- *)
  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;

     PersDat = RECORD
                 famName: Name;
                 firstName: Name;
                 birthDate: Date;
                 phone: Phone;
               END;

  PROCEDURE nameIsLess(x,y: PersDat): BOOLEAN;
  (* returns TRUE, if x.famName less than y.famName *)
  PROCEDURE nameIsEqual(x,y: PersDat):BOOLEAN;
  (* returns TRUE, if x.famName = y.famName *)

  PROCEDURE isYounger(x,y: PersDat): BOOLEAN;
  (* returns TRUE, if person x is younger than person y *)
  PROCEDURE sameAge(x,y: PersDat): BOOLEAN;
  (* returns TRUE, if persons x and y have the same birthdate *)

  PROCEDURE WriteRec(f: FILE; pers: PersDat);
  (* f - open stream for writing 
   * writes data with one blank as separator 
   *)
  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
   *)

(* ----------- List of Person Data and Operations ------------ *)

  CONST
     NumberOfPers = 50;
  TYPE
     Range = [1..NumberOfPers];
     RangeSet = SET OF Range;

     PersList = ARRAY Range OF PersDat;
     IndexList = ARRAY Range OF Range;
  VAR 
     persList: PersList;
     nameList, ageList: IndexList;

  TYPE CmpPersDat = PROCEDURE(PersDat, PersDat):BOOLEAN;

  PROCEDURE InitPersList(
			 fromFile: FILE;
			 VAR persList: PersList; 
			 VAR number: CARDINAL): BOOLEAN;

   (* Separator is whiteSpace -  no check !!!
    * number: the actually read number of records 
    * TRUE, if number > 0, otherwise FALSE
    *)

  PROCEDURE WriteRecords(
			f: FILE; pList: PersList; 
			number : CARDINAL; ind: RangeSet);
  (* writes a set of records, defined by ``ind'', 
   * to open stream ``f''
   *)

  PROCEDURE Sort(	
		a: PersList;
		number: CARDINAL;
		cmp:CmpPersDat;
		VAR res: IndexList);
  (* sorts the records in ``a'' by building a sorted
   * index list ``res''
   * comparing by function ``cmp''
   *)
  
  PROCEDURE linSearch( VAR p: PersDat; number: CARDINAL;
			less, equal: CmpPersDat;
			persList: PersList;
			ind: IndexList;
			VAR res: RangeSet);
  (* the caller is responsible for consistency between
   * compare-procedures ``less'', ``equal'', 
   * index list ``ind'' and definiton of components in ``p''
   *
   * defines a set of indices ``res'' of list ``persList''
   * containing records matching with components 
   * defined in ``p'' using corresponding sorted index list
   *)

Aufruf des Programmes:

phones [ -n name | -b birthdate] inputfile 

Das von Ihnen erwartete Programm phones soll also folgende Aufgaben erfüllen:

a)
Die Daten sollen jetzt grundsätzlich aus einer Datei gelesen werden.
b)
Diese Personendaten werden anschließend sortiert nach Name (famName) und Alter (birthDate). Dazu werden zwei Indexfelder verwendet, die die Sortierung enthalten (letzte Aufgabe - Blatt 2).
c)
Die Sortierfunktion (Algorithmus z.B. lineares Sortieren) soll als Parameter das Array persList, die Anzahl der tatsächlich belegten Elemente (oberster gültiger Index), die Prozedur, die den Vergleich bestimmt, sowie das Ergebnisfeld (Indexfeld) erhalten. (letzte Aufgabe - Blatt 2)
d)
Wird das Programm mit der Option -n name aufgerufen, so sollen alle Datensätze an die Standardausgabe ausgegeben werden, bei denen die Komponente famName mit dem Argument name übereinstimmt.
Sinngemäß gilt dies bei -b birthdate
e)
Ist keine Option angegeben, so sollen alle Datensätze einmal sortiert nach famName und einmal sortiert nach birthDate an die Standardausgabe ausgegeben werden.
f)
Fehlermeldungen sollen grundsätzlich an stderr ausgegeben werden!

Viel Erfolg!


SAI || Vorlesungen im SS 97 || Programmieren II / Allg. Informatik II || Übungen

Franz Schweiggert, 29.04.1997