![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем привет
У меня задание реализовать приоритетное невытесняющее планирование процессов ( http://cs.mipt.ru/docs/courses/osstud/03/ch3.htm п.3.5.5), т.е. посчитать среднее время ожидание для него. Написал программу, но при запуске она тупо виснет, даже не могу посмотреть где ошибка. Проект прикрепляю к сообщению, посмотрите пжл Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
n: integer;
Bu: array[1..20] of integer;
implementation
{$R *.dfm}
procedure priority();
var i,j,max: integer;
B: array[1..10] of integer;
P: array[1..10] of integer;
A: array[1..10] of real;
Wt: array[1..10] of real;
Twt, Awt, w: real;
begin
w:=0;
Twt:=0;
max:=1;
for i:= 1 to n do
begin
B[i] := Bu[i];
B[i]:= strtoint(InputBox('Burst time','Enter CPU burst for process '+ inttostr(i),''));
P[i]:= strtoint(InputBox('Priority','Enter process priority ' +inttostr(i), ''));
if max < P[i] then max := P[i];
end;
j:=1;
while (j<=max) do
begin
i:=1;
while i<=n do
begin
if P[i] = j then
begin
Wt[i]:=w;
w:= w+B[i];
end;
end;
end;
for i:= 1 to n do
begin
Twt:=Twt+Wt[i];
Awt:=Twt/n;
end;
ShowMessage(floattostr(Awt));
end;
procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
begin
n:= strtoint(InputBox('number of processes','Enter number of processes',''));
for k:= 1 to n do
begin
Bu[k]:= strtoint(InputBox('Burst time','Enter CPU burst' + inttostr(k),''));
end;
priority();
end;
end. |
|
#2
|
|||
|
|||
|
Код:
j:=1; while (j<=max) do Из этого цикла не выходит. не нашел когда б он смог выйти ибо. переменные внутри цикла НЕ изменяются! |
|
#3
|
|||
|
|||
|
а как исправить?
|
|
#4
|
|||
|
|||
|
в подробности не вдавался,
но как-то так: Код:
j:=1; i:=1; while (j<=max) do begin j:=j+1; i:=i+1; while i<=n do begin if P[i] = j then begin Wt[i]:=w; w:= w+B[i]; end; end; end; |
|
#5
|
|||
|
|||
|
подправлю чуть...
Код:
while (j<=max) do
begin
j:=j+1;
i:=1;
while i<=n do
begin
i:=i+1; |
|
#6
|
|||
|
|||
|
скорей всего так:
Код:
j:=1; while (j<=max) do begin i:=1; while (i<=n) do begin if P[i] = j then begin Wt[i]:=w; w:= w+B[i]; end; i:=i+1; end; j:=j+1; end; теперь работает, но так получается ответ 7,75, а должен быть 4,50 входные данные: Процесс | Время появления | CPU Burst | Приоритет | 1 | 1 | 6 | 4 | 2 | 3 | 2 | 3 | 3 | 7 | 7 | 2 | 4 | 1 | 5 | 1 | Массивы Время появления (Bu), CPU Burst (B), приоритет (P) заполняются правильно (вывел в Memo для проверки). а вот результирующий массив Wt (время ожидания) неправильный. хотя алгоритм вроде правильный. Wt должен быть [14,3,1,0], а получается [14,12,5,0] подскажите что не так Исправленный проект прикрепляю Последний раз редактировалось Fazotron, 18.04.2011 в 22:30. |