home *** CD-ROM | disk | FTP | other *** search
- Uses Dos,Crt,HRS;
- (*$M 65520,0,655360,R-,S-,I-,V-,B-,O-,A+ *)
- (*****************************************************************************)
- Type String60 = String[60];
-
- ListTyp = (StrTyp,WordTyp);
-
- StrListPtr = ^StringListe;
-
- StringListe = Record
- Next : StrListPtr;
- Info : String60;
- End;
-
- WordListPtr = ^WordListe;
-
- WordListe = Record
- Next : WordListPtr;
- W : Word;
- End;
-
- Const MaxWord = 65535;
- Ret = #13;
- Esc = #27;
- CrLf = #10+Ret;
- Chars : SetOfChar = [Ret,Esc];
- (*****************************************************************************)
- Var Proc : SortFunc;
- P,P2 : Pointer;
- LSize : Word;
- LTyp : ListTyp;
- LT,C,Task : Char;
- Art : Char;
- ArtW : Word;
- I,Y : Byte;
- H1,H2,M1,
- M2,S1,S2,
- S100,S200 : Word;
- Diff : LongInt;
- (*****************************************************************************)
- Procedure DelZeile;
- Begin
- GotoXY(1,WhereY);ClrEol;
- End;
- (*****************************************************************************)
- (* Die beiden folgenden Vergleichsfunktionen müßen,da sie über einen Zeiger *)
- (* aufgerufen werden,unbedingt "FAR" compiliert werden. *)
- (* *)
- (* Vergleichsfunktion für String *)
- (*****************************************************************************)
- (*$F+ *)
- Function StringCheck(P1,P2:Pointer;Para:Word):CompTyp;
- Var Test : CompTyp;
- M : LongInt;
- S1,S2 : String60;
- Begin
- S1 := StrListPtr(P1)^.Info;
- S2 := StrListPtr(P2)^.Info;
-
- M := Min(Length(S1),Length(S2));
-
- Test := Equal(StrListPtr(P1)^.Info[1],StrListPtr(P2)^.Info[1],M);
- If Test = Gleich Then
- If Not(Length(S1) = Length(S2)) Then
- If Length(S1) > Length(S2) Then Test := Groesser
- Else Test := Kleiner;
-
- If Para <> 0 Then
- Begin
- If Test = Groesser Then Test := Kleiner Else
- If Test = Kleiner Then Test := Groesser;
- End;
-
- StringCheck := Test;
- End;
- (*****************************************************************************)
- (* Vergleichsfunktion für Word *)
- (*****************************************************************************)
- Function WordCheck(P1,P2:Pointer;Para:Word):CompTyp;
- Var Test : CompTyp;
- W1,W2 : Word;
- Begin
- W1 := WordListPtr(P1)^.W;
- W2 := WordListPtr(P2)^.W;
-
- Test := Gleich;
- If W1 > W2 Then Test := Groesser;
- If W2 > W1 Then Test := Kleiner;
-
- If Para <> 0 Then
- Begin
- If Test = Groesser Then Test := Kleiner Else
- If Test = Kleiner Then Test := Groesser;
- End;
-
- WordCheck := Test;
- End;
- (*$F- *)
- (*****************************************************************************)
- Procedure ShowList(P:Pointer;C:Char);
- Var L : Word;
- Begin
- L := 0;
- While P <> Nil Do
- Begin
- Inc(L);
- Write(' ',L:6,' : ');
- If C = '1' Then
- Begin
- Writeln(StrListPtr(P)^.Info);
- P := StrListPtr(P)^.Next;
- End Else
- Begin
- Writeln(WordListPtr(P)^.W);
- P := WordListPtr(P)^.Next;
- End;
- If KeyPressed Then
- Begin
- DummyRead;
- DummyRead;
- End;
- End;
- End;
- (*****************************************************************************)
- (* Löscht durch P und Typ referenzierte Liste *)
- (*****************************************************************************)
- Procedure DelList(Var P:Pointer;Typ:ListTyp);
- Var L : Word;
- P2 : Pointer;
- Begin
- L := 0;
- While P <> Nil Do
- Begin
- P2 := P;
- If Typ = STrTyp Then FreeMem(P,SizeOf(StringListe))
- Else FreeMem(P,SizeOf(WordListe));
- P := WordListPtr(P2)^.Next;
- End;
- End;
- (*****************************************************************************)
- (* Erzeugt Liste vom Typ "Typ" mit "Size" Elementen *)
- (*****************************************************************************)
- Procedure MakeList(Var Liste:Pointer;Typ:ListTyp;Size:Word);
- Var P1,P2,Head : Pointer;
- L : Word;
- LSize : Word;
- Begin
- If Typ = StrTyp Then LSize := SizeOf(StringListe)
- Else LSize := SizeOf(WordListe);
- GetMem(Head,LSize);
- StrListPtr(Head)^.Next := Nil;
- P1 := Head;
-
- For L := 2 To Size Do
- Begin
- GetMem(P2,LSize);
- StrListPtr(P2)^.Next := StrListPtr(P1)^.Next;
- StrListPtr(P1)^.Next := P2;
- End;
-
- Liste := Head;
- End;
- (*****************************************************************************)
- (* Erzeugt eine Kopie der durch P und Typ referenzierten Liste *)
- (*****************************************************************************)
- Function CopyList(P:Pointer;Typ:ListTyp;Size:Word):Pointer;
- Var P2,Head : Pointer;
- Begin
- MakeList(P2,Typ,Size);
- Head := P2;
-
- While P <> Nil Do
- Begin
- If Typ = StrTyp Then StrListPtr(P2)^.Info := StrListPtr(P)^.Info
- Else WordListPtr(P2)^.W := WordListPtr(P)^.W;
- P := StrListPtr(P)^.Next;
- P2 := StrListPtr(P2)^.Next;
- End;
- CopyList := Head;
- End;
- (*****************************************************************************)
- (* Füllt Liste vom Typ "Typ" mit Zufallswerten *)
- (*****************************************************************************)
- Procedure FillList(P:Pointer;Typ:ListTyp);
- Var L : Word;
- K : Byte;
- S : String60;
- Function RandomStr:String60;
- Var K : Byte;
- S : String60;
- Begin
- S := '';
- For K := 1 To Succ(Random(59)) Do S := S + Chr(Random(25)+66);
- RandomStr := S;
- End;
- Begin
- L := 0;
- While P <> Nil Do
- Begin
- If Typ = StrTyp Then StrListPtr(P)^.Info := RandomStr
- Else WordListPtr(P)^.W := Random(MaxWord);
- P := StrListPtr(P)^.Next;
- End;
- End;
- (*****************************************************************************)
- (* Hauptprogramm *)
- (*****************************************************************************)
- Begin
- TextAttr := LightGray Shl 4;
- ClrScr;
-
- Writeln(' SORTIERTEST (c) H.Rüter 7/91',CrLf);
-
- TextAttr := LightGray;
-
- Randomize;
-
- Repeat
- Window(2,2,79,24);
- ClrScr;
- Writeln(CrLf,' Listentyp (1) = String (1..60 Zeichen)');
- Writeln(' (2) = Word-Zahlen');
-
- LT := GetChar(['1','2']);
- LTyp := ListTyp(Ord(LT)-Ord('1'));
-
- (*$IFDEF VER40 *)
- If LTyp = StrTyp Then Proc := @StringCheck
- Else Proc := @WordCheck;
- (*$ELSE *)
- If LTyp = StrTyp Then Proc := StringCheck
- Else Proc := WordCheck;
- (*$ENDIF *)
-
- Write(CrLf,' Listenelemente : ');
- Readln(LSize);
- MakeList(P,LTyp,LSize);
- Write(' Zufallsgenerierung : ');
-
- FillList(P,LTyp);
- Writeln('√');
-
- P2 := CopyList(P,LTyp,LSize);
-
- Y := WhereY;
-
- Repeat
- Window(2,Succ(Y),79,24);
-
- ClrScr;
- Write(' Task : (Q)uick (A)ustausch Aus(w)ahl (E)infügen');
-
- Task := GetChar(['q','Q','a','A','w','W','e','E']);
- DelZeile;
- Write(' Sortierung : (A)ufsteigend A(b)steigend');
-
- Art := GetChar(['a','A','b','B']);
- If Upcase(Art) = 'A' Then ArtW := 0
- Else ArtW := 1;
- Writeln(' ',Upcase(Art));
-
- GetTime(H1,M1,S1,S100);
-
- Case UpCase(Task) Of
- 'Q' : Begin Write(' QuickSort ');QuickSort(P,Einfach,Proc,ArtW);End;
- 'A' : Begin Write(' AustauschSort');AustauschSort(P,Einfach,Proc,ArtW);End;
- 'W' : Begin Write(' AuswahlSort ');AuswahlSort(P,Einfach,Proc,ArtW);End;
- 'E' : Begin Write(' EinfuegeSort ');EinfuegeSort(P,Einfach,Proc,ArtW);End;
- End;
-
- GetTime(H2,M2,S2,S200);
- Diff := ((H2 * 360000 + M2 * 6000 + S2 * 100 + S200 ) -
- (H1 * 360000 + M1 * 6000 + S1 * 100 + S100 ));
-
- Writeln(' : ',Diff div 100,',',Diff mod 100 ,' Sekunden',CrLf);
- Write(' Liste zeigen : <RETURN> nicht zeigen : <ESC>');
-
- C := GetChar(Chars);
- DelZeile;
-
- If C = Ret Then
- Begin
- Writeln;
- Window(2,10,79,24);
- ShowList(P,LT);
- End;
-
- Writeln;
- Write(' Erneut sortieren : <RETURN> Neue Liste oder Ende : <ESC>');
- C := GetChar(Chars);
- DelZeile;
-
- Write(' Bitte ein wenig warten');
- If C = Ret Then
- Begin
- DelList(P,LTyp);
- P := CopyList(P2,LTyp,LSize);
- End;
- DelZeile;
-
- Until C = Esc;
-
- DelList(P,LTyp);
- DelLIst(P2,LTyp);
-
- Write(' Weiter : <RETURN> Programmende : <ESC>');
-
-
- C := GetChar(Chars);
-
- Until C = Esc;
-
- End.
- (*****************************************************************************)