Скачиваний:
22
Добавлен:
02.05.2014
Размер:
6.89 Кб
Скачать
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, ComCtrls, Buttons ;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
StringGrid2: TStringGrid;
StringGrid1: TStringGrid;
Button4: TButton;
Memo2: TMemo;
Edit1: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;

var
Form1: TForm1;
ukazatel:integer;
koliz,sravn:integer;

implementation

{$R *.dfm}


procedure TForm1.Button3Click(Sender: TObject);
begin
{ Выход из программы }
Close;
end;

procedure TForm1.Button1Click(Sender: TObject); {открытие файла}
begin
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.Filename)
end;

function Xesh(St:string):integer; {процедура вычисление значения хэш-функции}
var dlina:integer;
twosyb:char;
fivesyb:char;
begin
dlina:=length(St);
if dlina=0 then Result:=0 else
begin
if dlina>=4 then begin
twosyb:=St[2];
fivesyb:=St[5];
end
else begin
twosyb:=St[2];
Result:=ord( twosyb);
end;
Result:=ord(fivesyb)+ord(twosyb);
end;
end;


procedure TForm1.Button4Click(Sender: TObject); { процедура заполнения таблиц}
var i,g,dlina,hash,ukaz:integer;
stroka:string;
label 1,2;
begin
ukazatel:=1;
with StringGrid1 do begin
Cells[0,0]:='Номер';
Cells[1,0]:='Индефикатор';
Cells[2,0]:='лево';
Cells[3,0]:='право';
end;

with StringGrid2 do begin
Cells[0,0]:='Номер';
Cells[1,0]:='Индеф';
end;

for g:=0 to 400 do begin
StringGrid2.Cells[0,g]:=IntToStr(g);
StringGrid1.Cells[0,g]:=IntToStr(g);
end;


dlina:=memo1.Lines.Count; { Определяем колличество записей }
if dlina<>0 then
begin
StringGrid1.RowCount:=dlina+1; { кол-во строк }
for i:=1 to dlina do begin { заполняем номера строк }
StringGrid1.Cells[0,i]:=IntToStr(i);
end;
for i:=0 to dlina-1 do begin { заполняет в строки текст }
stroka:=memo1.Lines[i];
hash:=Xesh(stroka);

if StringGrid2.cells[1,hash-65]='' then begin { проверяем состояние ячейки в ХТ, выполняем если пусто }
StringGrid2.cells[1,hash-65]:=IntToStr(ukazatel); {заносим указатель в ХТ}
StringGrid1.cells[1,ukazatel]:=stroka; {Заносим запись в ТИ по значению указателя}
ukazatel:=ukazatel+1; { увеличение указателя на 1}
goto 1;
end;
if StringGrid2.cells[1,hash-65]<>'' then begin { выполняем если занета ячейка }
koliz:=koliz+1;
ukaz:=StrToInt(StringGrid2.cells[1,hash-65]);
2: if stroka=StringGrid1.Cells[1,ukaz] then { проверка на дубликаты }
begin
memo2.Lines[j]:='Удален '+stroka; { вывод в поле memo2 название дубликата }
end;

if stroka<StringGrid1.cells[1,ukaz] then { заполняем дерево в левую часть }
begin
if StringGrid1.cells[3,ukaz]='' then begin {если ле }
StringGrid1.cells[2,ukaz]:=IntToStr(ukazatel);
StringGrid1.cells[1,ukazatel]:=stroka;
ukazatel:=ukazatel+1;
goto 1;
end;
if StringGrid1.cells[3,ukaz]<>'' then begin
ukaz:=StrToInt(StringGrid1.cells[2,ukaz]);
goto 2;
end;
end;



if stroka>StringGrid1.cells[1,ukaz] then {заполняем дерево в правую часть }
begin
if StringGrid1.cells[3,ukaz]='' then begin
StringGrid1.cells[3,ukaz]:=IntToStr(ukazatel);

StringGrid1.cells[1,ukazatel]:=stroka;
ukazatel:=ukazatel+1;
goto 1;
end;
if StringGrid1.cells[3,ukaz]<>'' then begin
ukaz:=StrToInt(StringGrid1.cells[3,ukaz]);
goto 2;
end;
end;


end;

1: end;

end;
StringGrid1.RowCount:=ukazatel+1; { добовляем строку в таблицу индефикаторов }
end;

procedure TForm1.Button2Click(Sender: TObject); { процедура для ручной проверки получаемой хеш функции }
var sym:string;
sym1:integer;
begin
sym:=Edit1.Text;
label4.Visible:=True;
sym1:= Xesh(sym);
label4.Caption:='Хеш='+inttostr(sym1-65);
end;

end.
Соседние файлы в папке 1