home *** CD-ROM | disk | FTP | other *** search
- { ********** Program Sort 3D se znázornêním porování ******** }
- { ****** program demonstruje pouziti jednotky hejbunit ****** }
- { * pri nazornem zobrazeni procedury QuickSort na obrazovce * }
-
- uses Dos, Obraz3D, Unhejb, Unobdel, Unvokno, Unmenu, Untimer, Crt, Unfront, Unpisbmp;
-
- const N : Integer = 60;
- Poc_Pom : Integer = 40;
- Metoda : Integer = 0;
- _Qsort = 1;
- _Qsortpar = 4;
- _Merge = 4;
- _Buble = 2;
- _Vyber = 3;
-
- _Nahodna = 1;
- _Vzestupna = 2;
- _Sestupna = 3;
-
- _Posl : Byte = 0;
-
- _Bar_Obyc = 5;
- _Bar_Proh = 14;
- _Bar_Por = 15;
-
- _Delay_Por = 10;
-
- Jit_Ven : Boolean = False;
-
- type Typ_Prvek = object(Typ_Integer)
- Klic : Integer;
- procedure Dodel_Anim_Prohod(var S_Kym : Typ_Prvek);
- end;
- Typdat = array[0..100]of Typ_Prvek;
- var
- Data : Typdat;
-
-
- procedure Cisla_Prvku(Zob : Byte);
- const Pomzob : Byte = 0;
- var S : string[5];
- K : Integer;
- Pom : _Bod3D;
- begin
- if Pomzob <> Zob then
- for K := 1 to N do
- begin
- Str(K, S);
- Pom := Hezky_Rozmistit(K)^;
- case Zob of
- 2 : Obrazovka.Smaz_Retez(Pom.X{&&-Pom.Z}+2, Pom.Y{&&+Pom.Z}, Pom.Z+1, 2, S, True);
- 1 : Obrazovka.Pis_Retez(Pom.X{&&-Pom.Z}+2, Pom.Y{&&+Pom.Z}, Pom.Z+1, 2, S, True)
- { zobrazeni prvku v obrazovce }
- end;
- end;
- Pomzob := Zob;
- end;
-
- const Cesta : array[1..4]of Typ_Instrukce = (Vm0, Jmpa, 0, Endc) ;
- const Menudef : string =
- '49 15 5 15 112 10 30 11 6 4'+ { posice [53, 11, 4] barva textu 15, barva zvyraznêného ⌐ádku 112, barva rámeçku 10}
- { rozmêr 30x11, 6 prvkû, zaçátek na çtvrtém }
- 'delay~ i 42 14 7 10 10 96 40 1 400 1'+ { editace çísla, posice [46, 10, 4], barva textu 10, barva rámeçku 10,
- { zvÿraznênÿ text téæ 96, poçáteçní hodnota 40, minimum 1 a maximum 400 }
- 'method~ v 31 15 9 15 112 10 20 7 5 1'+
- 'quicksort~o'+
- 'bublesort~o'+
- 'maxsort~o'+
- 'mergesort~o'+
- 'paralelni qsort~o';
- Menudef2 : string =
- 'Element numbers~v 21 16 5 15 112 10 30 4 2 2'+
- 'on~o'+
- 'off~o'+
- 'sequence~v 36 16 3 15 112 10 15 5 3 1'+
- '''random''~o'+
- 'increasing~o'+
- 'decreasing~o'+
- 'run~v 36 18 1 15 112 10 15 4 2 2'+
- 'start~o'+
- 'stop~o'+
- 'end~o';
- type
- Typ_Moje_Menu = object(Typ_Menu_Vyber)
- procedure Vm0;virtual;
- end;
-
- procedure Typ_Moje_Menu.Vm0;
- var C : Word;
- begin
- if KeyPressed then
- begin
- C := Byte(ReadKey);
- if C = 0 then C := 256* Byte(ReadKey);
- Zpracuj_Key(C);
- if (Sub_Menu^[5]^.Out_Hodnota = 2) or
- (Out_Hodnota = 6)
- then Jit_Ven := True
- else Jit_Ven := False;
- if (Sub_Menu^[3]^.Potvrzeno)
- then Cisla_Prvku(Sub_Menu^[3]^.Out_Hodnota);
- if Metoda <> Sub_Menu^[2]^.Out_Hodnota then
- begin
- Metoda := Sub_Menu^[2]^.Out_Hodnota;
- Jit_Ven := True;
- end;
- if Sub_Menu^[1]^.Out_Hodnota <> Poc_Pom then
- begin
- Poc_Pom := Sub_Menu^[1]^.Out_Hodnota;
- Unfront.set_Pomalost(Poc_Pom);
- end;
- if Sub_Menu^[5]^.Out_Hodnota = 2 then
- if Sub_Menu^[4]^.Potvrzeno then
- begin
-
- _Posl := Sub_Menu^[4]^.Out_Hodnota;
- for C := 1 to N do
- begin
- case _Posl of
- _Nahodna : Data[C].Klic := Random(1000);
- _Vzestupna : Data[C].Klic := C;
- _Sestupna : Data[C].Klic := N-C;
- end;
- Data[C].Vytvor(Data[C].Klic, 3,_Bar_Obyc,_Bar_Obyc, Strom_Ram);
- end;
- Sub_Menu^[4]^.__Stav_Menu := Sub_Menu^[4]^.__Stav_Menu and ($Ff xor __Potvrzena_Hodnota)
- end;
-
-
- end;
- end;
-
-
-
- type Typ_Pocitani = object(Typ_Vokynko)
- Porovnani, Prohozeni : Integer;
- constructor Init;
- procedure Nuluj;
- procedure Zvets_Porovnani;
- procedure Zvets_Prohozeni;
- procedure Zapis;
- end;
-
- constructor Typ_Pocitani.Init;
- begin
- Typ_Vokynko.Init;
- Presun(20,25, 0);
- Porovnani := 0;
- Prohozeni := 0;
- Vytvor_Ram(25,4,4,4,Strom_Ram);
- GotoXY(1,1);
- set_Psaci_Barva(14);
- Pis('Poçet porovnání :');
- WriteLn;
- Pis('Poçet p⌐i⌐azení :');
- Zobraz;
- end;
-
- procedure Typ_Pocitani.Nuluj;
- begin
- Porovnani := 0;
- Prohozeni := 0;
- Zapis;
- end;
-
- procedure Typ_Pocitani.Zapis;
- begin
- GotoXY(20,1);Pisint(Porovnani, 4);
- GotoXY(20,2);Pisint(Prohozeni, 4);
- end;
-
- procedure Typ_Pocitani.Zvets_Porovnani;
- begin
- Inc(Porovnani);
- Zapis;
- end;
-
- procedure Typ_Pocitani.Zvets_Prohozeni;
- begin
- Inc(Prohozeni);
- Zapis;
- end;
-
- var __Pocit : Typ_Pocitani;
-
- function Mensi( var Jedno, Druhe : Typ_Prvek ) : Boolean;
- var B1, B2 : Byte;
- P1, P2 :_Bod3D;
- F : Typ_Hejb_Fronta;
- Vysl : Boolean;
-
- begin
- B1 := Jedno.Barva;
- B2 := Druhe.Barva;
- P1 := Jedno.Poloha;
- P2 := Druhe.Poloha;
-
- Jedno.set_Barva(_Bar_Por);
- Druhe.set_Barva(_Bar_Por);
-
- if @Jedno <> @Druhe then
- begin
- F.Init;
- { DRUHE.ANIM_POSUN_BOD(XYZ_BOD(JEDNO.POLOHA.X+6,JEDNO.POLOHA.Y,JEDNO.POLOHA.Z)^,F);
- } Jedno.Anim_Posun_Bod(Xyz_Bod(45-5+2,0+5,5)^);
- F.Zarad_Prvek(Jedno);
- Druhe.Anim_Posun_Bod(Xyz_Bod(51-5+2,0+5,5)^);
- F.Zarad_Prvek(Druhe);
-
- F.set_Pomalost(Poc_Pom div 3);
- F.Dodelej_Pohyb;
-
- if Jedno.Klic < Druhe.Klic
- then Vysl := True
- else Vysl := False;
-
- Mensi := Vysl;
-
- if Vysl
- then Obrazovka.Pis_Retez( 50-5+2, +1+5, 5, _Bar_Por,'<',True)
- else if Jedno.Klic = Druhe.Klic
- then Obrazovka.Pis_Retez( 50-5+2, +1+5, 5, _Bar_Por,'=',True)
- else Obrazovka.Pis_Retez( 50-5+2, +1+5, 5, _Bar_Por,'>',True);
-
- __Pocit.Zvets_Porovnani;
- Delay(_Delay_Por*Poc_Pom);
- if Vysl
- then Obrazovka.Smaz_Retez( 50-5+2, +1+5, 5, _Bar_Por,'<',True)
- else if Jedno.Klic = Druhe.Klic
- then Obrazovka.Smaz_Retez( 50-5+2, +1+5, 5, _Bar_Por,'=',True)
- else Obrazovka.Smaz_Retez( 50-5+2, +1+5, 5, _Bar_Por,'>',True);
-
- Jedno.Anim_Posun_Bod(P1);
- F.Zarad_Prvek(Jedno);
- Druhe.Anim_Posun_Bod(P2);
- F.Zarad_Prvek(Druhe);
- F.Dodelej_Pohyb;
- end
- else Mensi := False;
-
- Jedno.set_Barva(B1);
- Druhe.set_Barva(B2);
-
- end;
-
- function Vetsi( var Jedno, Druhe : Typ_Prvek ) : Boolean;
- begin
- Vetsi := Mensi(Jedno, Druhe);
- if Jedno.Klic = Druhe.Klic then Vetsi := False;
- end;
-
- function Rovno( var Jedno, Druhe : Typ_Prvek ) : Boolean;
-
- begin
- Rovno := Mensi(Jedno, Druhe);
- Rovno := Jedno.Klic = Druhe.Klic;
- end;
-
- procedure Typ_Prvek.Dodel_Anim_Prohod;
- var Pom : Typ_Prvek;
- B1,B2 : Byte;
- begin
- B1 := Barva;
- B2 := S_Kym.Barva;
- set_Barva(_Bar_Proh);
- S_Kym.set_Barva(_Bar_Proh);
-
- Typ_Obdelnik.Dodel_Anim_Prohod(S_Kym);
- set_Barva(B1);
- S_Kym.set_Barva(B2);
-
- Pom.Init;
- Pom := Self;
- Self := S_Kym;
- S_Kym := Pom;
- __Pocit.Zvets_Prohozeni;
- __Pocit.Zvets_Prohozeni;
- __Pocit.Zvets_Prohozeni;
- end;
-
-
-
- var __Menu : Typ_Moje_Menu;
- K : Integer;
- S : string;
-
- procedure Maxsort(var Data : Typdat);
- var I, J : Integer;
- Pom : Typ_Prvek;
- begin
- Pom.Init;
- for I := 1 to N-1 do
- for J := I to N-1 do
- if Vetsi(Data[I], Data[J]) then
- begin
- Data[I].Dodel_Anim_Prohod(Data[J]);
- if Jit_Ven then Exit;{ aby se nemuselo dlouho cekat, nemusí bÿt }
- end;
- end;
-
- procedure Bublesort(var Data : Typdat);
- var I, J : Integer;
- Pom : Typ_Prvek;
- begin
- Pom.Init;
- for I := 1 to N-1 do
- for J := N-1 downto I do
- if Vetsi(Data[J], Data[J+1]) then
- begin
- Data[J+1].Dodel_Anim_Prohod(Data[J]);
- if Jit_Ven then Exit;{ aby se nemuselo dlouho cekat, nemusí bÿt }
- end;
- end;
-
-
- procedure Quicksort1(var Data : Typdat);
- { demonstruje klasickÿ qsort }
- var Pombar : Byte;
-
- procedure Castecne_Usporadani(K, M : Integer);
-
- var I, J, Fn : Integer;
-
- begin
- Inc(Pombar);
-
- I := K;
- J := M;
-
- Data[(K + M) div 2].set_Barva(Pombar);
-
- if ((K+M) div 2 > N) or ((K+M) div 2 < 1) then
- M := M;
-
- repeat
- if Jit_Ven then Exit;
-
- while Mensi(Data[I], Data[(K + M) div 2]) do I := I+1;
- { DATA[I].SET_BARVA(POMBAR);
- }
- while Vetsi(Data[J], Data[(K + M) div 2]) do J := J-1;
- { DATA[J].SET_BARVA(POMBAR);
- }
- if I <= J then
- begin
- if not Rovno(Data[J], Data[I])
- then Data[I].Dodel_Anim_Prohod(Data[J]);
- { DATA[I].SET_BARVA(_BAR_OBYC);
- DATA[J].SET_BARVA(_BAR_OBYC);
- }
- I := I+1;
- J := J-1;
- end;
- { DATA[I].SET_BARVA(_BAR_OBYC);
- DATA[J].SET_BARVA(_BAR_OBYC);
- }
- until I>J;
-
- if K < J then Castecne_Usporadani(K, J);
- if I < M then Castecne_Usporadani(I, M);
- Dec(Pombar);
- end; {pomocne procedury Castecne_usporadani}
-
- begin
- Pombar := 5;
- Castecne_Usporadani(1,N);
- end;
-
- procedure Mergesort(var Data : Typdat);
- var J : Integer;
-
- procedure Vnitrek;
- var Pompole : array[0..9]of Integer;
- Pomdata : Typdat;
- Pomind : array[0..9,1..30]of Integer;
- I, J, Pom, Pomid : Integer;
-
-
- procedure Trida(var Prvek : Typ_Prvek; Ktera : Integer);
- begin
- Prvek.Dodel_Anim_Posun_Bod(Xyz_Bod(Ktera*5+Pompole[Ktera], Obrazovka.Y_Obr -5- (Pompole[Ktera]*2+1), -Pompole[Ktera])^);
- Inc(Pompole[Ktera]);
- Pomind[Ktera, Pompole[Ktera]] := J;
- Pomind[Ktera, Pompole[Ktera]+1] := 0;
- __Pocit.Zvets_Prohozeni;
- end;
-
- function Moc(Co, Nakolik : Integer):Integer;
- var I, A : Integer;
- begin
- A := 1;
- for I := 1 to Nakolik do A := A*Co;
- Moc := A;
- end;
-
- begin
- for J := 1 to N do Pomdata[J].Init;
- for I := 0 to 2 do
- begin
- for J := 0 to 9 do
- begin
- Pompole[J] := 0;
- Pomind[J,1]:=0;
- end;
-
- for J := 1 to N do
- begin { rozmístêní objektû do t⌐íd podle I-té çíslice }
- Trida(Data[J], (Data[J].Klic div Moc(10,I)) mod 10);
- if Jit_Ven then Exit;{ aby se nemuselo dlouho cekat, nemusí bÿt }
- end;
-
- Pomid := 1;
- for J := 0 to 9 do
- begin
- Pom := 1;
- while Pomind[J, Pom] <> 0 do
- begin
- Pomdata[Pomid] := Data[Pomind[J, Pom]];
- Inc(Pomid);
- Inc(Pom)
- end;
- end;
- for J := 1 to N do Data[J] := Pomdata[J];
- for J := 1 to N do
- begin
- Data[J].Dodel_Anim_Posun_Bod(Hezky_Rozmistit(J)^);
- if Jit_Ven then Exit;{ aby se nemuselo dlouho cekat, nemusí bÿt }
- __Pocit.Zvets_Prohozeni;
- end;
- end;
- end;
-
- begin
- Vnitrek;
- for J := 1 to N do Data[J].Presun_Bod(Hezky_Rozmistit(J)^);
- end;
-
- (*procedure Quicksort2(var Data : Typdat);
- { demonstruje moænost paralelního zpracování p⌐i qsotu }
- var Pom : Typ_Prvek;
- I : Integer;
- procedure Castecne_Usporadani(K,M:Integer);
-
- var I, J, Y, Fn : Integer;
-
- begin
- I := K;
- J := M;
- Y := Data[(K + M) div 2].Klic;
- repeat
- while Data[I].Klic < Y do I := I+1;
- while Data[J].Klic > Y do J := J-1;
- if I <= J then
- begin
- if Data[J].Klic <> Data[I].Klic then
- begin
- repeat
- until ((Data[I].Stav and __Pohyb) = 0) and
- ((Data[J].Stav and __Pohyb) = 0);
-
- Data[I].Anim_Prohod(Data[J], __Timer);
- { prohozeni na obrazovce }
-
-
- Pom := Data[I];
- Data[I] := Data[J];
- Data[J] := Pom;
- { prohozeni v pameti }
- if Metoda <> _Qsortpar then Exit;{ aby se nemuselo dlouho cekat, nemusí bÿt }
- end;
- I := I+1;
- J := J-1;
- end;
- until I>J;
-
- if K < J then Castecne_Usporadani(K, J);
- if I < M then Castecne_Usporadani(I, M);
-
- end; {pomocne procedury Castecne_usporadani}
-
- begin
- Pom.Init(__Nula_3D);
- Castecne_Usporadani(1,N);
- __Timer.Off;
- for I:=1 to N do
- Data[I].Dodelej_Pohyb(__Timer);
- __Timer.On;
- end;
- *)
-
-
- var P : Pchar;
- I, J : Word;
-
- begin
- J := Length(Menudef)+Length(Menudef2);
- GetMem(P, J+1);
- for I := 0 to Length(Menudef) do
- P^[I] := Menudef[I+1];
- for I := Length(Menudef) to J-1 do
- P^[I] := Menudef2[I-Length(Menudef)+1];
-
- Randomize;
-
- Obrazovka.Nastav_mod(3+__Sada_3D_8X8); { nastavi hezky vypadajici sadu }
- Obrazovka.ClrScr;
- I := 0;
- Unfront.set_Pomalost(Poc_Pom);
- __Menu.Init(P,I);
- __Menu.Hejbej(Cesta);
- __Timer.Zarad_Prvek(__Menu);
- __Menu.GotoXY(1,7);
- __Menu.set_Psaci_Barva(LightRed);
- __Menu.Pis(' Demo k jednotce Unhejb');
- __Menu.WriteLn;
- __Menu.Pis(' Vyrobeno ve Praze 1993');
- __Menu.WriteLn;
- __Menu.Pis('PrScr uloæí obrazovku do BMP');
-
- set_Pomalost(Poc_Pom);
-
- __Pocit.Init;
-
- __Timer.On;
- __Menu.Otevri;
-
- for K := 1 to N do
- begin
- Data[K].Init;
- Data[K].Presun_Bod(Hezky_Rozmistit(K)^);
- { inicialisace data[k] - nutná ! }
- Data[K].Klic := {1000-k}Random(1000);
- { prirazeni klice }
- Data[K].Vytvor(Data[K].Klic, 3,_Bar_Obyc,_Bar_Obyc, Strom_Ram);
- { vytvoreni tvaru tak, aby to hezky vypadalo }
- Data[K].Zobraz;
- end;
-
- set_Par_Pisbmp('sort',nil);
- On_Pisbmp;
- repeat
- { __menu.krok;}
- if __Menu.Sub_Menu^[5]^.Out_Hodnota = 1 then
- begin
- __Pocit.Nuluj;
- case Metoda of
- _Qsort : Quicksort1(Data);
- { _Qsortpar : Quicksort2(Data);}
- _Buble : Bublesort(Data);
- _Vyber : Maxsort(Data);
- _Merge : Mergesort(Data);
- end;
- Jit_Ven := False;
- __Menu.Sub_Menu^[5]^.Pom_set(2);
- __Menu.Prekresli;
- end;
- until (__Menu.Out_Hodnota = 6);
- Off_Pisbmp;
- __Timer.Off;
- __Menu.Zrus;
- __Pocit.Zrus;
- for K := 1 to N do Data[K].Zrus;
- { vyruseni pameti, kterou zabiraji objekty a zhasnuti }
-
- Konec; { vyruseni pameti, kterou zabirá obrazovka }
- end.
-
-