Скачиваний:
23
Добавлен:
02.05.2014
Размер:
7 Кб
Скачать
☆
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