home *** CD-ROM | disk | FTP | other *** search
- {$M 25000,0,655360}
- { tento program program p⌐edvádí funkce jednotky UnStrom }
- { a to zvlá¿tê procedury vanim_insert }
- { Tato procedura vytvo⌐í obdelníkovÿ objekt s klíçem }
- { danÿm parametrem a zat⌐ídí jej do vyváæeného stromu. }
- { Poté strom znovu vyváæí. }
- { Zat⌐ídêní i vyváæení probíhá animovanê. }
- { Pro ukázku je zde uvedena i procedura anim_insert, }
- { která zat⌐ídí prvek stejnÿm zpûsobem, ale strom nevyváæí }
- { a procedura Vinsert, která probíhá neanimovanê. }
- { procedury jsou p⌐evzaty ze skript }
- { Ing. Karel Richta, Datové struktury, str. 81 }
-
- uses Obraz3D, Unhejb, Unobdel, Unstrom, Unvokno, Crt, Untimer, Unpisbmp, Unmenu;
- const Maxcislo = 900; { nejvy¿¿í çíslo ve stromê }
- Kolikzatridit = 127; { poçet prvkû stromu }
- Metoda : Byte = 1; { poçáteçní metoda, viz case v programu }
- Poc_Pom : Integer = 10; { poçáteçní pomalost p⌐i animaci }
- __Velikost : Integer = 70; { poçáteçní velikost stromu }
- Jit_Ven : Boolean = False;
-
- { program pro menu - stále se provádí Vm0 }
- const Cesta : array[1..3]of Typ_Instrukce = (Vm0, Jmpa0, Endc) ;
-
- type
- Typ_Moje_Menu = object(Typ_Menu_Vyber)
- procedure Vm0;virtual;
- end;
-
- const Menudef : string = { definiçní ⌐etêzec pro menu }
- '30 30 -1 15 112 10 33 9 4 1'+ { posice [30, 30,-1] 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 62 30 3 10 10 96 10 1 400 1'+ { editace çísla, posice [62, 30, 3], barva textu 10, barva rámeçku 10,
- { zvÿraznênÿ text téæ 96, poçáteçní hodnota 40, minimum 1 a maximum 400 }
- 'tree size~ i 62 31 3 10 10 96 70 20 100 1'+ { editace çísla, posice [62, 31, 3], barva textu 10, barva rámeçku 10,
- { zvÿraznênÿ text téæ 96, poçáteçní hodnota 40, minimum 1 a maximum 400 }
- '~ v 31 15 9 15 112 10 33 5 3 1'+
- 'animated insert vith balancing~o'+
- 'animated insert~o'+
- 'insert vith balancing~o'+
- 'end~o';
-
- var I, J : Word; { pomocné promênné }
- Strom : Vtyp_Strom; { vyváæenÿ strom }
- Psaci : Typ_Vokynko; { objekt, do ktereho se bude psat instruktaæní text }
- Cc : Typ_integer; { slouæí pro zobrazení zat⌐iâovaného çísla }
- __Menu : Typ_Moje_Menu;{ menu pro vÿbêr moæností programu }
-
- procedure Skoncito;
- { zlikviduje v¿e, co program napáchal }
- begin
- __Timer.zrus;
- Off_Pisbmp;
- strom.Zrus;
- Cc.Zrus;
- Psaci.Zrus;
- Konec;
- Halt(0);
- end;
-
- procedure Typ_Moje_Menu.Vm0;
- var C : Word;
- S : string[5];
-
- begin
- if KeyPressed then
- begin
- { pokud je stisknuta klávesa, p⌐eçte ji a zachová se podle toho, co bylo stisknuto }
- C := Byte(ReadKey);
- if C = 0 then C := 256* Byte(ReadKey);
-
- Zpracuj_Key(C);
-
- if Sub_Menu^[1]^.Out_Hodnota <> Poc_Pom then
- begin { zmêna pomalosti }
- Poc_Pom := Sub_Menu^[1]^.Out_Hodnota;
- Unfront.set_Pomalost(Poc_Pom);
- end;
-
- if Sub_Menu^[2]^.Out_Hodnota <> __Velikost then
- begin { zmêna velikosti }
- __Velikost := Sub_Menu^[2]^.Out_Hodnota;
- set_Velikost(__Velikost/100);
- strom.Obnov;
- end;
-
- if (Sub_Menu^[3]^.Out_Hodnota <> Metoda) then { zmêna metody }
- Metoda := Sub_Menu^[3]^.Out_Hodnota;
-
- if Out_Hodnota = 4 then Jit_Ven := True; { konec zat⌐iâování }
- case C of
- 50 : Cc.D;
- 52 : Cc.L;
- 54 : Cc.R;
- 56 : Cc.U;
- 43 : Cc.F;
- 45 : Cc.B;
- end;
- set_pocatek_animace(cc.poloha.x,cc.poloha.y,cc.poloha.z);
- end;
- end;
-
- begin
- Obrazovka.Nastav_mod(3+__Sada_3D_8X8); { hezká sada znakû }
-
- strom.Init; { inicialisace stomu }
- strom.Presun(0, Obrazovka.Y_Obr shr 1-1, 0); { p⌐esun stromu do 1/2 obrazovky }
-
- { inicialisace __Menu pomocí definiçního ⌐etêzce }
- I := 0;
-
- __Menu.Init(@Menudef[1], I);
- __Menu.Otevri;
-
- { p⌐i çasovém p⌐eru¿ení se nad __Menu vykonává Vm0 }
- __Menu.Hejbej(Cesta);
- __Timer.Zarad_Prvek(__Menu);
-
- __Menu.GotoXY(1, 5);
- __Menu.Pis('Inserted element :');
-
- Cc.Init; { inicialisace a p⌐esun zobrazovacího prvku do __Menu (polohovê) }
- Cc.Presun(__Menu.Poloha.X+21,__Menu.Poloha.Y+4,0);
-
- __Timer.On;{ zapnutí çasové fronty }
-
- On_Pisbmp;{ zapnutí zápisu obrazovky na p⌐eru¿ení PrScr - viz UnPisBMP }
- set_Par_Pisbmp('strom', nil);{ obrázky na disku se budou jmenovat strom0.bmp, strom1.bmp atd. }
-
- Randomize;
- Unfront.set_Pomalost(Poc_Pom); { nastavení poçáteçní pomalosti pro animaci }
-
- set_Pocatek_Animace(__Menu.Poloha.X+21,__Menu.Poloha.Y+4,0); { místo, ze kterého bude vyjíædêt zat⌐. ptvek }
- for I := 1 to Kolikzatridit do
- begin
- J := Random(Maxcislo)+100;
-
- Cc.Vytvor(j, 0, 12,12,Strom_Ram);
- Cc.Zobraz; { pomocné zobrazení }
-
- repeat until Metoda <> 0;
- { nic se nedêje, dokud není zvolena metoda }
- case Metoda of
- 1 : strom.Vanim_Insert(J); { zat⌐ídêní prvku, vyváæení }
- 2 : strom.Anim_Insert(J); { zat⌐ídêní prvku }
- 3 : strom.Vinsert(J); { zat⌐ídêní prvku, vyváæení }
- end;
- if Jit_Ven then i:=kolikzatridit; { Jit_Ven se mêní v Vm0 __Menu }
- end;
-
- Psaci.Init;
- Psaci.Presun(0,0+Obrazovka.Y_Obr-15,50);
- Psaci.Vytvor_Ram(80,4,11,14,Strom_Ram);
- Psaci.Zobraz;
- Psaci.set_Psaci_Barva(11);
- Psaci.GotoXY(1,1);
- Psaci.Pis('Pokud nêco stisknou, stromecek se prûchodem preorder srovná do lajny');
- Psaci.WriteLn;
- Psaci.Pis('Pokud stisknou nic, bude nic ');
-
- repeat until KeyPressed;
- Psaci.Zhasni;
- strom.Anim_in_Rozmistit;
-
- Psaci.Zobraz;
- Psaci.GotoXY(1,1);
- Psaci.Pis('Pokud nêco stisknou, stromecek se vrátí, tentokrát prûchodem inorder ');
- repeat until KeyPressed;
- strom.Anim_Obnov;
-
- Psaci.GotoXY(1,1);
- Psaci.Pis('Pokud nêco stisknou, bude konec ');
- repeat until KeyPressed;
-
- Skoncito;
- end.
-