home *** CD-ROM | disk | FTP | other *** search
/ Prima Shareware 3 / DuCom_Prima-Shareware-3_cd1.bin / PROGRAMO / PASCAL / HEJB / EXAM / ANIMINSE.PAS next >
Encoding:
Pascal/Delphi Source File  |  1994-04-21  |  6.2 KB  |  177 lines

  1. {$M 25000,0,655360}
  2. { tento program program p⌐edvádí funkce jednotky UnStrom   }
  3. { a to zvlá¿tê procedury vanim_insert                      }
  4. { Tato procedura vytvo⌐í obdelníkovÿ objekt s klíçem       }
  5. { danÿm parametrem a zat⌐ídí jej do vyváæeného stromu.     }
  6. { Poté strom znovu vyváæí.                                 }
  7. { Zat⌐ídêní i vyváæení probíhá animovanê.                  }
  8. { Pro ukázku je zde uvedena i procedura anim_insert,       }
  9. { která zat⌐ídí prvek stejnÿm zpûsobem, ale strom nevyváæí }
  10. { a procedura Vinsert, která probíhá neanimovanê.          }
  11. { procedury jsou p⌐evzaty ze skript                        }
  12. { Ing. Karel Richta, Datové struktury, str. 81             }
  13.  
  14. uses Obraz3D, Unhejb, Unobdel, Unstrom, Unvokno, Crt, Untimer, Unpisbmp, Unmenu;
  15. const Maxcislo             = 900; { nejvy¿¿í çíslo ve stromê }
  16.       Kolikzatridit        = 127; { poçet prvkû stromu }
  17.       Metoda     : Byte    = 1;   { poçáteçní metoda, viz case v programu }
  18.       Poc_Pom    : Integer = 10;  { poçáteçní pomalost p⌐i animaci }
  19.       __Velikost : Integer = 70;  { poçáteçní velikost stromu }
  20.       Jit_Ven    : Boolean = False;
  21.  
  22.       { program pro menu - stále se provádí Vm0 }
  23. const Cesta      : array[1..3]of Typ_Instrukce = (Vm0, Jmpa0, Endc) ;
  24.  
  25. type
  26.   Typ_Moje_Menu = object(Typ_Menu_Vyber)
  27.                     procedure Vm0;virtual;
  28.                   end;
  29.  
  30. const Menudef : string =                  { definiçní ⌐etêzec pro menu }
  31. '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}
  32.                                                    { rozmêr 30x11, 6 prvkû, zaçátek na çtvrtém }
  33. '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,
  34.                                                    { zvÿraznênÿ text téæ 96, poçáteçní hodnota 40, minimum 1 a maximum 400 }
  35. '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,
  36.                                                    { zvÿraznênÿ text téæ 96, poçáteçní hodnota 40, minimum 1 a maximum 400 }
  37. '~ v 31 15 9 15 112 10 33 5 3 1'+
  38.   'animated insert vith balancing~o'+
  39.   'animated insert~o'+
  40.   'insert vith balancing~o'+
  41. 'end~o';
  42.  
  43. var  I, J   : Word;         { pomocné promênné }
  44.      Strom  : Vtyp_Strom;   { vyváæenÿ strom }
  45.      Psaci  : Typ_Vokynko;  { objekt, do ktereho se bude psat instruktaæní text }
  46.      Cc     : Typ_integer;  { slouæí pro zobrazení zat⌐iâovaného çísla  }
  47.      __Menu : Typ_Moje_Menu;{ menu pro vÿbêr moæností programu }
  48.  
  49. procedure Skoncito;
  50. { zlikviduje v¿e, co program napáchal }
  51. begin
  52.   __Timer.zrus;
  53.   Off_Pisbmp;
  54.   strom.Zrus;
  55.   Cc.Zrus;
  56.   Psaci.Zrus;
  57.   Konec;
  58.   Halt(0);
  59. end;
  60.  
  61. procedure Typ_Moje_Menu.Vm0;
  62. var C : Word;
  63.     S : string[5];
  64.  
  65. begin
  66.   if KeyPressed then
  67.     begin
  68.       { pokud je stisknuta klávesa, p⌐eçte ji a zachová se podle toho, co bylo stisknuto }
  69.       C := Byte(ReadKey);
  70.       if C = 0 then  C := 256* Byte(ReadKey);
  71.  
  72.       Zpracuj_Key(C);
  73.  
  74.       if Sub_Menu^[1]^.Out_Hodnota <> Poc_Pom then
  75.         begin { zmêna pomalosti }
  76.           Poc_Pom := Sub_Menu^[1]^.Out_Hodnota;
  77.           Unfront.set_Pomalost(Poc_Pom);
  78.         end;
  79.  
  80.       if Sub_Menu^[2]^.Out_Hodnota <> __Velikost then
  81.         begin { zmêna velikosti }
  82.           __Velikost := Sub_Menu^[2]^.Out_Hodnota;
  83.           set_Velikost(__Velikost/100);
  84.           strom.Obnov;
  85.         end;
  86.  
  87.       if (Sub_Menu^[3]^.Out_Hodnota <> Metoda) then { zmêna metody }
  88.         Metoda := Sub_Menu^[3]^.Out_Hodnota;
  89.  
  90.       if Out_Hodnota = 4 then Jit_Ven := True; { konec zat⌐iâování }
  91.       case C of
  92.         50 : Cc.D;
  93.         52 : Cc.L;
  94.         54 : Cc.R;
  95.         56 : Cc.U;
  96.         43 : Cc.F;
  97.         45 : Cc.B;
  98.       end;
  99.       set_pocatek_animace(cc.poloha.x,cc.poloha.y,cc.poloha.z);
  100.     end;
  101. end;
  102.  
  103. begin
  104.   Obrazovka.Nastav_mod(3+__Sada_3D_8X8);   { hezká sada znakû }
  105.  
  106.   strom.Init;                    { inicialisace stomu }
  107.   strom.Presun(0, Obrazovka.Y_Obr shr 1-1, 0); { p⌐esun stromu do 1/2 obrazovky }
  108.  
  109.   { inicialisace __Menu pomocí definiçního ⌐etêzce }
  110.   I := 0;
  111.  
  112.   __Menu.Init(@Menudef[1], I);
  113.   __Menu.Otevri;
  114.  
  115.          { p⌐i çasovém p⌐eru¿ení se nad __Menu vykonává Vm0 }
  116.   __Menu.Hejbej(Cesta);
  117.   __Timer.Zarad_Prvek(__Menu);
  118.  
  119.   __Menu.GotoXY(1, 5);
  120.   __Menu.Pis('Inserted element :');
  121.  
  122.   Cc.Init; { inicialisace a p⌐esun zobrazovacího prvku do __Menu (polohovê) }
  123.   Cc.Presun(__Menu.Poloha.X+21,__Menu.Poloha.Y+4,0);
  124.            
  125.   __Timer.On;{ zapnutí çasové fronty }
  126.  
  127.   On_Pisbmp;{ zapnutí zápisu obrazovky na p⌐eru¿ení PrScr - viz UnPisBMP }
  128.   set_Par_Pisbmp('strom', nil);{ obrázky na disku se budou jmenovat strom0.bmp, strom1.bmp atd. }
  129.  
  130.   Randomize;
  131.   Unfront.set_Pomalost(Poc_Pom); { nastavení poçáteçní pomalosti pro animaci }
  132.  
  133.   set_Pocatek_Animace(__Menu.Poloha.X+21,__Menu.Poloha.Y+4,0); { místo, ze kterého bude vyjíædêt zat⌐. ptvek }
  134.   for I := 1 to Kolikzatridit do
  135.     begin
  136.       J := Random(Maxcislo)+100;
  137.  
  138.       Cc.Vytvor(j, 0, 12,12,Strom_Ram);
  139.       Cc.Zobraz; { pomocné zobrazení }
  140.  
  141.       repeat until Metoda <> 0;
  142.       { nic se nedêje, dokud není zvolena metoda }
  143.       case Metoda of
  144.         1 : strom.Vanim_Insert(J);       { zat⌐ídêní prvku, vyváæení }
  145.         2 : strom.Anim_Insert(J);        { zat⌐ídêní prvku }
  146.         3 : strom.Vinsert(J);            { zat⌐ídêní prvku, vyváæení }
  147.       end;
  148.       if Jit_Ven then i:=kolikzatridit; { Jit_Ven se mêní v Vm0 __Menu }
  149.     end;
  150.  
  151.   Psaci.Init;
  152.   Psaci.Presun(0,0+Obrazovka.Y_Obr-15,50);
  153.   Psaci.Vytvor_Ram(80,4,11,14,Strom_Ram);
  154.   Psaci.Zobraz;
  155.   Psaci.set_Psaci_Barva(11);
  156.   Psaci.GotoXY(1,1);
  157.   Psaci.Pis('Pokud nêco stisknou, stromecek se prûchodem preorder srovná do lajny');
  158.   Psaci.WriteLn;
  159.   Psaci.Pis('Pokud stisknou nic, bude nic ');
  160.  
  161.   repeat until KeyPressed;
  162.   Psaci.Zhasni;
  163.   strom.Anim_in_Rozmistit;
  164.  
  165.   Psaci.Zobraz;
  166.   Psaci.GotoXY(1,1);
  167.   Psaci.Pis('Pokud nêco stisknou, stromecek se vrátí, tentokrát prûchodem inorder ');
  168.   repeat until KeyPressed;
  169.   strom.Anim_Obnov;
  170.  
  171.   Psaci.GotoXY(1,1);
  172.   Psaci.Pis('Pokud nêco stisknou, bude konec                                      ');
  173.   repeat until KeyPressed;
  174.  
  175.   Skoncito;
  176. end.
  177.