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