4. Описание пользовательского интерфейса.
В данной программе используются следующие компоненты Label, Edit, StringGrid, Menu, BitBtn, RadioGroup, StatusBar.
Текстовой компоненты Label, Edit, StringGrid:
Метки(Label) предназначены для размещения на экране текстовой информации, содержащей различные пояснения, названия, заголовки и т.д.
Строка ввода Edit позволяет вводить и редактировать одну строку текста.
Таблица StringGrid представляет собой сетку в которой содержаться строки и столбцы.
RadioGroup – это набор зависимых между собой переключателей.
Кнопка Button: основное назначение кнопки – формирование события при нажатии на неё. Кнопка может быть размещена в любом месте формы, где есть необходимость выполнить какие-либо действия при её нажатии.
Кнопка BitBtn: на этой кнопке в отличие от Button можно размещать значки.
Добавление ключа: вводим в редактор Edit ключ, нажимаем кнопку «Добавить», в зависимости от значения ключа получаем результат в виде сообщения MessageDlg:
Поиск: задаем искомый ключ в редактор ввода Edit, нажимаем кнопку«Найти», выдается сообщение об успешности поиска, если элемент найден, то в панели задач указывается количество сравнений .
1. Листинг и описание всех классов библиотеки на DP.
6.1. Описание всех классов.
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 {класс списка}
private
Head:TItem;//заголовок списка
public
constructor Create(aKey:string);//создание списка
function AddFirst(aKey:string):boolean;//добавление перед заголовком
function AddLast(aKey:string):boolean;//добавление после заголовка
function GetHead:TItem;// дать заголовка
end;
{***********************************}
TMas=class {класс-контейнер массива списков}
private
mas:array [1..10]of TList;
public
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-текущий эл-т списка
end;
{***********************************}
var Hesh:TMas;
implementation
uses Main,SysUtils,Dialogs;
constructor TItem.Create(aNext:TItem;aKey:string);
begin
next:=aNext;
Key:=aKey;
end;
function TItem.Getnext:TItem;
begin
Result:=next;
end;
procedure TItem.SetNext(aNext:TItem);
begin
next:=aNext;
end;
Function TItem.GetKey:string;
begin
Result:=Key;
end;
{*************************************}
constructor TList.Create(aKey:String);
begin
Head:=TItem.Create(nil,aKey);
end;
function TList.AddFirst(aKey:string):boolean;
var Temp,Current,Previos:TItem;
begin
previos:=Head;
current:=Head.Getnext;
Temp:=TItem.Create(current,aKey);
Temp.next:=current;
previos.next:=Temp;
result:=true;
end;
function TList.AddLast(aKey:string):boolean;
var Temp,Current:TItem;
begin
// Внесение нового элемента в список
Current:=Head.Getnext;
Temp:=TItem.Create(Head.next,aKey);
Head.next:=Temp;
result:=true;
end;
function TList.GetHead:TItem;
begin
Result:=Head;
end;
{*************************************}
constructor TMas.Create(aKey:string);
var i:integer;
begin
for i:=1 to 10 do mas[i]:=TList.Create(aKey);
end;
function TMas.HeshFunction(aKey:string):integer; //Hesh-функция
var x,i,j:integer;
begin
x:= 0;
for i:=1 to length(aKey) do x:=ord(aKey[i])+x; // Определение значения строки
j:=(x mod 10)+1; //Определение элемента
result:=j;
end;
function TMas.Add(aKey:string;found:byte):byte;
var j:integer;
begin
j:=HeshFunction(aKey);
if Found=0 then
begin
if mas[j].Head.next<>nil then result:=j else result:=0;
mas[j].AddFirst(aKey);
end else
if found=1 then
begin
if mas[j].Head.next<>nil then result:=j else result:=0;
mas[j].AddLast(aKey);
end;
end;
function Tmas.Search(aKey:string;var aCount:integer):string;
var j:integer; Cur:TItem;
begin
//Поиск в списке
j:=HeshFunction(aKey);
aCount:=1;
Cur:= mas[j].GetHead.Getnext;
while (Cur<>nil) and (Cur.key<>aKey) do
begin
inc(aCount);
Cur:= Cur.next;
end;
if Cur=nil then
begin
result:='0';
Exit;
end else
begin
result:=Cur.key;
exit;
end;
end;
procedure TMas.DeleteAll;//удаление контейнера
var i:integer; Cur:TItem;
begin
for i:=1 to 10 do
begin
cur:=mas[i].Head.Getnext;
While Cur<>nil do
begin
mas[i].Head.next:=Cur.next;
Cur.Destroy;
cur:=mas[i].Head.next;
end;
end;
Hesh.Destroy;
Hesh:=nil;
end;
Procedure TMas.Extract(var aIndex:integer;var aCur:TItem);//Вывод:aIndex-текуший индекс массива,aCur-текущий эл-т списка
begin
aCur:=mas[aIndex].Head.next;
end;
Procedure Tmas.SaveHesh(FileName:String);//сохранение контейнера в файле
var Current:TItem;tf:TextFile;i:integer;
begin
AssignFile(tf,FileName);
rewrite(tf);
for i:=1 to 10 do
begin
Current:=mas[i].Head.Getnext;
while Current<>Nil do
begin
Write(tf,Current.key+' ');
Current:=Current.next;
end;
Writeln(tf);
end;
CloseFile(tf);
end;
Procedure TMas.LoadHesh(FileName:String);//Загрузка контейнера из файла
var tf:TextFile;s,si,Key:string;b,bf:Boolean;i:integer;
begin
b:=False;
AssignFile(tf,FileName);
Reset(tf);
while Not Eof(tf) do
begin
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
begin
b:=True;
Key:=si;
Hesh:=TMas.Create(Key);
bf:=true;
si:='';
end else
begin
if bf=False then
begin
bf:=True;
Key:=si;
end else
begin
Hesh.Add(SI,0);
end;
si:='';
end; {end For}
end;{end While}
CloseFile(tf);
end;
end.
Описание Demo-программы.
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ExtCtrls, Menus, ComCtrls;
type
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
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
uses ClassHeshProg;
{$R *.dfm}
procedure Output;
var i,j:integer;Cur:TItem;
begin
for i:=1 to 10 do
begin
j:=1;
Hesh.Extract(i,Cur);
While Cur<>nil do
begin
form1.StringGrid1.Cells[i-1, j]:=Cur.GetKey;
Cur:=Cur.Getnext;
inc(j);
end;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
var i:integer;
begin
for i:=1 to form1.StringGrid1.ColCount do
begin
form1.StringGrid1.Cols[i-1].Add(inttostr(i));
end;
form1.StatusBar1.Panels.Add.Text:='Объектная реализация HESH-поиска.';
form1.OperationGroup.ItemIndex:=0;
form1.AddGroup.ItemIndex:=1;
end;
procedure TForm1.CloseButtonClick(Sender: TObject);
begin
if MessageDlg('Сохранить изменения?',mtConfirmation,[mbYes, mbNo],0)=mrYes then
begin
SaveClick(Sender);
NewClick(Sender);
Close; end else
begin
Hesh.DeleteAll;
Close;
end;
end;
procedure TForm1.InicialClick(Sender: TObject);
var i,j,count:integer;
begin
if Hesh=nil then
begin
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);
end else
begin {AddLast}
j:=Hesh.Add(Edit1.Text,1);
if j<>0 then MessageDlg('Конфликт в ячейке '+inttostr(j),MtInformation,[mbok],1);
MessageDlg('Ключ с значением '+Edit1.Text+' добавлен.',MtInformation,[mbok],1);
end;
Output;
end;
1:begin {Search}
If Edit1.Text= '' then MessageDlg('Введите значение!',MtError,[mbOK],1) else
if Hesh.Search(Edit1.Text,Count)='0' then
MessageDlg('Элемент не найден!',MtError,[mbok],1) else
begin
MessageDlg('Элемент найден со значением '+Edit1.Text,MtInformation,[mbok],1);
StatusBar1.Panels.Clear;
StatusBar1.Panels.Add.Text:='Количество сравнений : '+inttostr(Count);
end;
end;
2: begin {Clear}
NewClick(Sender);
end;
end;{end case}
Edit1.SetFocus;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Hesh:=TMas.Create('');
end;
procedure TForm1.SaveClick(Sender: TObject);
begin
if SaveDialog1.Execute then
if Hesh<>Nil then begin
Hesh.SaveHesh(SaveDialog1.FileName);
NewClick(Sender); end else
MessageDlg('HESH-таблица не создана.',MtError,[mbok],1);
end;
procedure TForm1.LoadClick(Sender: TObject);
begin
NewClick(Sender);
if OpenDialog1.Execute then
begin
Hesh.LoadHesh(OpenDialog1.FileName);
Output;
end;
end;
procedure TForm1.CloseMenuClick(Sender: TObject);
begin
CloseButtonClick(Sender);
end;
procedure TForm1.NewClick(Sender: TObject);
var i,j:integer;
begin
if Hesh<>nil then
begin
Hesh.DeleteAll;
for i:=0 to 10 do for j:=1 to 10 do
begin
stringgrid1.Cells[i,j]:='';
end;
end;
end;
procedure TForm1.OperationGroupClick(Sender: TObject);
begin
case OperationGroup.ItemIndex of
0:begin
Inicial.Caption:='Добавить';
Edit1.Text:='';
end;
1:begin
Inicial.Caption:='Найти';
Edit1.Text:='';
end;
2:begin
Inicial.Caption:='Очистить';
Edit1.Text:='';
end;
end;
end;
procedure TForm1.SavaBtnClick(Sender: TObject);
begin
SaveClick(Sender);
end;
procedure TForm1.LoadBtnClick(Sender: TObject);
begin
LoadClick(Sender);
end;
end.
7. Список использованной литературы.
1. Иванов А.Г., Карпова А.В., Семик В.П., Филинов Ю.Е. Объектно-ориентированная среда программирования. Системы и средства информатики. Вып.2. М.: Наука, 1991.
2. Иванова Г.С., Ничушкина Т.Н., Пугачев Е. «Объектно-ориентированное программирование: Учебник для вузов Изд. 2-е», М: МГТУ им. Н.Э.Баумана
3. Фаронов В.В. Delphi 2005. Язык, среда, разработка приложений. – СПб.: Питер, 2005 г.
4. Вирт Н. Алгоритмы и структуры данных. – Изд. Невский Диалект, 2001 г.
5. Козин А. Н. «Структуры и алгоритмы обработки данных» ТИСБИ, 2003
... - код не совпадает, сравнение не проводим. QWERYTEWEQWERTY FS = 25 - [E] + [Y] = 25 - 3 + 6 = 28 - код совпадает, полное сравнение совпадает. Ура! Текст программы: Program FSISHF; {поиск подстроки в строке} Const NStr = 30000; NSub = 3000; Var FStr : array[1..NStr] of char; FSub : array[1..NSub] of char; {substring} FSum, NSum : longint; {Контрольная сумма} Spec, Work : word; ...
... Windows Server 2003 SP2 или Windows XP SP2; - IIS 6.0 или выше; - SQL Server 2008; - Microsoft .NET Framework 2.0. 3 РАЗРАБОТКА СТРУКТУРЫ СИСТЕМЫ АВТОМАТИЗИРОВАННОГО ПОИСКА ОТДЕЛЕНИЙ И ТЕРМИНАЛОВ БАНКОВ 3.1 Проектирование программной системы Современный мир, в котором движется все очень быстро, потеря времени может стоить очень дорого. Люди дорожат своим временем, средствами, ...
... . Вычисление хэш-адреса происходит в два этапа: 1. Вычисление нормализованного хэш-адреса в интервале [0..1] по формуле: хеширование адрес алгоритм обработка текстовый F(K) = (С*К) mod 1, где С — некоторая константа из интервала [0..1], К — результат преобразования ключа в его числовое представление, mod 1 означает, что F(K) является дробной частью произведения С*К. 2. Конечный хэш-адрес ...
... и пыльном углу диска: выложите для всеобщего доступа и пусть все удивятся, как много денег у вас было на карточке.Вот, собственно, и все правила. Правда несложные? Будущее пиринговых сетей в целом видится довольно радужным. Страсть людей к обмену (да ещё и бесплатному, чего уж там темнить) неистребима. Страсть компаний к зарабатыванию денег также неистребима. Получается классический случай: ...
0 комментариев