По Дискретни структури и моделиране Студент: Христо Димитров Русанов Фак.№063131



Дата18.09.2016
Размер126.68 Kb.
#10084
РУ “Ангел Кънчев” – гр. Русе
Курсова работа

По Дискретни структури и моделиране

Студент: Христо Димитров Русанов

Фак.№ 063131

Група: 18б

Специалност: КСТ

Дата на предаване: Ръководител:



Съдържание



1. Задание 3

2. Архитектура на средата 3

3. Алгоритъм на работа 4

4. Описание на осноните функции и процедури 5

5. РАБОТА С ПРОГРАМАТА 7

6. Системни изисквания 11

7. Код на програмата 12



1.Задание



Да се проектира и реализира инструментално средство за моделиране с мрежи на Петри, работещо в цветен текстов и графичен тежим режим на монитора и реализиращо следните изисквания:

  • Задаване на маркираната мрежа от клавиатурата със списъци и матрици;

  • Добавяне на позиция;

  • Представяне на мрежата като двуетажен граф;

  • Търсене на зададена маркировка;

  • Записване на мрежата в текстов файл



2.Архитектура на средата



3. Алгоритъм на работа






4.Описание на осноните функции и процедури



Вид на процедурата: procedure TForm2.matricaClick(Sender: TObject);

Действие: Прочита броя позиции и преходи и създава таблица – матрицата, в която трябва да въведем броя дъги от всяка позиция до всеки преход. Ако въведем отрицателно число, това означава че въвеждаме предусловие, ако е положително – постусловие за конкретния преход. Създава се и колона за въвеждане на маркировката.

Променливи:

Byte(целочислени): i,j;

Параметри: TObject

Извиквани процедури/ функции: няма

Използвани глобални променливи: StringGrid1, StringGrid2, br_poz, br_preh
Вид на процедурата: TForm2.Btn_okClick(Sender: TObject); Действие: Запазва въведените от формата стойности в матрица. Разрешава ползването на останалите опции от менюто.

Променливи:

Byte(целочислени): i,j;

Параметри: TObject

Извиквани процедури/ функции: няма

Използвани глобални променливи: StringGrid1, StringGrid2, br_poz, br_preh, matr: array[1..max,1..max] of integer; mark: array[1..max] of integer;
Вид на процедурата: TForm3.FormCreate(Sender: TObject);

Действие: Изчертава графика – с кръгове се изобразяват позициите. Във всеки кръг се изписва съответната му маркировка, ако съществува такава. С плътни правоъгълници се изобразяват преходите. Чрез линии се визуализират насочените дъги, като за връх(насоченост) на дъгата е използван плътен кръг. С число върху самата права се изобразява броя дъги от дадена позиция към прехода.

Динамично се определят разстоянията и положението на обектите, за да са централно разположени винаги.



Променливи:

Byte(целочислени): i,j;

Integer(целочислени): rPoz, rPr,XX,YY

Тbitmap: Bitmap

Tcolor: def

Константи:

maxX=600;

maxY=400;

Параметри: TObject

Извиквани процедури/ функции: ТBitmap, Timage, Tcolor

Използвани глобални променливи: br_poz, br_preh, matr[], mark[]

Вид на функцията: function sravn():boolean;

Действие: Проверява дали текущата маркировка съвпада с търсената. Връщаният резултат е от тип булева променлива (истина/лъжа) – дали има съвпадение или не.

Параметри: няма

Променливи: j: byte;

Извиквани процедури/ функции: няма

Използвани глобални променливи:

markT :array[1..5] of integer; (масиви от цели числа)

tmpMark :array[1..5] of integer;

resh:array[0..50,0..max] of integer;


Вид на процедурата: TForm4.Button1Click(Sender: TObject);

Действие: Съставя се дърво на достижимост в масива resh, и се следи дали е достигната въведената маркировка. При успех на екрана се появява списък с всички преминати етапи до достигането и.

Променливи:

Byte(целочислени): i,j,k,brPr,jj,red

String: msg

Boolean: ima

resh:array[0..50,0..max] of integer;



Параметри: TObject

Извиквани процедури/ функции: няма

Използвани глобални променливи: br_poz, br_preh,

