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