Nadesłany przez Tomasz Lubiński, 09 maja 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Algorytm Haberman'a - Delphi/Algorytm_Haberman.dpr:
//www.algorytm.org
//Algorytm Haberman'a - detekcja zakleszczenia
//(c)2002 Tomasz Lubinski
program Algorytm_Haberman;
uses
Forms,
SysUtils,
math;
{$R *.RES}
{$Apptype console}
var
p,z,i,j: Integer;
A, H : Array [1..100] of Array [1..100] of Integer;
D, f : Array [1..100] of Integer;
flaga, zwolnic: Boolean;
begin
writeln('Podaj liczbe procesow (max. 100)');
readln(p);
writeln('Podaj liczbe zasobow (max. 100)');
readln(z);
//pobranie danych
for i:=1 to p do
for j:=1 to z do
begin
writeln('Podaj ile zasobu '+IntToStr(j)+' posiada proces '+IntToStr(i));
readln(A[i,j]);
end;
for i:=1 to p do
for j:=1 to z do
begin
writeln('Podaj ile zasobu '+IntToStr(j)+' moze jeszcze zazadac proces '+IntToStr(i));
readln(H[i,j]);
end;
for i:=1 to z do
begin
writeln('Podaj ile zasobu '+IntToStr(i)+' jest jeszcze wolne w systemie');
readln(f[i]);
end;
writeln; writeln;
//algorytm Habermana
flaga:=true;
//zainicjuj D:={1,2,...,p}
for i:=1 to p do D[i]:=i;
while flaga do
begin
flaga:=false;
for i:=1 to p do
if D[i]<>0 then
begin
zwolnic:=true;
for j:=1 to z do //sprawdz czy można zwolnic zasoby procesu i
if f[j]<H[i,j] then
begin
zwolnic:=false;
break;
end;
if zwolnic then //jeżeli można to zwolnij zasoby proesu i
begin
D[i]:=0;
flaga:=true;
for j:=1 to z do
begin
f[j]:=A[i,j]+f[j];
H[i,j]:=0;
A[i,j]:=0;
end;
writeln('Zwalniam zasoby procesu '+IntToStr(i));
break;
end
end;
end;
//sprawdz czy D jest zbiorem pustym: jesli tak to brak zakleszczenia
flaga:=true;
write('Zbior zadan zakleszczonych: {');
for i:=1 to p do
if D[i]<>0 then
begin
flaga:=false;
write(' '+IntToStr(i));
end;
write(' }');
writeln;
if flaga then writeln('Zbior zadan zakleszczonych jest pusty zatem w tym systemie nie ma zakleszczenia');
readln;
end.

