银行家算法

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 using namespace std;
  5 int work,progress,available[100],mmax[100][100],allocation[100][100],need[100][100];
  6 int p[100];
  7 void init()
  8 {
  9    int i,j;
 10    printf("请输入多少系统资源数\n");
 11    scanf("%d",&work);
 12    printf("请输入总共有多少进程\n");
 13    scanf("%d",&progress);
 14    for(i=1;i<=work;i++)
 15    {
 16        printf("第%d类资源有的资源实例:",i);
 17        scanf("%d",&available[i]);
 18    }
 19    for(i=1;i<=progress;i++)
 20      for(j=1;j<=work;j++)
 21      {
 22         printf("进程p[%d]当前分配第%d类资源数: ",i,j);
 23         scanf("%d",&allocation[i][j]);
 24      }
 25      int sum;
 26      for(j=1;j<=work;j++)
 27      {
 28             sum=0;
 29          for(i=1;i<=progress;i++)
 30          {
 31              sum+=allocation[i][j];
 32 
 33          }
 34           available[j]-=sum;
 35      }
 36     for(i=1;i<=progress;i++)
 37      for(j=1;j<=work;j++)
 38      {
 39          printf("进程p[%d]对第%d类资源的最大需求量: ",i,j);
 40          scanf("%d",&mmax[i][j]);
 41      }
 42    for(i=1;i<=progress;i++)
 43      for(j=1;j<=work;j++)
 44      {
 45          need[i][j]=mmax[i][j]-allocation[i][j];
 46      }
 47      printf("当前的状态:\n");
 48      printf("           Max        Allocation      Need\n");
 49      printf("进程");
 50      for(i=1;i<=3;i++)
 51      {
 52          for(j=1;j<=work;j++)
 53              printf("  %d类",j);
 54      }
 55      for(i=1;i<=progress;i++)
 56      {
 57       printf("\nP[%d]",i);
 58         for(j=1; j<=work; j++)
 59         {
 60             printf("   %d ",mmax[i][j]);
 61         }
 62         for(j=1; j<=work; j++)
 63         {
 64             printf("   %d ",allocation[i][j]);
 65         }
 66         for(j=1; j<=work; j++)
 67         {
 68             printf("   %d ",need[i][j]);
 69         }
 70      }
 71       printf("\n\n系统剩余资源量:   ");
 72       for(i=1; i<=work; i++)
 73       {
 74         printf("   %d ",available[i]);
 75       }
 76      printf("\n");
 77 }
 78 bool safe()
 79 {
 80   int w[100],finish[100],i,j,k,l=0;
 81    memset(finish,0,sizeof(finish));
 82    for(i=1;i<=work;i++)
 83       w[i]=available[i];
 84       printf("\n");
 85     for(i=1;i<=progress;i++)
 86     {
 87         if(finish[i]==1)
 88              continue;
 89         for(j=1;j<=work;j++)
 90           {
 91             if(need[i][j]>w[j])
 92                 break;
 93           }
 94          if(j==work+1)
 95            {
 96                 finish[i]=1;
 97                 for(k=1;k<=work;k++)
 98                    w[k]+=allocation[i][k];
 99                  p[l++]=i;
100                  i=0;
101            }
102          else
103            continue;
104      if(l==progress)
105        {
106         printf("系统是安全的\n");
107         printf("安全序列:\n");
108         for(i=0;i<l;i++)
109         {
110            printf("%d",p[i]);
111            if(i!=l-1) //最后一项不输-->
112              {
113               printf("-->");
114              }
115          }
116        printf("""\n");
117      return true;
118       }
119    }
120   printf("系统是不安全的\n");
121     return false;
122 }
123 void  Request()
124 {
125     int m,i,request[100],flag=0,j;
126     printf("请输入申请资源的进程:");
127        scanf("%d",&m);
128      for(i=1;i<=work;i++)
129        {
130           printf("请输入进程p[%d]对%d类资源的申请量:",m,i);
131           scanf("%d",&request[i]);
132           }
133       for(j=1;j<=work;j++)
134       {
135           if(request[j]>need[m][j])
136           {
137              flag=1;
138           }
139       }
140       if(flag)
141           printf("请求的资源数超过了需求的最大值\n");
142       else
143       {
144         for(j=1;j<=work;j++)
145           if(request[j]>available[j])
146               flag=1;
147           if(flag)
148               printf("尚无足够资源,P[%d]须等待\n",m);
149           else
150           {
151             for(j=1;j<=work;j++)
152             {
153                 available[j]=available[j]-request[j];
154                 allocation[m][j]=allocation[m][j]+request[j];
155                 need[m][j]=need[m][j]-request[j];
156             }
157              printf("\n");
158              if(safe())
159                 {
160                     printf("可以分配给进程p[%d]\n",m);
161                 }
162               else
163               {
164                   printf("aaa\n");
165                   printf("让进程p[%d]等待",m);
166                   for(j=1;j<=work;j++)
167                   {
168                   available[j]=available[j]+request[j];
169                   allocation[m][j]=allocation[m][j]-request[j];
170                   need[m][j]=need[m][j]+request[j];
171                   }
172               }
173           }
174       }
175 
176 }
177 int main()
178 {
179     int cas;
180      printf("★★★★★★★★欢迎使用本程序★★★★★★★★\n");
181      printf("\n\n");
182       init();
183       for(;;)
184       {
185         Request();
186         printf("输入0程序运行结束,输入其他继续执行");
187         scanf("%d",&cas);
188         if(cas==0)
189             break;
190       }
191        return 0;
192 }

 

posted @ 2014-11-15 16:07  疯狂的癫子  阅读(219)  评论(0编辑  收藏  举报