
22.12.2011, 00:08
|
Прохожий
|
|
Регистрация: 22.12.2011
Сообщения: 7
Репутация: 10
|
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Const MaxSize=MaxInt;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit4: TEdit;
Label7: TLabel;
Edit5: TEdit;
Label8: TLabel;
Label9: TLabel;
Edit6: TEdit;
Label10: TLabel;
Edit7: TEdit;
Label11: TLabel;
Label12: TLabel;
Edit8: TEdit;
Label13: TLabel;
Edit9: TEdit;
Label14: TLabel;
Label15: TLabel;
Edit10: TEdit;
Label17: TLabel;
Label16: TLabel;
Edit11: TEdit;
Label18: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
terminal = record // Тип для терминала
time:byte; // время
inwork: boolean; // работает ли терминал
end;
computer = record // Тип для компьютера
time:byte; // время
inwork: boolean; // работает ли компьютер
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure compare(var t1,t2,t3:terminal);
var a:array[1..3]of integer;
k:integer;
begin
a[1]:=t1.time; // запоминаем время работы для 3 терминалов
a[2]:=t2.time;
a[3]:=t3.time;
if a[3] if a[2] case k of // выбираем нужный терминал
1: if not t1.inwork then t1.inwork:=true else // если он не занят то загружаем его
if (t3.time begin
if not t3.inwork then t3.inwork:=true
else t2.inwork:=true;
end
else
begin
if not t2.inwork then t2.inwork:=true
else t3.inwork:=true;
end;
2: if not t2.inwork then t2.inwork:=true else // если он не занят то загружаем его
if (t3.time begin
if not t3.inwork then t3.inwork:=true
else t1.inwork:=true;
end
else
begin
if not t1.inwork then t1.inwork:=true
else t3.inwork:=true;
end;
3: if not t3.inwork then t3.inwork:=true else // если он не занят то загружаем его
if (t2.time begin
if not t2.inwork then t2.inwork:=true
else t1.inwork:=true;
end
else
begin
if not t1.inwork then t1.inwork:=true
else t2.inwork:=true;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var users:array[1..MaxSize] of byte; // время прихода пользователей
terminal1:array[1..MaxSize] of terminal; // время обработки задания на терминале 1
terminal2:array[1..MaxSize] of terminal; // время обработки задания на терминале 2
terminal3:array[1..MaxSize] of terminal; // время обработки задания на терминале 3
computer1, computer2: computer; // время обработки программы на ЭВМ 1 и ЭВМ 2
i,j,k,l,otkaz:integer;
Count,TimeOfWorkOfComputer1,TimeOfWorkOfComputer2,TimeUser,
DeltaTimeUser,TimeTerminal1,DeltaTimeTerminal1,TimeTerminal2,
DeltaTimeTerminal2,TimeTerminal3,DeltaTimeTerminal3: integer;
begin
Count:= strtoint(edit1.Text); // количество пользователей
TimeOfWorkOfComputer1:= strtoint(edit10.Text); // время работы ЭВМ1
TimeOfWorkOfComputer2:= strtoint(edit11.Text); // время работы ЭВМ2
TimeUser:= strtoint(edit8.Text); // среднее время ожидания пользователя
DeltaTimeUser:= strtoint(edit9.Text); // разброс времени ожидания пользователя
TimeTerminal1:= strtoint(edit2.Text); // среднее время работы терминала 1
DeltaTimeTerminal1:= strtoint(edit3.Text); // разброс времени работы терминала 1
TimeTerminal2:= strtoint(edit4.Text); // среднее время работы терминала 2
DeltaTimeTerminal2:= strtoint(edit5.Text); // разброс времени работы терминала 2
TimeTerminal3:= strtoint(edit6.Text); // среднее время работы терминала 3
DeltaTimeTerminal3:= strtoint(edit7.Text); // разброс времени работы терминала 3
randomize;
for i:=1 to Count do
begin
users[i]:=TimeUser+random(DeltaTimeUser*2)-DeltaTimeUser; // время прихода пользователей: 10+/-2
terminal1[i].time:=TimeTerminal1+random(2*DeltaTimeTerminal1)-DeltaTimeTerminal1; // время обработки задания на терминале 1: 20+/-2
terminal1[i].inwork:=false; // терминал 1 не в работе
terminal2[i].time:=TimeTerminal2+random(2*DeltaTimeTerminal2)-DeltaTimeTerminal2; // время обработки задания на терминале 2: 40+/-10
terminal2[i].inwork:=false; // терминал 2 не в работе
terminal3[i].time:=TimeTerminal3+random(2*DeltaTimeTerminal3)-DeltaTimeTerminal3; // время обработки задания на терминале 3: 40+/-20
terminal3[i].inwork:=false; // терминал 3 не в работе
end;
computer1.time:=TimeOfWorkOfComputer1; // время обработки программы на ЭВМ 1: 15
computer1.inwork:=false; // ЭВМ 1 не в работе
computer2.time:=TimeOfWorkOfComputer2; // время обработки программы на ЭВМ 2: 30
computer2.inwork:=false; // ЭВМ 2 не в работе
i:=1;
j:=1;
k:=1;
l:=1;
otkaz:=0;
while (i<=Count) do
begin
dec(users[i]); // уменьшаем время ожидания прихода пользователя
if (users[i]=0) then // если пользователь пришел
begin
if (terminal1[j].inwork and terminal2[k].inwork and terminal3[l].inwork) then inc(otkaz) // если все терминалы заняты то отказ
else compare(terminal1[j],terminal2[k],terminal3[l]); // выбираем неработающий терминал с наименьшим временем
inc(i); // переходим к следующему пользователю
end;
if terminal1[j].inwork then dec(terminal1[j].time); // уменьшаем время обработки задания если оно есть
if terminal2[k].inwork then dec(terminal2[k].time); // уменьшаем время обработки задания если оно есть
if terminal3[l].inwork then dec(terminal3[l].time); // уменьшаем время обработки задания если оно есть
if computer1.inwork then dec(computer1.time); // уменьшаем время обработки программы если оно есть
if computer2.inwork then dec(computer2.time); // уменьшаем время обработки программы если оно есть
if (terminal1[j].time=0) then // если на терминале уже обработано
if not computer1.inwork then // если ЭВМ1 не занят
begin
inc(j); // переходим к следующему времени обработки задания
computer1.inwork:=true; // ЭВМ1 занят
end
else inc(terminal1[j].time); // продлеваем занятость терминала на 1 минуту
if (terminal2[k].time=0) then // если на терминале уже обработано
if not computer1.inwork then // если ЭВМ1 не занят
begin
inc(k); // переходим к следующему времени обработки задания
computer1.inwork:=true; // ЭВМ1 занят
end
else inc(terminal2[k].time); // продлеваем занятость терминала на 1 минуту
if (terminal3[l].time=0) then // если на терминале уже обработано
if not computer2.inwork then // если ЭВМ2 не занят
begin
inc(l); // переходим к следующему времени обработки задания
computer2.inwork:=true; // ЭВМ2 занят
end
else inc(terminal3[l].time); // продлеваем занятость терминала на 1 минуту
if (computer1.time=0) then // если программа обработана на ЭВМ1 переходим к следующему времени обработки программы
begin
computer1.time:=TimeOfWorkOfComputer1;
computer1.inwork:=false;
end;
if (computer2.time=0) then // если программа обработана на ЭВМ2 переходим к следующему времени обработки программы
begin
computer2.time:=TimeOfWorkOfComputer2;
computer2.inwork:=false;
end;
end;
label1.Caption:='Вероятность отказа = '+inttostr(otkaz)+' из '+inttostr(Count)+' ('+floattostr(round(100*otkaz/count))+'%)';
end;
end.
|