matr: array[1..max,1..max] of integer; matr[], mark[]


Вид на процедурата: procedure TForm1.zapisClick(Sender: TObject);

Действие: Запазва маркировката в текстов файл. Потребителя сам избира името на файла и директорията, в която ще се запази той, чрез осигурения за това диалогов прозорец.

Променливи:

Byte(целочислени): i,j;

TextFile: F1
Параметри: TObject

Извиквани процедури/ функции: няма

Използвани глобални променливи: br_poz, br_preh,

matr: array[1..max,1..max] of integer; mark: array[1..max] of integer;



5.РАБОТА С ПРОГРАМАТА

Програмата се стартира с файла Project1.exe. Той е резултат от компилацията на проекта, чрез средата DELPHI 6.0

След стартирането на програмата, се появява меню с възможностите на програмата.


Активен е само първия бутон,

тей като останалите функции

изискват да има налична

мрежа.

Върху самите бутони е



изписано, какво точно се

изпълнява при натискането

им.

С бутона „Изход” се



прекратява работата с

програмата.

За да зададем мрежата,

първо трябва да въведем

броя на позициите и

състоянията в създадените

за тях полета. Извършен е

лог. контрол върху

въвежданите стойности.

Предоставени са и два

бутона за избор на начина

на въвеждане на мрежата

Появяват се 2 таблици: за въвеждане на дъгите и за въвеждане на началната маркировка. При натискане на бутон „ОК” данните се прочитат в паметта и се предоставя вече пълно меню.


Така изглежда избора – добавяне на позиция. Иска се от потребителя да въведе дъгите към всички съществуващи преходи и маркировката за тази позиция. С бутона „Добави” въведената информация се добавя към мрежата.




Така изглежда двуетажния граф, на въведената на по-горната фигура маркировка. Червените линии са предусловията, а лилавите – постусловията.
Ако искаме да търсим достижимост до дадена маркировка, попълваме тази форма и след натискане бутон „Търси” се извършват необходимите стъпки и се появява решение, ако то е достижимо.


Но, ако не е достижимо ни се извежда дървото на достижимост за първоначалната маркировка.

Този диалогов прозорец се появява при избор „Запис” от менюто. Файлът, който се създава е текстов - .txt
Особености:

Въведено е ограничение – мрежата може да има най-много 5 позиции и 5 прехода. Нейното представяне в паметта е под формата на двумерен масив. Маркировката се съхранява в отделен едномерен масив.

При съставянето на дървото на достижимост има ограничение до 20 етапа(ако могат да се създадат, преди да стане мрежата пасивна) или до 50 маркировки получени при последователното активиране на преходите.

6.Системни изисквания

Мicrosoft Windows OS



  • Всички след WINDOWS 98, a за компилиране на програмата е необходим инсталиран DELPHI 6.0

  • Процесор: Pentium 166 MHz или по-бърз

  • Памет: препоръчителни 64 мегабайта RAM.

  • Свободно дисково пространство: 250 мегабайта.

  • Резолюция:640x480(минимална), 800x600(препоръчителна) и по–висока

За Linux базирани системи



  • Поддържат се всички, под които може да се емулира компилатор на DELPHI

  • Процесор: Pentium 166 MHz или по-бърз

  • Памет: 64 мегабайта RAM.

  • Свободно дисково пространство: 250 мегабайта.

  • Резолюция: 640x480(минимална),

800x600 (препоръчителна) и по – висока


7.Код на програмата





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.




Каталог: kst -> download -> Diskretni%20strukturi
kst -> Конспект по дисциплина "Програмиране в Internet"
kst -> Компютърни мрежи
kst -> Лекция №2 Проектиране на сгис
kst -> Лекция №2, 2012 Системи с Програмируема Логика
download -> Конспект по дисциплината „Криптография и защита на данните”
Diskretni%20strukturi -> Дисциплина : Дискретни структури и моделиране Студент: Мюкерем Джевдет Вели Проверил: Фак. Ном: 073272 Група: 25б специалност: кст русе 2009г. Съдържание
download -> 1Цели на упражнението
download -> Отчет за изразходваните материали за всеки ремонт/услуга и за изразходването за целия месец. Изискват се


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница