📄 bank.cpp
字号:
#include "dos.h"
#include "conio.h"
#include "stdio.h"
int available[3]={3,3,2};
int max[6][3];
int allocation[6][3];
int need[6][3];
int live[5]={1,1,1,1,1};
int stay[3][3];
int request[3],process[5];
int i,j,p=5,pro,x,k1;
char flag='y';
int b[10]={0,0,0,0,0,0};
int r,a,v[10];
int l[10]={0,1,2,3,4,5,6,7,8,9};
void zhibiao()
{ x=1;
printf("***************************资源分配图***********************\n");
printf("\n");
printf("PRO ");
printf("Max:");
for(i=0;i<r;i++)
{printf("%c ",i+65);}printf(" ");
printf("All:"); //显示每个进程已占用的资源数
for(i=0;i<r;i++)
{printf("%c ",i+65);}printf(" ");
printf("Nee:"); //显示每个进程还需要的资源数
for(i=0;i<r;i++)
{printf("%c ",i+65);}printf(" ");
printf("Ava:"); //显示剩余资源数
for(i=0;i<r;i++)
{printf("%c ",i+65);}printf(" ");
printf("\n");
for(i=0;i<a;i++)
{ if(live[i]==1)
{ printf("P%d ",i);
for(j=0;j<r;j++)
{printf("%-3d",max[i][j]);}printf(" ");
for(j=0;j<r;j++)
{printf("%-3d",allocation[i][j]);}printf(" ");
for(j=0;j<r;j++)
{printf("%-3d",need[i][j]);}printf(" ");
}
if(x==1&&live[i]==1) {
for(j=0;j<r;j++)
{printf("%-3d",available[j]);}
x=0;
}
if(live[i]==1) printf("\n");
}
}
int apply()
{ int v=1;
for(i=0;i<=2;i++)
{if(need[pro][i]<request[i]) {v=0;break;}
if(available[i]<request[i]) {v=0;break;}}
if(v==1){for(i=0;i<=2;i++)
{stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
stay[1][i]=need[pro][i];need[pro][i]-=request[i];
stay[2][i]=available[i];available[i]-=request[i];}
}
return(v);
}
int test()
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
for(i=0;i<p;i++)
if(live[i]==0) {finish[i]=1;k1--;}
for(i=0;i<=2;i++) work[i]=available[i];
while(1)
{ for(i=0;i<=4;i++)
{ if(finish[i]==0) { v=1;
for(j=0;j<=2;j++)
if(need[i][j]>work[j]) {v=0;break;}
if(v==1) { finish[i]=1;
for(j=0;j<=2;j++) work[j]+=allocation[i][j];
process[k]=i;k++;
}
}
}
if(t==k) break;
else t=k;
if(k==k1) break;
}
if(k==k1) return(1);
else return(0);
}
void main()
{
printf("请输入进程的个数:");
scanf("%d",&a);
printf("请输入资源的个数:");
scanf("%d",&r);
printf("请输入系统的%d类资源每类的总数:",r);
for(i=0;i<r;i++)
{scanf("%d",&v[i]);
}
printf("请输入max[%d][%d]:\n",a,r);
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&max[i][j]);}
}
printf("请输入allocation[%d][%d]:\n",a,r); //输入每个进程已占用的资源数
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&allocation[i][j]);}
}
printf("请输入need[%d][%d]:\n",a,r); //输入每个进程还需的资源数
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&need[i][j]);}
}
for(i=0;i<r;i++)
{for(j=0;j<a;j++)
b[i]+=allocation[j][i];
}
for(i=0;i<r;i++)
{available[i]=v[i]-b[i];
}
while(flag=='y'||flag=='Y')
{zhibiao();
k1=5;
printf("系统的%d个进程是:",a);
for(i=0;i<a;i++)
{
printf("%d",l[i]);
printf(" ");}
printf("请输入要申请资源的进程:P");
scanf("%d",&pro);
if(pro<0||pro>=a) break;
printf("P%d 进程对%d种资源的请求量:",pro,r);
for(i=0;i<r;i++)
{
scanf("%d",&request[i]);
}
if(apply()==0) {printf("错误/资源不够,P%d 等待!\n",pro);
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
scanf("%s",&flag);}
else if(test()==0) {printf("系统不安全,P%d 等待!\n",pro);
for(i=0;i<=2;i++)
{ allocation[pro][i]=stay[0][i];
need[pro][i]=stay[1][i];
available[i]=stay[2][i];}
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
scanf("%s",&flag);}
else {zhibiao();printf("系统安全!\n");
printf("存在安全:");
for(i=0;i<k1-1;i++)
printf("P%d>",process[i]);
printf("P%d",process[k1-1]);
printf("\n 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
scanf("%s",&flag);}
if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
for(i=0;i<=2;i++)
{available[i]+=max[pro][i];
live[pro]=0;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -