home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* L_SORT.PAS *)
- (* *)
- (* Das Programm demonstriert das Sortieren von Listen aus *)
- (* Einträgen mit mehreren Teilfeldern nach vorgegebenen *)
- (* Prioritäten. Die wichtigste Aufgabe übernimmt die *)
- (* Prozedur "LargeSort". *)
- (* *)
- (* (c) 1989 Jens Pionczewski & TOOLBOX *)
- (*------------------------------------------------------- *)
- {$A+,B-,D+,F-,I-,L-,O-,R-,S-,V-}
- (* Größtmögliche Geschwindigkeit, kleinster Code *)
- {$N-} (* Kein Coprozessor vorhanden *)
- {$E-} (* Keine Emulation nötig *)
-
- {$M 65520,0,655360} (* Maximaler Stack und Heap *)
-
- PROGRAM LargeSortDemo;
-
- USES Dos,Crt;
-
- CONST MaxElems = 9000;
- SubFieldStr : STRING = '12345';
- ListFileName : STRING = 'LISTFILE.TMP';
-
- TYPE SortRec = RECORD
- Field_1 : CHAR;
- Field_2 : CHAR;
- Field_3 : CHAR;
- Field_4 : CHAR;
- Field_5 : CHAR
- END;
- ElemType = ^SortRec;
-
- VAR ElemList : ARRAY [1..MaxElems] OF ElemType;
- SortString : STRING;
- AnzElems : LONGINT;
- h, m, s, hs : WORD;
- ListFile : FILE OF SortRec;
- (* Diese Datei enthält die unsortierte Liste. *)
- ch : CHAR;
-
- FUNCTION Vergleich (a, b : LONGINT; level : BYTE) : BOOLEAN;
- BEGIN
- CASE SortString [level] OF
- '1': Vergleich :=
- ElemList[a]^.Field_1 <= ElemList[b]^.Field_1;
- '2': Vergleich :=
- ElemList[a]^.Field_2 <= ElemList[b]^.Field_2;
- '3': Vergleich :=
- ElemList[a]^.Field_3 <= ElemList[b]^.Field_3;
- '4': Vergleich :=
- ElemList[a]^.Field_4 <= ElemList[b]^.Field_4;
- '5': Vergleich :=
- ElemList[a]^.Field_5 <= ElemList[b]^.Field_5;
- END;
- END; (* Vergleich *)
-
- PROCEDURE Tauschen (a, b : LONGINT);
- VAR HilfElem : ElemType;
- BEGIN
- HilfElem := ElemList [a];
- ElemList [a] := ElemList [b];
- ElemList [b] := HilfElem
- END; (* Tauschen *)
-
- PROCEDURE QuickSort (anf, ende: LONGINT; level : BYTE);
- VAR i, j, trenn : LONGINT;
- BEGIN
- i := anf;
- j := ende;
- trenn := (anf + ende) SHR 1;
- REPEAT
- WHILE (Vergleich (i, trenn, level) AND (i < ende)) DO
- Inc (i);
- WHILE (Vergleich (trenn, j, level) AND (j > anf)) DO
- Dec (j);
- IF i < j THEN
- Tauschen (i,j)
- ELSE IF i < trenn THEN
- Tauschen (i,trenn)
- ELSE IF j > trenn THEN
- Tauschen (j,trenn)
- UNTIL i >= j;
- IF anf < j THEN QuickSort (anf, j, level);
- IF i < ende THEN QuickSort (i, ende, level)
- END; (* QuickSort *)
-
- PROCEDURE LargeSort (left, right : LONGINT; level : BYTE);
- VAR Lindex, Rindex : LONGINT;
- BEGIN
- QuickSort (left, right, level);
- IF level < Length (SortString) THEN BEGIN
- Lindex := left;
- Rindex := Lindex;
- WHILE Lindex < right DO BEGIN
- WHILE (Vergleich (Rindex, Lindex, level) AND
- (Rindex <= right)) DO
- Inc (Rindex);
- IF Lindex < Rindex - 1 THEN
- LargeSort (Lindex, Rindex - 1, level + 1);
- Lindex := Rindex
- END;
- END;
- END; (* LargeSort *)
-
- PROCEDURE DelList;
- VAR i : LONGINT;
- BEGIN
- WriteLn;
- WriteLn (' Deleting list ...');
- FOR i := 1 TO AnzElems DO
- Dispose (ElemList [i]);
- AnzElems := 0
- END; (* DelList *)
-
- PROCEDURE Initialize;
- VAR i, NewAnz : LONGINT;
- BEGIN
- WriteLn;
- WriteLn (AnzElems, ' entries were in list');
- WriteLn;
- Write ('Enter new number of entries : ');
- ReadLn (NewAnz);
- IF NewAnz > MaxElems THEN BEGIN
- WriteLn;
- WriteLn;
- WriteLn ('Number too large.')
- END ELSE BEGIN
- DelList;
- WriteLn;
- IF NewAnz = 0 THEN
- WriteLn ('No entries in list.')
- ELSE BEGIN
- AnzElems := NewAnz;
- WriteLn (AnzElems,' entries in new list.');
- WriteLn;
- WriteLn ('Generating some random characters ...');
- WriteLn;
- FOR i:=1 TO AnzElems DO BEGIN
- New (ElemList [i]);
- WITH ElemList [i]^ DO BEGIN
- Field_1 := CHAR (Random (26) + 65);
- Field_2 := CHAR (Random (26) + 65);
- Field_3 := CHAR (Random (26) + 65);
- Field_4 := CHAR (Random (26) + 65);
- Field_5 := CHAR (Random (26) + 65)
- END;
- END;
- Assign (ListFile, ListFileName);
- {$I-}
- Rewrite (ListFile);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn ('Cannot open file ' + ListFileName)
- END ELSE BEGIN
- WriteLn ('Creating file ', ListFileName, ' ...');
- FOR i := 1 TO AnzElems DO
- Write (ListFile, ElemList [i]^);
- Close (ListFile);
- END;
- END;
- END;
- Delay (1500);
- END; (* Initialize *)
-
- PROCEDURE SortSpecs (SubFieldString : STRING;
- VAR NewStr : STRING);
- VAR i, Len : BYTE;
- BEGIN
- Len := Length (SubFieldString);
- Write ('Enter new priority-string (exmpl: "514") : ');
- ReadLn (NewStr);
- Delete (NewStr, Len + 1, 255);
- (* Länge auf Anzahl der Teilfelder eines Eintrages be- *)
- (* grenzen und anschließend nicht erlaubte oder doppelt *)
- (* vorhandene Zeichen löschen. *)
- i := 1;
- WHILE i <= Len DO
- IF (Pos (NewStr [i], SubFieldString) = 0) OR
- (Pos (NewStr [i], NewStr) < i) THEN BEGIN
- Delete (NewStr, i, 1);
- Dec (Len)
- END ELSE Inc (i);
- WriteLn;
- WriteLn ('Priority-string is : ',NewStr);
- Delay (1000);
- END; (* SortSpecs *)
-
- PROCEDURE ListToScreen;
- VAR ch : CHAR;
- i : LONGINT;
- BEGIN
- IF AnzElems = 0 THEN BEGIN
- WriteLn; WriteLn ('No entries in list.');
- Delay (1000);
- END ELSE BEGIN
- ClrScr;
- WriteLn (' Field 1 Field 2 Field 3',
- ' Field 4 Field 5'); WriteLn;
- FOR i:=1 TO AnzElems DO
- WITH ElemList [i]^ DO BEGIN
- WriteLn (Field_1:9, Field_2:11, Field_3:11,
- Field_4:11, Field_5:11);
- IF ((i MOD 21) = 0) THEN BEGIN
- WriteLn;
- Write (' Press any key ',
- 'to continue, ESC to stop.');
- ch := ReadKey;
- ClrScr;
- WriteLn (' Field 1 Field 2 Field 3',
- ' Field 4 Field 5'); WriteLn;
- END;
- IF ch = #27 THEN Exit;
- IF i = AnzElems THEN BEGIN
- WriteLn;
- WriteLn (' Finished. Press any key.');
- ch := ReadKey;
- END;
- END;
- END;
- END; (* ListToScreen *)
-
- PROCEDURE ListToFile;
- VAR FileName : STRING;
- SavedListFile : TEXT;
- ch : CHAR;
- i : LONGINT;
- BEGIN
- WriteLn;
- WriteLn;
- Write ('Enter filename : ');
- ReadLn (FileName);
- WriteLn;
- Assign (SavedListFile, FileName);
- {$I-}
- Rewrite (SavedListFile);
- {$I+}
- IF IOResult <> 0 THEN
- WriteLn ('Error : Cannot open file ',
- FileName, ' . Press any key.')
- ELSE BEGIN
- WriteLn ('Writing ', AnzElems, ' entries to file ' +
- FileName + ' ...');
- WriteLn (SavedListFile, ' Field 1 Field 2',
- ' Field 3 Field 4 Field 5');
- FOR i := 1 TO AnzElems DO
- WITH ElemList [i]^ DO
- WriteLn (SavedListFile, Field_1:9, Field_2:11,
- Field_3:11, Field_4:11, Field_5:11);
- WriteLn; WriteLn; WriteLn ('Finished.');
- Delay (1000);
- Close (SavedListFile);
- END;
- END; (* ListToFile *)
-
- PROCEDURE View_Save;
- VAR ch : CHAR;
- BEGIN
- ClrScr;
- WriteLn; WriteLn (' ESC Exit (V)iew (S)ave');
- ch := ReadKey;
- CASE ch OF
- 's','S' : ListToFile;
- 'v','V' : ListToScreen
- END;
- END; (* View_Save *)
-
- PROCEDURE ReadListFile;
- VAR i : LONGINT;
- BEGIN
- WriteLn;
- WriteLn ('Reading file ' + ListFileName + ' ...');
- Assign (ListFile, ListFileName);
- {$I-}
- Reset (ListFile);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn ('Cannot open file ' + ListFileName)
- END ELSE BEGIN
- FOR i := 1 TO AnzElems DO
- Read (ListFile, ElemList [i]^);
- Close (ListFile);
- END;
- END; (* ReadListFile *)
-
- PROCEDURE Arrange;
- VAR ch : CHAR;
- BEGIN
- IF (SortString <> '') AND (AnzElems <> 0) THEN BEGIN
- ReadListFile;
- WriteLn; WriteLn ('Sorting now ...');
- SetTime (0, 0, 0, 0);
- LargeSort (1, AnzElems, 1);
- GetTime (h, m, s, hs);
- WriteLn;
- WriteLn ('Time used for sorting : ',m,' : ',s,
- ' : ',hs)
- END ELSE BEGIN
- WriteLn;
- WriteLn;
- IF AnzElems = 0 THEN
- Write ('No entries found.')
- ELSE
- Write ('No specifications given.');
- WriteLn (' List not sorted.')
- END;
- WriteLn;
- WriteLn ('Press any key.');
- ch := ReadKey
- END; (* Arrange *)
-
- PROCEDURE Menu (VAR ch : CHAR);
- BEGIN
- ClrScr;
- WriteLn (' ESC Quit (I)nitialize (S)ort',
- 'specifications (A)rrange (V)iew/save ');
- WriteLn ('-----------------------------------',
- '--------------------------------------------');
- WriteLn; WriteLn;
- WriteLn (' Entries in list : ',AnzElems);
- WriteLn;
- WriteLn (' SortSpecification : »',SortString,'«');
- WriteLn;
- WriteLn (' Time used for last sorting : ',h,' h ',
- m,' min ',s,' s ',hs,' 1/100');
- WriteLn;
- WriteLn (' ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ',
- '─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ');
- WriteLn;
- ch := ReadKey
- END; (* Menu *)
-
-
- BEGIN (* Hauptprogramm *)
- Randomize;
- AnzElems := 0;
- SortString := '';
- h := 0; m := 0; s := 0; hs := 0;
- REPEAT
- Menu (ch);
- CASE ch OF
- 'i','I' : Initialize;
- 's','S' : SortSpecs (SubFieldStr, SortString);
- 'v','V' : View_Save;
- 'a','A' : Arrange;
- ELSE END;
- UNTIL ch = #27;
- DelList;
- Assign (ListFile, ListFileName);
- {$I-}
- Erase (ListFile)
- {$I+}
- END.
- (* ------------------------------------------------------ *)
- (* Ende von L_SORT.PAS *)
-