Musterlösung zu Aufgabe 4 -- Main.m2
MODULE Main;
IMPORT Persons;
IMPORT PersonsList;
IMPORT Arguments;
FROM SysExit IMPORT Exit;
FROM Strings IMPORT StrCmp;
FROM StdIO IMPORT FILE, MODE, stderr, stdout,
stdin, Fopen, Feof;
FROM FtdIO IMPORT Done, FreadCard, FwriteCard,
FwriteString, FreadString, FwriteLn, FwriteChar;
VAR
persList: PersonsList.PersList;
nameList, ageList: PersonsList.IndexList;
fromFile: FILE;
inFile: ARRAY [0..255] OF CHAR;
nameFlag, birthDateFlag: BOOLEAN;
flag: CHAR;
i, number, d,m,y: CARDINAL;
p: Persons.PersDat;
matches: PersonsList.RangeSet;
BEGIN
Arguments.InitArgs(" [ -n name | -b birthdate] inputfile ");
nameFlag := FALSE;
birthDateFlag := FALSE;
WHILE Arguments.GetFlag(flag) DO
CASE flag OF
| 'n': Arguments.FetchString(p.famName);
nameFlag := TRUE;
| 'b': Arguments.FetchCard(d);
p.birthDate.day := d;
Arguments.FetchCard(m);
p.birthDate.month := m ;
Arguments.FetchCard(y);
p.birthDate.year := y ;
birthDateFlag := TRUE;
ELSE
Arguments.Usage;
END;
END;
IF nameFlag & birthDateFlag THEN
Arguments.Usage;
END;
IF NOT Arguments.GetArg(inFile)
THEN
Arguments.Usage;
END;
Arguments.AllArgs;
IF NOT Fopen(fromFile, inFile, read, TRUE) THEN
FwriteString(stderr, "Error: can't open ");
FwriteString(stderr,inFile);
FwriteLn(stderr);
Exit(1);
END;
IF NOT PersonsList.InitPersList(fromFile,persList, number) THEN
Exit(1);
END;
PersonsList.Sort(persList, number, Persons.nameIsLess, nameList);
PersonsList.Sort(persList, number, Persons.isYounger, ageList);
IF nameFlag
THEN
PersonsList.linSearch(p,number, Persons.nameIsLess, Persons.nameIsEqual,persList,nameList,matches);
IF matches = PersonsList.RangeSet{} THEN
FwriteString(stdout, "No match ");
FwriteLn(stdout);
ELSE
PersonsList.WriteRecords(stdout,persList,number,matches);
END;
ELSIF birthDateFlag
THEN
PersonsList.linSearch(p,number, Persons.isYounger, Persons.sameAge,persList,ageList,matches);
IF matches = PersonsList.RangeSet{} THEN
FwriteString(stdout, "no match");
FwriteLn(stdout);
ELSE
PersonsList.WriteRecords(stdout,persList,number,matches);
END;
ELSE
FwriteString(stdout, "Sorted by Name: ");
FwriteLn(stdout);
FOR i := 1 TO number DO
Persons.WriteRec(stdout,persList[nameList[i]]);
END;
FwriteString(stdout, "Sorted by Age: ");
FwriteLn(stdout);
FOR i := 1 TO number DO
Persons.WriteRec(stdout,persList[ageList[i]]);
END;
END;
END Main.
Musterlösung zu Aufgabe 4 || Übungen || Vorlesung || SS 97 || SAI
Franz Schweiggert, 13.06.1997