unit ClassHeshProg;
interface
type
TItem=class{класс-элемент списка}
private
key: string;
next: TItem;
public
Constructor Create(aNext:TItem;aKey:string);//создание 1 элемента
function Getnext:TItem;//дать адрес на след. элемент
procedure SetNext(aNext:TItem);//изм. адрес
Function GetKey:string;//дать ключ
end;
{***********************************}
TList=class {класс списка}
Head:TItem;//заголовок списка
constructor Create(aKey:string);//создание списка
function AddFirst(aKey:string):boolean;//добавление перед заголовком
function AddLast(aKey:string):boolean;//добавление после заголовка
function GetHead:TItem;// дать заголовка
TMas=class {класс-контейнер массива списков}
mas:array [1..10]of TList;
Constructor Create(aKey:string);//создание масива указателей списков
function HeshFunction(aKey:string):integer;virtual;//HESH-функция с возможностью переопределения
function Add(aKey:string;found:byte):byte;//Found:0-до,1-перед, Возвращает:0-без конфликта,j-ячейка
function Search(aKey:string;var aCount:integer):string;//поиск элемента Hesh-таблицы
procedure DeleteAll;//удаление всей таблицы
Procedure SaveHesh(FileName:String);//сохранение контейнера в файле
Procedure LoadHesh(FileName:String);//загрузка контейнера из файла
Procedure Extract(var aIndex:integer;var aCur:TItem);//Вывод:aIndex-текуший индекс массива,aCur-текущий эл-т списка
var Hesh:TMas;
implementation
uses Main,SysUtils,Dialogs;
constructor TItem.Create(aNext:TItem;aKey:string);
begin
next:=aNext;
Key:=aKey;
function TItem.Getnext:TItem;
Result:=next;
procedure TItem.SetNext(aNext:TItem);
Function TItem.GetKey:string;
Result:=Key;
{*************************************}
constructor TList.Create(aKey:String);
Head:=TItem.Create(nil,aKey);
function TList.AddFirst(aKey:string):boolean;
var Temp,Current,Previos:TItem;
previos:=Head;
current:=Head.Getnext;
Temp:=TItem.Create(current,aKey);
Temp.next:=current;
previos.next:=Temp;
result:=true;
function TList.AddLast(aKey:string):boolean;
var Temp,Current:TItem;
// Внесение нового элемента в список
Current:=Head.Getnext;
Temp:=TItem.Create(Head.next,aKey);
Head.next:=Temp;
function TList.GetHead:TItem;
Result:=Head;
constructor TMas.Create(aKey:string);
var i:integer;
for i:=1 to 10 do mas[i]:=TList.Create(aKey);
function TMas.HeshFunction(aKey:string):integer; //Hesh-функция
var x,i,j:integer;
x:= 0;
for i:=1 to length(aKey) do x:=ord(aKey[i])+x; // Определение значения строки
j:=(x mod 10)+1; //Определение элемента
result:=j;
function TMas.Add(aKey:string;found:byte):byte;
var j:integer;
j:=HeshFunction(aKey);
if Found=0 then
if mas[j].Head.next<>nil then result:=j else result:=0;
mas[j].AddFirst(aKey);
end else
if found=1 then
mas[j].AddLast(aKey);
function Tmas.Search(aKey:string;var aCount:integer):string;
var j:integer; Cur:TItem;
//Поиск в списке
aCount:=1;
Cur:= mas[j].GetHead.Getnext;
while (Cur<>nil) and (Cur.key<>aKey) do
inc(aCount);
Cur:= Cur.next;
if Cur=nil then
result:='0';
Exit;
result:=Cur.key;
exit;
procedure TMas.DeleteAll;//удаление контейнера
var i:integer; Cur:TItem;
for i:=1 to 10 do
cur:=mas[i].Head.Getnext;
While Cur<>nil do
mas[i].Head.next:=Cur.next;
Cur.Destroy;
cur:=mas[i].Head.next;
Hesh.Destroy;
Hesh:=nil;
Procedure TMas.Extract(var aIndex:integer;var aCur:TItem);//Вывод:aIndex-текуший индекс массива,aCur-текущий эл-т списка
aCur:=mas[aIndex].Head.next;
Procedure Tmas.SaveHesh(FileName:String);//сохранение контейнера в файле
var Current:TItem;tf:TextFile;i:integer;
AssignFile(tf,FileName);
rewrite(tf);
Current:=mas[i].Head.Getnext;
while Current<>Nil do
Write(tf,Current.key+' ');
Current:=Current.next;
Writeln(tf);
CloseFile(tf);
Procedure TMas.LoadHesh(FileName:String);//Загрузка контейнера из файла
var tf:TextFile;s,si,Key:string;b,bf:Boolean;i:integer;
b:=False;
Reset(tf);
while Not Eof(tf) do
Readln(tf,s);
bf:=False;
si:='';
for i:=1 to Length(s) do
if s[i]<>' ' then si:=si+s[i] else
if b=False then
b:=True;
Key:=si;
Hesh:=TMas.Create(Key);
bf:=true;
if bf=False then
bf:=True;
Hesh.Add(SI,0);
end; {end For}
end;{end While}
end.
Описание Demo-программы.
unit Main;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ExtCtrls, Menus, ComCtrls;
TForm1 = class(TForm)
Panel1: TPanel;
OperationGroup: TRadioGroup;
Edit1: TEdit;
Inicial: TBitBtn;
CloseButton: TBitBtn;
StringGrid1: TStringGrid;
MainMenu1: TMainMenu;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
AddGroup: TRadioGroup;
N5: TMenuItem;
Save: TMenuItem;
Load: TMenuItem;
CloseMenu: TMenuItem;
StatusBar1: TStatusBar;
New: TMenuItem;
SavaBtn: TBitBtn;
LoadBtn: TBitBtn;
procedure FormActivate(Sender: TObject);
procedure CloseButtonClick(Sender: TObject);
procedure InicialClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure LoadClick(Sender: TObject);
procedure CloseMenuClick(Sender: TObject);
procedure NewClick(Sender: TObject);
procedure OperationGroupClick(Sender: TObject);
procedure SavaBtnClick(Sender: TObject);
procedure LoadBtnClick(Sender: TObject);
{ Private declarations }
{ Public declarations }
var
Form1: TForm1;
Implementation
uses ClassHeshProg;
{$R *.dfm}
procedure Output;
var i,j:integer;Cur:TItem;
j:=1;
Hesh.Extract(i,Cur);
form1.StringGrid1.Cells[i-1, j]:=Cur.GetKey;
Cur:=Cur.Getnext;
inc(j);
procedure TForm1.FormActivate(Sender: TObject);
for i:=1 to form1.StringGrid1.ColCount do
form1.StringGrid1.Cols[i-1].Add(inttostr(i));
form1.StatusBar1.Panels.Add.Text:='Объектная реализация HESH-поиска.';
form1.OperationGroup.ItemIndex:=0;
form1.AddGroup.ItemIndex:=1;
procedure TForm1.CloseButtonClick(Sender: TObject);
if MessageDlg('Сохранить изменения?',mtConfirmation,[mbYes, mbNo],0)=mrYes then
SaveClick(Sender);
NewClick(Sender);
Close; end else
Hesh.DeleteAll;
Close;
procedure TForm1.InicialClick(Sender: TObject);
var i,j,count:integer;
if Hesh=nil then
MessageDlg('HESH-таблица не создана. Создаю таблицу.',MtError,[mbok],1);
Hesh:=TMas.Create(''); end else
case OperationGroup.ItemIndex of
0:begin {Add}
If Edit1.Text= '' then MessageDlg('Введите значение!',MtError,[mbOK],1) else
if AddGroup.ItemIndex=0 then
begin {AddFirst}
j:=Hesh.Add(Edit1.Text,0);
if j<>0 then MessageDlg('Конфликт в ячейке '+inttostr(j),MtInformation,[mbok],1);
MessageDlg('Ключ с значением '+Edit1.Text+' добавлен.',MtInformation,[mbok],1);
begin {AddLast}
j:=Hesh.Add(Edit1.Text,1);
Output;
1:begin {Search}
if Hesh.Search(Edit1.Text,Count)='0' then
MessageDlg('Элемент не найден!',MtError,[mbok],1) else
MessageDlg('Элемент найден со значением '+Edit1.Text,MtInformation,[mbok],1);
StatusBar1.Panels.Clear;
StatusBar1.Panels.Add.Text:='Количество сравнений : '+inttostr(Count);
2: begin {Clear}
end;{end case}
Edit1.SetFocus;
procedure TForm1.FormCreate(Sender: TObject);
Hesh:=TMas.Create('');
procedure TForm1.SaveClick(Sender: TObject);
if SaveDialog1.Execute then
if Hesh<>Nil then begin
Hesh.SaveHesh(SaveDialog1.FileName);
NewClick(Sender); end else
MessageDlg('HESH-таблица не создана.',MtError,[mbok],1);
procedure TForm1.LoadClick(Sender: TObject);
if OpenDialog1.Execute then
Hesh.LoadHesh(OpenDialog1.FileName);
procedure TForm1.CloseMenuClick(Sender: TObject);
CloseButtonClick(Sender);
procedure TForm1.NewClick(Sender: TObject);
var i,j:integer;
if Hesh<>nil then
for i:=0 to 10 do for j:=1 to 10 do
stringgrid1.Cells[i,j]:='';
procedure TForm1.OperationGroupClick(Sender: TObject);
0:begin
Inicial.Caption:='Добавить';
Edit1.Text:='';
1:begin
Inicial.Caption:='Найти';
2:begin
Inicial.Caption:='Очистить';
procedure TForm1.SavaBtnClick(Sender: TObject);
procedure TForm1.LoadBtnClick(Sender: TObject);
LoadClick(Sender);
7. Список использованной литературы.
1. Иванов А.Г., Карпова А.В., Семик В.П., Филинов Ю.Е. Объектно-ориентированная среда программирования. Системы и средства информатики. Вып.2. М.: Наука, 1991.
2. Иванова Г.С., Ничушкина Т.Н., Пугачев Е. «Объектно-ориентированное программирование: Учебник для вузов Изд. 2-е», М: МГТУ им. Н.Э.Баумана
3. Фаронов В.В. Delphi 2005. Язык, среда, разработка приложений. – СПб.: Питер, 2005 г.
4. Вирт Н. Алгоритмы и структуры данных. – Изд. Невский Диалект, 2001 г.
5. Козин А. Н. «Структуры и алгоритмы обработки данных» ТИСБИ, 2003
Страницы: 1, 2, 3