Тема. D-деревья.
Цель:
- изучить устройство и принцип заполнения D-деревьев.
- научиться использовать на практике основные алгоритмы по обработке D-деревьев
Ход работы
Разработайте программу в соответствии со следующими требованиями:
- Создание D-дерева (случайное / ручной ввод);
- добавление элемента в D-дерево;
- удаление элемента из D-дерева;
- все операции должны быть наглядно представлены.
- Важно: обязательно соблюдение инварианта!
На форму нужно кинуть только таймер.
Вот собственно код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Math;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
const D=4;
type TIach=record
x,y,znach:integer;
end;
var
Form1: TForm1;
Ia:array[0..999]of TIach;
Xc,Yc,Col:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
randomize;
Ia[0].x:=form1.Width div 2;
Ia[0].Y:=0;
Ia[0].znach:=0;
Col:=1;
Xc:=0;
Yc:=1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i,x:integer;
begin
form1.Canvas.FillRect(rect(0,0,form1.Width,form1.Height));
x:=0;
for i:=1 to Col-1 do
begin
x:=x+1;
form1.Canvas.MoveTo(Ia[i].x,Ia[i].y*36+8);
form1.Canvas.LineTo(Ia[(i-1)div D].x,Ia[(i-1)div D].y*36+8);
end;
for i:=0 to Col-1 do
begin
form1.Canvas.Ellipse(Ia[i].x-16,Ia[i].y*36,Ia[i].x+16,Ia[i].y*36+32);
form1.Canvas.TextOut(Ia[i].x-4,Ia[i].y*36+12,inttostr(Ia[i].znach));
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var ax,ay,i:integer;
begin
if(Button=mbLeft)then
begin
form1.Caption:=inttostr(Xc)+':'+floattostr(power(2,Yc));
Ia[Col].x:=round(form1.Width/(power(D,Yc)*2)*(Xc*2+1));
Ia[Col].Y:=Yc;
Ia[Col].znach:=Col;
Col:=Col+1;
Xc:=Xc+1;
if(Xc>=round(power(D,Yc)))then
begin
Yc:=Yc+1;
Xc:=0;
end;
end
else
begin
ay:=Y div 32;
ax:=round( (x-16)/(form1.Width/(power(D,ay))) );
for i:=round(power(D,ay)-1)+ax to Col-1 do
Ia[ i ].znach:=Ia[ i+1 ].znach;
Col:=Col-1;
Xc:=Xc-1;
if(Xc<0)then
begin
Yc:=Yc-1;
Xc:=round(power(D,Yc))-1;
end;
form1.Caption:=inttostr(ay)+':'+inttostr(ax)+':'+inttostr( round(power(D,ay)-1));
end;
end;
end.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий