Ocena użytkownikóww: ***** / 3
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 Holt'a - C++.cpp:
//www.algorytm.org
//Algorytm Holt'a - detekcja zakleszczenia
//(c)2002 Tomasz Lubinski
#include <stdio.h>
#include <conio.h>
int p,z,j,k,tmp,flaga;
int E[2][10][10],A[10][10],f[10],I[10],c[11];
void main()
{
printf("Podaj liczbe procesow (max. 10)\n");
scanf("%d",&p);
printf("Podaj liczbe zasobow (max. 10)\n");
scanf("%d",&z);
//pobranie danych
for (k=0; k<p; k++)
for (j=0; j<z; j++)
{
printf("Podaj ile zasobu %d posiada proces %d\n",j+1,k+1);
scanf("%d",&A[k][j]);
}
for (k=0; k<p; k++)
for (j=0; j<z; j++)
{
printf("Podaj ile zasobu %d moze jeszcze zazadac proces %d\n",j+1,k+1);
scanf("%d",&E[0][k][j]);
E[1][k][j]=k;
}
for (j=0; j<z; j++)
{
printf("Podaj ile zasobu %d jest jeszcze wolne w systemie\n",j+1);
scanf("%d",&f[j]);
}
//algorytm Holt'a
//posortowanie zadan procesow (bubble sort)
for (j=0; j<z; j++)
{
flaga=1;
while (flaga==1)
{
flaga=0;
for (k=0; k<p-1; k++)
if (E[0][k][j]>E[0][k+1][j])
{
flaga=1;
tmp=E[0][k][j];
E[0][k][j]=E[0][k+1][j];
E[0][k+1][j]=tmp;
tmp=E[1][k][j];
E[1][k][j]=E[1][k+1][j];
E[1][k+1][j]=tmp;
}
}
}
for (k=0; k<z; k++) I[k]=0;
for (k=1; k<=p; k++) c[k]=z;
c[0]=p;
//wlasciwa częsc algorytmu
do
{
flaga=0;
for (j=0; j<z; j++)
while ((I[j]<p)&&(E[0][I[j]][j]<=f[j]))
{
c[E[1][I[j]][j]+1]=c[E[1][I[j]][j]+1]-1;
if (c[E[1][I[j]][j]+1]==0)
{
c[0]--;
flaga=1;
for (k=0; k<z; k++)
f[k]=f[k]+A[E[1][I[j]][j]][k];
}
I[j]++;
}
}while ((flaga==1)&&(c[0]>0));
if (flaga==1) printf("Nie ma zakleszczenia\n"); else printf("Istnieje zakleszczenie\n");
printf("Zbior zadan zakleszczonych: {");
for (k=1; k<=p; k++) if (c[k]!=0) printf(" %d",k);
printf(" }\n");
getch();
}