- •Лабораторная работа №1 календарь событий
- •Порядок выполнения работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №2
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №3
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №4
- •Содержание отчета
- •Контрольные вопросы
Лабораторная работа №1 календарь событий
Цель работы: ознакомление со структурой и обслуживанием календаря событий систем имитационного моделирования.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Учет и регистрация планируемых временных событий в процессе имитационного моделирования осуществляются с помощью особого файла (списка) – календаря событий.Планируемые события заносятся в календарь в любые моменты системного времени в соответствии с логикой работы модели, отображающей поведение исследуемого объекта. При этом в очередную запись календаря вносятсяхарактеристики (атрибуты) планируемого события, егокод(класссобытия) ивремянаступления. Записи календаря упорядочены по времени наступления событий в порядке возрастания. Процессор имитационного моделирования в нужные моменты времени извлекает из календаря очередную запись с ближайшим событием и реализует его, осуществляя необходимые для этого изменения в модели.
Рассмотрим программу, демонстрирующую формат календаря, операции по планированию иперегруппировкесобытий в календаре иизвлечениюиз календаря события сминимальнымвременем исполнения.
program kalendar;
uses crt;
type
ta1=array [1..10] of integer;
ta2=array [1..12,1..10] of integer;
var
i,j,kevnt,matr,dtime,nnq1,tnow:integer;
f:file of ta2;
a,b,a1,a2,attr:ta1;
a3:ta2;
procedure grup;
var
l,k,h,i,j,n:integer;
begin
writeln(' Подпрограмма перегруппировки');
seek(f,0);
read(f,a3);
n:=1;
while a3[matr+2,n]=0 do
begin
for k:=1 to nnq1-1 do
for l:=1 to matr+2 do
begin
a3[l,k]:=a3[l,k+1];
a3[l,k+1]:=0;
end;
n:=n+1;
end;
h:=nnq1 div 2;
i:=0;
while h<>0 do
begin
for j:=h+1 to nnq1 do
begin
i:=j-h;
for k:=1 to matr+2 do
a[k]:=a3[k,j];
repeat
for k:=1 to matr+2 do
b[k]:=a3[k,i];
if (a[matr+2]<b[matr+2])and(a[matr+2]>0) then
begin
for k:=1 to matr+2 do
a3[k,i+h]:=b[k];
i:=i-h;
end;
until (i<=0)or(a[matr+2]>=b[matr+2])or(a[matr+2]=0);
for k:=1 to matr+2 do
a3[k,i+h]:=a[k];
end;
h:=h div 2;
end;
seek(f,0);
write(f,a3);
writeln(' Вывод нового календаря');
for i:=1 to nnq1 do
begin
for j:=1 to matr+2 do
write(a3[j,i],' ');write(' ');
end;
writeln;
end;
procedure schdl(kevnt,dtime:integer;a4:ta1);
var
i,j:integer;
begin
for i:=1 to matr do a2[i]:=a4[i];writeln('Атрибуты события ',a1[1]);
a2[matr+1]:=kevnt;writeln('код события ',kevnt);
a2[matr+2]:=tnow+dtime;writeln('время события ', tnow+dtime);
seek(f,0);
read(f,a3);
j:=1;
while a3[matr+1,j]<>0 do j:=j+1;
for i:=1 to matr+2 do a3[i,j]:=a2[i];
seek(f,0);
write(f,a3);
writeln(' Вывод календаря');
for i:=1 to nnq1 do
begin
for j:=1 to matr+2 do
write(a3[j,i],' ');write(' ');
end;
writeln;
grup;
end;
procedure rmove;
var
i,j:integer;
begin
seek(f,0);
read(f,a3);
i:=a3[matr+1,1];
writeln(' Код извлеченного события ',i);
writeln(' Время извлеченного события ',a3[matr+2,1]);
for j:=1 to matr+3 do a3[j,1]:=0;
for j:=1 to matr do attr[j]:=a3[j,1];
seek(f,0);
write(f,a3);
writeln(' Вывод календаря');
for i:=1 to nnq1 do
begin
for j:=1 to matr+2 do
write(a3[j,i],' ');write(' ');
end;
writeln;
grup;
end;
begin
clrscr;
matr:=1;
nnq1:=3;
tnow:=4;
assign(f,'kalend.dat');
rewrite(f);
for i:=1 to nnq1 do
for j:=1 to matr+2 do
a3[j,i]:=0;
seek(f,0);
write(f,a3);
a1[1]:=_;
writeln(' Планирование первого события');
schdl(_,_,a1);
writeln(' Планирование второго события');
schdl(_,_,a1);
writeln(' Планирование третьего события');
schdl(_,_,a1);
writeln(' Извлечение ближайшего события');
rmove;
writeln('Имитация завершена');
end.
Подчеркивания заменяются числовыми значениями, указанными в таблице вариантов (табл. 1).
В программе используются следующие величины:
kevnt – код планируемого события,
matr –количество атрибутов,
dtime – интервал свершения планируемого события,
nnq1- число записей календаря,
tnow –системное время.
При проведении операций с календарем данные из файла календаря f копируются в массивa3. Для формирования очередной записи используется вспомогательный массивa2, куда поступают атрибуты события (из массиваa1), код и интервал свершения. Извлечение атрибутов события производится в специализированный массивattr.
С целью восстановления структуры календаря после операций планирования и извлечения записи вызывается подпрограмма перегруппировки grup. Последняя либо сдвигает весь календарь влево на одну запись (после извлечения события), либо расставляет записи по закону «меньшее вперед», сравнивая между собой времена свершения запланированных событий.