WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Технологія розробки мереж Петрі та вирішення проблем які виникають при їх використанні - Дипломна робота

Технологія розробки мереж Петрі та вирішення проблем які виникають при їх використанні - Дипломна робота

співставляє йому унікальне число в нашому випадку це лічильник який постійно змінюється на одиницю і не може повторюватись.
i:=1;
while form1.StringGrid5.Cells[i,1]'' do
begin
if form1.StringGrid5.Cells[i,1]='' then exit;
per[i].name:=form1.StringGrid5.Cells[i,1];
per[i].num:=i;
kl:=i;
inc(i)
end;
Тут виконується те ж саме але вже для множини переходів.
for i:=1 to kilk do
rozmitka[i]:=strtoint(form1.StringGrid1.Cells[i,1]);
В даному фрагменті програми створюється множина початкової розмітки.
i:=1;
while form1.StringGrid2.Cells[i,1]'' do
begin
if form1.StringGrid2.Cells[i,1]='' then exit;
for j:=1 to kilk do
begin
if form1.StringGrid2.Cells[i,1]=mis[j].name then
strdoper[i,1]:=mis[j].num;
end;
for j:=1 to kl do
begin
if form1.StringGrid2.Cells[i,2]=per[j].name then
strdoper[i,2]:=per[j].num;
end;
l1:=i;
inc(i)
end;
Наведений вище цикл виконує досить просту задачу, він створює двовимірний масив в якому зберігається інформація про множинуF. В нашому випадку введений масив (зліва) перетворюється в еквівалентний але з числовим представленням (з права).
P1 P2 P2 P3
a b c d
1 2 2 3
1 2 3 4
Реально програма працює саме з "правим масивом" оскільки комп'ютер швидше справляється з операціями над числами, то доцільніше використовувати не постійне символьне порівняння а числове, тобто порівняння чисел.
while form1.StringGrid3.Cells[i,1]'' do
begin
if form1.StringGrid3.Cells[i,1]='' then exit;
for j:=1 to kl do
begin
if form1.StringGrid3.Cells[i,1]=per[j].name then
strvidper[i,1]:=per[j].num;
end;
for j:=1 to kilk do
begin
if form1.StringGrid3.Cells[i,2]=mis[j].name then
strvidper[i,2]:=mis[j].num;
end;
l2:=i;
inc(i)
end;
Аналогічно створюється і масив Н, стрілок які ведуть від переходів до місць.
procedure main(var bool:boolean);
var n,no,j:integer;
b:boolean;
str:string;
Begin
no:=1;
n:=0;j:=0;
str:='';
while str'deadlock' do
begin
if n=10000 then begin bool:=true; form1.Memo1.lines.add(Дана мережа не має DEADLOCK'); exit; end;
if no=0 then no:=1;
vukper(no,b,l1,l2,ver);
if not(b) then
if nokl then
no:=no+1
else no:=1;
j:=j+1;
if b then j:=0;
if j=kl then str:='deadlock';
if j=0 then n:=n+1;
end;
Дана процедура є самою основною в якій і перевіряється мережа на наявність тупикової розмітки. В цій процедурі використовується ще одна процедура, vukper яка перевіряє перехід на його спроможність спрацювати і саме в ній змінюється розмітка. В ній перебираються всі переходи по черзі і перевіряється кожен з них на робото здатність, тобто чи може перехід спрацювати. Якщо процедура vukper повертає параметр b типу Boolean рівний true це означає, що перехід може спрацювати і ми лічильник j збиваємо на 0 ,якщо b рівний false то перехід з номером no спрацювати не зміг і наш лічильник j збільшується на 1. Як тільки довільний перехід зможе спрацювати то лічильник j збивається на 0. Працює процедура main до тих пір поки о не стане рівним значенню кількості переходів, тобто коли ми переберемо всі переходи і жоден з них не зможе спрацювати, тоді і виникає в тупикова розмітка.
Розглянемо фрагменти процедури vukper.
procedure vukper(no:integer; var bl:boolean; l1:integer; l2:integer; ver:integer);
Ми маємо параметри цієї процедури такі як:
no - номер переходу який ми перевіряємо;
bl - параметр типу Boolean який повертає значення true якщо перехід спрацював, та false якщо це не можливо;
l1 - параметр який передає в процедуру кількість стрілок які ведуть від вершин до переходів;
l2 - параметр який передає в процедуру кількість стрілок які ведуть від переходів до вершин;
ver - кількість вершин в нашій мережі.
for i:=1 to l1 do
begin
if strdoper[i,2]=no then
begin
mas[j]:=strdoper[i,1];
j:=j+1;
end;
end;
Формується масив в якому зберігається всі вершини з яких стрілки прямують до переходів.
klm:=j-1;
for i:=1 to klm do
if rozmitka[mas[i]]>0 then b:=true else begin b:=false; exit; end;
Цей фрагмент перевіряє чи у всіх вхідних вершинах є хоча б одна фішка, тобто чи може спрацювати цей перехід.
if b then
begin
for i:=1 to l2 do
if strvidper[i,1]=no then begin
mas2[j]:=strvidper[i,2];
j:=j+1;
end;
klm2:=j-1;
for i:=1 to kilk do
for j:=1 to klm do
begin
form1.Memo2.Lines.add(s);
if i=mas[j] then begin
rozmitka[i]:=rozmitka[i]-1;
s:=inttostr(i)+'перехід спрацював;
end;
Тут якщо всі вхідні вершини мають принаймні одну фішку то ми з всіх вхідних вершин забираємо по одній фішці. І перед цим створюється масив mas2 в кому зберігаються всі вихідні вершини в які потім буде добавлено по фішці як ми це можемо спостерігати в фрагменті програмного
коду наведеного нижче.
for i:=1 to kilk do
for j:=1 to klm2 do
begin
if i=mas2[j] then begin
rozmitka[i]:=rozmitka[i]+1;
else begin
s:='';
s:=inttostr(i)+'не може спрацювати';
form1.Memo2.Lines.Add(s);
bl:=false
end;
В інакшому випадку, як видно вище, нічого не відбувається і параметру bl присвоюється значення false яке повертається в процедуру main.
3.2. КОРИСТУВАННЯ ПРОГРАМОЮ
Розроблено якомога простіший користувацький інтерфейс програми. Всі поля підписані і вказано в якій послідовності потрібно вводити дані в програму. Для того щоб було простіше користуватися програмою потрібно попередньо ознайомитися з теорією класичних мереж Петрі, а потім вже користуватися програмою.
Після запуску програми (:meregi.exe) перед очима з'являється вікно програми рис. 19 на якому розміщено 5 полів які необхідно по черзі заповнити.
рис 19. Вікно програми з порожніми полями
Перед тим як вводити всі дані необхідно перевірити щоб розкладка на клавіатурі була виставлена на англійську мову, і вводити всі дані або латинськими літерами або цифрами, не використовуючи спеціальних символів.
Спочатку потрібно ввести множину вершин, це робиться наступним чином: встановлюємо курсор в полі над яким є напис "Введіть множину вершин" і по черзі вводимо назви вершин, після введення кожної назви встановлюємо курсор в наступну комірку яка знаходиться поруч не допускаючи порожніх комірок між назвами вершин як це показано на рис 20. Переходам можна присвоювати різні назви але назва не повинна перевищувати чотирьох символів.
рис 20. Задання вершин мережі Петрі
Потім за цим ми повинні ввести множину переходів. Для цього нам необхідно встановити курсор на полі над яким є напис "Ведіть множину переходів" і аналогічно до задання вершин по черзі вводячи назви переходів які в нас є в мережі
Loading...

 
 

Цікаве