N:integer; { общее количество вызовов}
procedure generate; {подпрограмма генерации вызовов}
var
g:integer;
begin
if i mod Ty=0
then
begin
N:=N+1; {счетчик вызовов}
if sl>=m then sl:=1
else sl:=sl+1;
if s_line[sl]=0 then
begin
if wait[h]=0 {проверка занятости очереди}
then
begin
s_line[sl]:=-1;{занятие линии номер sl}
wait[h]:=sl; {запись в конец очереди номера соединительной линии}
writeln('возникла заявка линия номер=',sl,');
N_Tsr[sl]:=N_Tsr[sl]+1; {счетчик кол-ва вызовов линии sl}
end
else otk2:=otk2+1; {отказ занят буфер}
end
else otk1:=otk1+1 {отказ т.к. занята линия}
end
end;
procedure structuir_bufer ; {подпрограмма упорядочивания очереди}
var y:integer;
begin
for y:=1 to h-1 do
begin
wait[y]:=wait[y+1];
end;
wait[h]:=0;
end; {конец подпрограммы}
procedure bufer ;
var r,n,a:integer;
begin
r:=wait[1];
if s_line[r]>=Tog then {проверка порога ожидания}
begin
otk3:=otk3+1; {отказ по ожиданию}
a:=wait[1];
s_line[a]:=0; {сброс ожидания}
wait[1]:=0; {сброс буфера}
structuir_bufer;
end;
n:=0;
if wait[h]<>0
then {выстраивание в очередь}
begin
while n<>h do begin
n:=n+1;
if wait[n]=0 then
begin
if n<>h then
begin
wait[n]:=wait[h];
wait[h]:=0;
n:=h;
end;
end;
end;end;
end; {end procedure}
procedure ent_bufer(v:integer);
var b:integer;
begin
if wait[1]<>0 then
begin {если очередь не пуста }
server[v]:=wait[1]; {запись из буфера в сервер}
writeln(' линии =',server[v]);
wait[1] :=0; {сброс буфера }
b:=server[v]; {начало отсчета обслуживания в сервере}
s_line[b]:=-1;
structuir_bufer;
end
end;
procedure serv ;
var v,b:integer;
begin
for v:=1 to l do
begin
if server[v]=0 then
begin
writeln(' свободна линия сервера --',v);
ent_bufer(v);
end
else
begin
writeln(' server[',v,']=',server[v]);
b:= server[v]; {считывание номера обслуживаемой линии}
if s_line[b]>=Tm then {проверка конца обслуживания}
begin
writeln('конец обслуживания линии ',server[v],'такт',i); {test}
s_line[b]:=0;
server[v]:=0;
ent_bufer(v);
end
end;
end;
end;
end; {end procedure}
procedure itog;
var z:integer;
begin
writeln('N=',n);
writeln('otk1=',otk1);
writeln('otk2=',otk2);
writeln('otk3=',otk3);
for i:=1 to m do
begin
if N_Tsr[i]=0 then
Tsr[i]:=0
Else
Tsr[i]:=Tsr[i] / N_Tsr[i];
writeln('Tsr[',i,']=',Tsr[i]);
end;
end; {end procedure}
begin {начало основной программы}
clrscr;
write('введите величину интервала между заявками');
read(Ty);
for i:=1 to Tend do
begin
for u:=1 to m do
begin
if s_line[u]<>0 then
begin
if s_line[u]=-1 then
s_line[u]:=1 else
s_line[u]:=s_line[u]+1;
Tsr[u]:=Tsr[u]+1; { подсчет времени использования}
writeln('s_line[',u,']=',s_line[u]);
end;
end;
generate;
bufer;
serv;
for u:=1 to h do
write('wait[',u,']=',wait[u],' ');
writeln;
writeln('***************************** такт', i );
readln;
end; {конец времени моделирования}
itog;
end. {конец программы}
Алгоритм и описание работы программы моделирующей функционирование системы ступени коммутации
Программа SETY написана на языке программирования TURBO PASCAL 7.0.
Для большей читабельности и удобства отладки программы каждый самостоятельный фрагмент выделен в отдельную подпрограмму.
Таким образом, программа содержит шесть подпрограмм:
Generate- подпрограмма эмулирует вызовы с заданной интенсивностью а также производит подсчет общего количества вызовов и отказов первого и второго типа,
Bufer -подпрограмма модулирует такие функции буфера как подсчет времени обслуживания заявки в буфере и продвижение заявок в очереди ,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.