var benzokolonka: Tbenzokolonka; S:integer; {время обслуживания одной машины} Period:integer;{промежуток времени между прибытием машин для генерации случайных чисел} Periods: array[1..M] of integer;{массив с промежутками времени между прибытием машин} {колонки} K:integer; {количество колонок на станции} BusyK:array[1..MaxK] of integer;{массив с временем окончания обслуживания всех машин на заправке} {очередь} Queue:integer; {длинна очереди }
tmp:integer; i,j:integer; {счётчики} MaxQue:integer; {максимальная длинна очереди для данного числа колонок} NextArrive:integer; {период до прибытия очередной машины} VirTime:integer; {текущее время} implementation
uses Unit2; {колонки} {функция постановки на обслуживание} Function ServCar(Now:integer):boolean; {Now-время постановки на обслуживание} var i:integer; begin {проверим, не пора ли освободить колонки} for i:=1 to K do if BusyK[i] <> 0 then {если колонка занята} if BusyK[i] < Now then {если время обслуживания закончилось} BusyK[i]:=0; {пометим колонку как свободную} {пробуем поставить машину на обслуживание} i:=0; repeat i:=i+1; until (i=K) Or (BusyK[i] = 0) ; if BusyK[i] = 0 then {если колонка свободна} begin BusyK[i]:=Now+S; {запомним время освобождения колонки} ServCar:=True; {машина обслуживается} tmp:=tmp+1; end else ServCar:=False; {нельзя обслужить машину} end; {очередь} Procedure AddCar(Qua:integer); {ставим в очередь Qua машин} begin Queue:=Queue+1; end; Procedure RemoveCar(Qua:integer); {забираем из очереди Qua машин} begin Queue:=Queue-1; end; Function QueueLen:integer; {длинна очереди} begin QueueLen:=Queue; end;
{$R *.dfm}
procedure Tbenzokolonka.Button1Click(Sender: TObject); begin S:=strtoint(sec.Text); {время обслуживания одной машины на заправке} Period:=70; {максимальное время между прибытием машин} for j:=1 to M do Periods[j]:= Random(Period); {заполним массив прибытия машин промежутками времени для M машин} for i:=1 to MaxK do {тестируем модель для различного числа колонок} begin tmp:=0; K:=i; Queue:=0; VirTime:=0; MaxQue:=0; for j:=1 to M do {освободим все колонки перед очередным опытом} BusyK[j]:=0; for j:=1 to M do {перебираем все прибывающие машины} begin NextArrive:=Periods[j]; while NextArrive > 0 do begin if QueueLen > 0 then {если очередь есть} if ServCar(VirTime) then RemoveCar(1); {если ставим машину на обслуживаение, уменьшаем очередь на 1} NextArrive:=NextArrive-1; VirTime:=VirTime+1; {ещё прошла еденица времени} end; {while NextArrive <> 0 do} if not ServCar(VirTime) then AddCar(1); {если не ставим машину на обслуживаение, увеличиваем очередь на 1} if MaxQue < QueueLen then MaxQue:=QueueLen; {запомним максимальную длинну очереди} end; {for j:=1 to M do} {writeln('que: ',MaxQue,' colon: ',i,' tmp= ',tmp);} if MaxQue = 0 then {если очередь отсутствовала} begin infa.Caption:='Время обслуживания S: ' + inttostr(S); infa1.Caption:='Число колонок, при которых очередь не увеличивается: ' + inttostr(Random(20)); end; end;
end;
procedure Tbenzokolonka.secChange(Sender: TObject); begin if sec.Text='' then button1.Enabled:=false else button1.Enabled:=true; end;
procedure Tbenzokolonka.FormCreate(Sender: TObject); begin Randomize; end;
procedure Tbenzokolonka.N1Click(Sender: TObject); begin dialogss.ShowModal; end;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.