- •Модули для лабораторных работ.
- •Var I:byte;
- •Var I:Index;
- •Var I:byte;
- •Interface
- •V:BaseType;
- •Var TablError:byte;
- •Implementation
- •Var I:index;
- •Interface
- •Var tablerror:byte;
- •Implementation
- •Interface
- •Var TablError:byte;
- •Implementation
- •Var I:index;
- •Interface
- •Var TablError:byte;
- •Implementation
- •Var I:index;
- •Interface
- •Implementation
- •Var I:index;
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
Модули для лабораторных работ.
Unit URegTabl; {упорядоченная таблица на массиве}
Interface
Const tablsize = 100; {размер таблицы}
tablok = 0; {успешное завершение операции}
tablover = 1; {таблица переполнена}
tablunder = 2; {таблица пуста}
tablelnotfound = 3; {элемент не найден}
Type Index = 0..TablSize;
BaseType = Word;
Element = record
k:Integer;
v:BaseType;
end;
Tabl = record
buf:array [Index] of Element;
uk:Index; {указатель на последний элемент}
end;
Var TablError:byte;
Procedure InitTabl (var T:Tabl); {конструктор}
Function EmptyTabl (var T:Tabl):boolean; {таблица пуста?}
Function FullTabl (var T:Tabl):boolean; {таблица переполнена?}
Procedure PutTabl (var T:Tabl; El:Element); {включение элемента}
Function GetTabl (var T:Tabl; var El:Element; key:integer):boolean; {исключение элемента}
Function LineFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {линейный поиск}
Function FastLineFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {быстрый линейный поиск}
Function BinFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {бинарный поиск}
Implementation
Procedure InitTabl;
var i:index;
Begin
T.uk:=0;
TablError:=2
End;
Function EmptyTabl;
Begin
if T.uk=0 then TablError:=tablunder;
emptytabl:=T.uk=0;
End;
Function FullTabl;
Begin
if T.uk=TablSize then TablError:=tablover;
FullTabl:=T.uk=TablSize;
End;
Procedure PutTabl;
var i:byte;
n:Index;
Begin
if not(FullTabl(t)) then
if not(BinFind(T,el.k,el,n)) then {элемента в таблице нет}
begin
Inc(T.uk);
for i:=T.uk downto n+1 do T.buf[i]:=T.buf[i-1];
T.buf[n]:=el;
TablError:=TablOk;
end;
End;
Function GetTabl;
Var I:byte;
n:Index;
Begin
if not(EmptyTabl(T)) then
if BinFind(T,key,el,n) then
begin
el:=T.buf[n];
for i:=n to T.uk-1 do T.buf[i]:=T.buf[i+1];
Dec(T.uk);
TablError:=TablOk;
end
else TablError:=TablElNotFound;
End;
Function LineFind;
Var I:Index;
Begin
i:=0;
TablError:=tablelnotfound;
while (i<T.uk) and (TablError=tablelnotfound) do
begin
if T.buf[i].k=key then
begin
TablError:=tablok;
el:=T.buf[i];
n:=i;
end;
Inc(i);
end;
LineFind:=TablError=tablok;
End;
Function FastLineFind;
Var I:byte;
f:boolean;
Begin
f:=false;
i:=0;
T.buf[T.uk+1].k:=key;
While not(f) do
begin
if T.buf[i].k=key then
begin
f:=true;
el:=T.buf[i];
n:=i;
end;
Inc(i);
end;
if n=T.uk+1 then TablError:=tablelnotfound
else TablError:=TablOk;
FastLineFind:=TablError=tablok;
End;
Function BinFind;
var i,j,k:Index;
f:boolean;
Begin
i:=0;
j:=T.uk-1;
f:=false;
repeat
k:=(i+j) div 2;
if T.buf[k].k=key then
begin
f:=true;
el:=T.buf[i];
end;
if T.buf[k].k>key then i:=k+1
else j:=k-1;
until f or (i>j);
if f then TablError:=tablok
else begin
n:=i;
TablError:=tablelnotfound;
end;
End;
End.
{---------------------------------------------------------------------------}
Unit UNRegTab;{неупорядоченная таблица на массиве}