Динамично се определят разстоянията и положението на обектите, за да са централно разположени винаги.
След стартирането на програмата, се появява меню с възможностите на програмата.
мрежа.
им.
програмата.
за тях полета. Извършен е
лог. контрол върху
въвежданите стойности.
Появяват се 2 таблици: за въвеждане на дъгите и за въвеждане на началната маркировка. При натискане на бутон „ОК” данните се прочитат в паметта и се предоставя вече пълно меню.
Така изглежда избора – добавяне на позиция. Иска се от потребителя да въведе дъгите към всички съществуващи преходи и маркировката за тази позиция. С бутона „Добави” въведената информация се добавя към мрежата.
Но, ако не е достижимо ни се извежда дървото на достижимост за първоначалната маркировка.
Въведено е ограничение – мрежата може да има най-много 5 позиции и 5 прехода. Нейното представяне в паметта е под формата на двумерен масив. Маркировката се съхранява в отделен едномерен масив.
При съставянето на дървото на достижимост има ограничение до 20 етапа(ако могат да се създадат, преди да стане мрежата пасивна) или до 50 маркировки получени при последователното активиране на преходите.
6.Системни изисквания
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
zadav: TButton;
dob_poz: TButton;
predst: TButton;
tmark: TButton;
zapis: TButton;
exit: TButton;
SD: TSaveDialog;
procedure exitClick(Sender: TObject);
procedure zadavClick(Sender: TObject);
procedure predstClick(Sender: TObject);
procedure dob_pozClick(Sender: TObject);
procedure zapisClick(Sender: TObject);
procedure tmarkClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const max=5;
var
Form1: TForm1;
br_poz: Byte;
br_preh: Byte;
matr: array[1..max,1..max] of integer;
mark: array[1..max] of integer;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm}
procedure TForm1.exitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.zadavClick(Sender: TObject);
begin
form1.visible:=false;
form2.visible:=true;
form2.Panel1.Visible:=false;
end;
procedure TForm1.predstClick(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
end;
procedure TForm1.dob_pozClick(Sender: TObject);
begin
if Br_poz=max then
raise ERangeError.CreateFmt(
'Максималният брой позиции е достигнат [%d]', [max]);
form1.visible:=false;
Application.CreateForm(TForm5, Form5);
end;
procedure TForm1.zapisClick(Sender: TObject);
var i,j:byte;
F1:TextFile;
begin
if SD.Execute then begin
AssignFile(F1, SD.Filename+'.txt');
Rewrite(F1);
write(F1,'Матрица (' + IntToStr(br_poz) + ',' + IntToStr(br_preh) + ')' + #13#10);
for i := 1 to br_poz do begin
for j := 1 to br_preh do
write(F1,(IntToStr(matr[j,i])+' '));
write(F1,#13#10);
end;
write(F1,'Маркировка - [ ');
for i:=1 to br_poz do write(F1,(IntToStr(mark[i])+' '));
write(F1,']');
showmessage('Съхранено!');
end;
CloseFile(F1);
end;
procedure TForm1.tmarkClick(Sender: TObject);
begin
form1.visible:=false;
Application.CreateForm(TForm4, Form4);
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
BrPoz: TEdit;
Label2: TLabel;
BrPreh: TEdit;
Panel1: TPanel;
spisak: TButton;
matrica: TButton;
StringGrid1: TStringGrid;
Btn_ok: TButton;
StringGrid2: TStringGrid;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure matricaClick(Sender: TObject);
procedure Btn_okClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.visible:=true;
end;
procedure TForm2.matricaClick(Sender: TObject);
var i,j:byte;
begin
try
br_poz := StrToInt(BrPoz.Text);
except
MessageDlg('Грешен брой позиции', mtError, [mbOK], 0);
Exit;
end;
try
br_preh := StrToInt(BrPreh.Text);
except
MessageDlg('Грешен брой преходи', mtError, [mbOK], 0);
Exit;
end;
if (br_poz > max) or (br_poz < 1) or (br_preh > max)
or (br_preh < 1) then
raise ERangeError.CreateFmt(
'Броят на позициите/преходите трябва да е [1..%d]', [max]);
Panel1.Visible:=true;
StringGrid1.ColCount:=1+br_preh;
StringGrid1.RowCount:=1+br_poz;
for i := 1 to br_preh do
StringGrid1.Cells[i, 0] := 't' + IntToStr(I);
for i := 1 to br_poz do begin
StringGrid1.Cells[0, i] := 'p' + IntToStr(I);
StringGrid2.Cells[0, i] := 'p' + IntToStr(I); end;
StringGrid2.RowCount:=1+br_poz;
StringGrid2.Cells[1, 0]:= 'µ';
for i := 1 to br_preh do
for j := 1 to br_poz do begin StringGrid1.Cells[i, j]:='0';
StringGrid2.Cells[1, j]:='0'; end
end;
procedure TForm2.Btn_okClick(Sender: TObject);
var i,j:byte;
begin
for i := 1 to br_preh do
for j := 1 to br_poz do
matr[i,j]:=StrToInt(StringGrid1.Cells[i, j]);
for i := 1 to br_poz do
mark[i]:=StrToInt(StringGrid2.Cells[1, i]);
form2.visible:=false;
form1.visible:=true;
form1.dob_poz.enabled:=true;
form1.predst.enabled:=true;
form1.tmark.enabled:=true;
form1.zapis.enabled:=true;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TForm3 = class(TForm)
Panel1: TPanel;
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit2;
{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
var
Bitmap: TBitmap;
rPoz, rPr,XX,YY:integer;
i,j:byte;
def:Tcolor;
const maxX=600;
maxY=400;
begin
rPoz:=MaxX div (br_poz+1);
rPr:=MaxX div (br_preh+1);
try
Bitmap := TBitmap.Create;
Bitmap.Width := maxX;
Bitmap.Height := maxY;
Image1.Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
with Image1.Canvas do
begin
Brush.Style:=bsSolid;
Pen.Width:=2;
Font.Size:=12;
def:=Brush.Color;
// MessageDlg('stana'{IntToStr(rPoz)}, mtConfirmation, [mbOK], 0);
for i:=1 to br_poz do begin
Pen.Color := clBlue;
Font.Color := Pen.Color;
TextOut((rPoz*i)-45, 40, 'P'+IntToStr(i));
Image1.Canvas.Ellipse((rPoz*i)-25, 25, (rPoz*i)+25, 75);
if mark[i]<>0 then begin
Font.Color := clBlack;
TextOut((rPoz*i)-5, 40, IntToStr(mark[i]));
Font.Color := Pen.Color;
end;
Pen.Width:=1;
for j:=1 to br_preh do begin
if matr[j,i]>0 then begin
Pen.Color:=clNavy;
Image1.Canvas.MoveTo((rPoz*i)+5, 75);
Image1.Canvas.LineTo((rPr*j)+10, 348);
if matr[j,i]>1 then begin
XX:=abs((rPoz*i)+5+(rPr*j)+10) div 2;
YY:=(75+348) div 2;
Font.Color := Pen.Color;
TextOut(XX, YY, IntToStr(matr[j,i]));
end;
Brush.Color:=Pen.Color;
Image1.Canvas.Ellipse((rPoz*i)+2, 72, (rPoz*i)+8, 78);
Brush.Color:=def;
end;
if matr[j,i]<0 then begin
Pen.Color:=clRed;
Image1.Canvas.MoveTo((rPoz*i)-5, 75);
Image1.Canvas.LineTo((rPr*j)-10, 346);
if matr[j,i]<-1 then begin
XX:=abs((rPoz*i)-5+(rPr*j)-10) div 2;
YY:=(75+346) div 2;
Font.Color := Pen.Color;
TextOut(XX, YY, IntToStr(abs(matr[j,i])));
end;
Brush.Color:=Pen.Color;
Image1.Canvas.Ellipse((rPr*j)-13, 342, (rPr*j)-7, 348);
Brush.Color:=def;
end;
end;
Pen.Width:=2;
end;
Pen.Color := clGreen;
Font.Color := Pen.Color;
Pen.Width:=4;
for i:=1 to br_preh do begin
TextOut((rPr*i)-5, 360, 't'+IntToStr(i));
Image1.Canvas.Rectangle((rPr*i)-35, 348, (rPr*i)+35, 352);
end; end;
end;
end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm4 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
markT :array[1..5] of integer;
tmpMark :array[1..5] of integer;
const MaxM=20;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
var i : byte;
begin
StringGrid1.ColCount:=1+br_poz;
for i := 1 to br_poz do begin
StringGrid1.Cells[i, 0] := 'p' + IntToStr(I);
StringGrid1.Cells[i, 1] := '0' end;
StringGrid1.Cells[0, 1]:= 'µ';
end;
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.visible:=true;
end;
function sravn():boolean;
var j: byte;
begin
sravn:=true;
for j:= 1 to br_poz do
if tmpMark[j]<>markT[j] then sravn:=false;
end;
procedure TForm4.Button1Click(Sender: TObject);
var i,j,k,brPr,jj,red : byte;
msg:string;
resh:array[0..50,0..max] of integer;
ima:boolean;
begin
brPr:=0; msg:=' Решение: ';
resh[0,0]:=0;
for j := 1 to br_poz do begin
markT[j]:=StrToInt(StringGrid1.Cells[j, 1]);
resh[0,j]:=mark[j];
end;
for red:=0 to MaxM do begin
if red>brPr then break;
for i := 1 to br_preh do begin
for jj:=1 to br_poz do tmpMark[jj]:=resh[red,jj];
for j := 1 to br_poz do begin
ima:=false;
if matr[i,j] < 0 then
if (tmpMark[j] >= abs(matr[i,j])) then begin
for k:=1 to br_poz do
if matr[i,k]>0 then begin ima:=true;
tmpMark[k]:=tmpMark[k]+matr[i,k];
end;
if ima then begin
inc(brPr); resh[brPr,0]:=i;
tmpMark[j]:=tmpMark[j]+matr[i,j];
end;
for jj:=1 to br_poz do resh[brPr,jj]:=tmpMark[jj];
end;
if sravn() then begin
for jj:=1 to brPr do begin
msg:=msg+#10#13+' Т'+IntToStr(resh[jj,0])+' µ=(';
for k:=1 to br_poz-1 do
msg:=msg+InttoStr(resh[jj,k])+',';
msg:=msg+InttoStr(resh[jj,br_poz])+')';
end;
showmessage(msg);
exit;
end;
end;{for j}
end;{for i}
end; {for red}
msg:=msg+#10#13#10#13 +'Не може да бъде достигната тази маркировка';
showmessage(msg);
msg:='Начални преходи:';
for i:=1 to brPr do begin
msg:=msg+#10#13+' Т'+IntToStr(resh[i,0])+' µ=(';
for j:=1 to br_poz-1 do
msg:=msg+InttoStr(resh[i,j])+',';
msg:=msg+InttoStr(resh[i,br_poz])+')';
end;
showmessage(msg);
end;
end.
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm5 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm5.FormCreate(Sender: TObject);
var i:byte;
begin
StringGrid1.ColCount:=1+br_preh;
for i := 1 to br_preh do
StringGrid1.Cells[i, 0] := 't' + IntToStr(I);
StringGrid1.Cells[0, 1] := 'P' + IntToStr(1+Br_poz);
StringGrid2.Cells[0, 0]:= 'µ'; StringGrid2.Cells[0, 1]:= '0';
for i := 1 to br_preh do StringGrid1.Cells[i, 1]:='0';
end;
procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.visible:=true;
end;
procedure TForm5.Button1Click(Sender: TObject);
var j : byte;
begin
inc(br_poz);
for j := 1 to br_preh do
matr[j, br_poz]:=StrToInt(StringGrid1.Cells[j, 1]);
mark[br_poz]:=StrToInt(StringGrid2.Cells[0, 1]);
// MessageDlg(IntToStr(mark[br_poz]), mtConfirmation, [mbOK], 0);
form5.visible:=false;
form1.visible:=true;
end;
end.