unit seektab; { jednotka shrnujici nekolik podprogramu pro } { vyhledavani prvku v tabulce tab } interface uses utab; { dovazi typ tab pro tabulku z unity tab } function prvniX (var T:tab; X:integer) : integer; { hleda prvni vyskyt cisla X v tabulce T } { neni X v tabulce vrati 0, } { jinak vrati index prvniho vyskytu X v T } { pokud je nastaveno uplne vyhodnocovani booleovskych } { vyrazu $B+ , nastene v pripade, ze tabulka je plna } { a prvek v ni neni chyba preteceni indexu } function prvniXa (var T:tab; X:integer) : integer; { hleda prvni vyskyt cisla X v tabulce T } { neni X v tabulce vrati 0, } { jinak vrati index prvniho vyskytu X v T } { predpoklada, ze tabulka neni plna (DX) do I:=I+1; if I>D then prvniX:=0 else prvniX:=I end; end; function prvniXa (var T:tab; X:integer) : integer; var I:integer; begin with T do begin I:=1; A[D+1]:=X; { zarazka } while (A[I]<>X) do I:=I+1; { jiste plati A[I]=X } if I<=D then prvniXa:=I else prvniXa:=0 end; end; function stredniX (var T:tab; X:integer) : integer; var I:integer; pocet : integer; { pocet vyskytu X } ind : pole; { ukladaji se tam indexy vyskytu } begin with T do begin stredniX:=0; {nebude-li tam X} pocet:=0; {dosud zadny vyskyt } for I:=1 to D do if A[I]=X then begin {nalezen novy vyskyt } pocet:=pocet+1; ind[pocet]:=I; end; if pocet>0 then stredniX:= ind[(pocet+1) div 2] end; end; function prvnizUsp(var T:tab; X:integer) : integer; var I:integer; begin with T do begin A[D+1]:=maxint; {zarazka} I:=1; while XL do begin P:=(R+L) div 2; if X>A[P] then L:=P+1 { X nemuze byt vlevo od P+1 } else R:=P; { X nemuze byt vpravo od P } end; if A[L]=X then puleniInt:=L else puleniInt:=0 end; end; end.