home *** CD-ROM | disk | FTP | other *** search
-
- MODULE SortDemo; (* demonstriert den Gebrauch von "Sorting" *)
-
-
- FROM DOSCALL IMPORT InputReady, (* Importliste *)
- ReadConsoleNoEcho;
- FROM InOut IMPORT CloseInput,
- Done,
- OpenInput,
- Read,
- ReadCard,
- ReadString,
- WriteCard,
- WriteLn,
- WriteString;
- FROM Sorting IMPORT ShellSort,
- SortType;
- FROM String IMPORT Compare,
- Substr;
- FROM SYSTEM IMPORT STRING;
-
-
- VAR first,last : CARDINAL;
- Choice : CHAR;
- Ascending,
- Quit : BOOLEAN;
- Data : ARRAY [0..1000] OF SortType; (* das zu sortierende Feld *)
- FileName : STRING[80]; (* Name der Datei mit Daten *)
-
-
- (* -- hier folgen die in "Lower" zu übergebenden Vergleichsoperationen --- *)
-
-
- PROCEDURE LowerName (VAR a,b : SortType) : BOOLEAN;
-
- (* Sortierung nach Namen *)
-
- BEGIN
- RETURN (Compare(b.Name,a.Name) > 0);
- END LowerName;
-
-
- PROCEDURE LowerAge (VAR a,b : SortType) : BOOLEAN;
-
- (* Sortierung nach Alter *)
-
- VAR aYear,bYear : STRING[4];
- aMonth,bMonth,
- aDay,bDay : STRING[2];
-
- BEGIN
- Substr (a.Birthday,1,2,aDay); (* Datum entschlüsseln... *)
- Substr (a.Birthday,4,2,aMonth);
- Substr (a.Birthday,7,4,aYear);
- Substr (b.Birthday,1,2,bDay);
- Substr (b.Birthday,4,2,bMonth);
- Substr (b.Birthday,7,4,bYear);
- IF Compare(aYear,bYear)=0 THEN (* ... und vergleichen *)
- IF Compare(aMonth,bMonth)=0 THEN
- RETURN (Compare(aDay,bDay) > 0);
- ELSE
- RETURN (Compare(aMonth,bMonth) > 0);
- END;
- ELSE
- RETURN (Compare(aYear,bYear) > 0);
- END;
- RETURN TRUE;
- END LowerAge;
-
-
- PROCEDURE LowerSalary (VAR a,b : SortType) : BOOLEAN;
-
- (* Sortierung nach Einkommen *)
-
- BEGIN
- RETURN (a.Salary < b.Salary);
- END LowerSalary;
-
-
-
- (* ------- Einlesen der zu sortierenden Daten aus einer Textdatei -------- *)
-
- PROCEDURE ReadData ();
-
- VAR EOL : CHAR;
-
- BEGIN
- WriteLn ();
- WriteString ("Name der Datei mit Daten: ");
- ReadString (FileName);
- WriteLn ();
- OpenInput (FileName); (* Textdatei als Eingabestream öffnen *)
- IF NOT Done THEN
- WriteLn ();
- WriteString ("Fehler: Datei nicht gefunden!");
- WriteLn ();
- HALT ();
- END;
- first := 1;
- last := 0;
- REPEAT
- INC (last);
- WITH Data[last] DO (* Elemente einlesen... *)
- ReadString (Name);
- ReadString (Birthday);
- ReadCard (Salary);
- Read (EOL); (* nächste Zeile *)
- END;
- UNTIL NOT Done; (* ... bis Dateiende erreicht *)
- CloseInput (); (* Textdatei als Eingabestream schließen *)
- END ReadData;
-
-
- PROCEDURE DisplayData ();
-
- VAR Count : CARDINAL;
-
- BEGIN
- WriteLn ();
- WriteLn ();
- WriteString (" Name ");
- WriteString (" Geburtstag ");
- WriteString ("Einkommen");
- WriteLn ();
- WriteLn ();
- FOR Count := first TO last DO (* Ausgabe der Liste auf Bildschirm *)
- WITH Data[Count] DO
- WriteCard (Count,3);
- WriteString (". ");
- WriteString (Name);
- WriteString (Birthday);
- WriteCard (Salary,6);
- WriteLn ();
- END;
- END;
- WriteLn ();
- WriteLn ();
- END DisplayData;
-
-
- BEGIN
- Quit := FALSE;
- ReadData ();
- REPEAT
- DisplayData ();
- WriteString ("Sortieren nach (A)lter,(E)inkommen oder (N)amen ? ");
- WriteLn ();
- WriteString ("Kleinbuchstabe=aufsteigende,");
- WriteString ("Grossbuchstabe=absteigende Reihenfolge: ");
- Read (Choice);
- Ascending := (ORD(Choice) >= 96); (* Kleinbuchstabe ? *)
- CASE Choice OF
- "N","n" : ShellSort (Data,first,last,LowerName,Ascending);
- | "A","a" : ShellSort (Data,first,last,LowerAge,Ascending);
- | "E","e" : ShellSort (Data,first,last,LowerSalary,Ascending);
- ELSE
- Quit := TRUE;
- END;
- UNTIL Quit;
- WriteLn ();
- END SortDemo.