Musterlösung zu Aufgabe 4 -- PersonsList.m2


IMPLEMENTATION MODULE PersonsList;
IMPORT Persons;
FROM StdIO IMPORT FILE;

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

   (* Separator is whiteSpace - 
    * no check !!!
    * number: the actually read number of records 
    * TRUE, if number > 0, otherwise FALSE
    *)
  BEGIN
    i:= 1;
    WHILE (i <= NumberOfPers) AND 
		Persons.ReadRec(fromFile, persList[i]) 
    DO
       INC(i);
    END;
    IF i<=NumberOfPers 
       (*Loop terminated with Persons.ReadRec = False*)
    THEN
       number := i-1;
    ELSE
       number := i;
    END;

    IF number > 0 THEN
	RETURN TRUE
    ELSE
	RETURN FALSE
    END;
  END InitPersList;

  PROCEDURE WriteRecords(
			f: FILE; pList: PersList; 
			number : CARDINAL; ind: RangeSet);
  (* writes a set of records, defined by ind, 
   * to open stream f
   *)
  	VAR i: CARDINAL;
  BEGIN
    FOR i:=1 TO number DO
	IF i IN ind THEN
		Persons.WriteRec(f,pList[i]);
	END;
    END;
  END WriteRecords;


  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''
   *)
  
    VAR 
	minInd,i,j,tmp: CARDINAL;

  BEGIN
	FOR i := 1 TO number DO
	  res[i] := i;
   	END;

	FOR i:=1 TO number-1 DO
	  minInd := i;
	  FOR j:=i+1 TO number DO
	    IF cmp(a[res[j]],a[res[minInd]]) THEN
	      minInd := j;
	    END;
	  END;
	  tmp := res[i];
	  res[i] := res[minInd];
	  res[minInd] := tmp;
	END;
  END Sort;
  
  
  PROCEDURE linSearch( VAR p: Persons.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''
   *)

  VAR 
	i: CARDINAL;
  BEGIN
	res := RangeSet{};
	i := 1;
	WHILE (i <= number) & less(persList[ind[i]],p) DO
		INC(i);
	END;

	WHILE (i <= number) & equal(persList[ind[i]],p) DO
		INCL(res,ind[i]);
		INC(i);
	END;
  END linSearch;
BEGIN
END PersonsList.

Musterlösung zu Aufgabe 4 || Übungen || Vorlesung || SS 97 || SAI

Franz Schweiggert, 13.06.1997