📄 银行家.cpp
字号:
#include<iostream.h>
#define W 10
#define R 20
int m,n; //m个进程,n个资源
int Available[R]; //系统可用资源数
int Max[W][R]; //M个进程对N类资源最大资源需求量
int Allocation[W][R]; //M个进程已经得到N类资源的资源量
int Need[W][R]; //M个进程还需要N类资源的资源量
int Request[W][R];//每一个进程请求的各种资源
int Finish[W];
int p[W]; //存放安全序列
void Input(); //用户输入题目要求的资源数目
int IsSafe(); //安全性检查
int IsOut(); //判断是否满足进程的请求
/////////////////////////////////////////////////////////////////////////////////////////////////////
int main() //银行家算法
{
Input();
IsSafe();
IsOut();
return 0;
}
/////////////////////////////////////////////////////////////////////////////////
void Input() //用户输入题目要求的资源数目
{
int i,j;
cout<<"输入进程的数目:\n";
cin>>m;
cout<<"输入资源的种类:\n";
cin>>n;
cout<<"输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
cout<<"输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入\n";
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if(Need[i][j]<0)
{
cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:\n";
j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:\n";
for(i=0;i<n;i++)
cin>>Available[i];
}
int IsSafe() //安全性检查
{
int i,j,l=0;
int Work[R]; //可利用资源数组
for(i=0;i<n;i++)
Work[i]=Available[i];
for(i=0;i<m;i++)
Finish[i]=0;
for(i=0;i<m;i++)
{
if(Finish[i]==1)
continue;
else
{
for(j=0;j<n;j++)
{
if(Need[i][j]>Work[j])
break;
}
if(j==n) //资源符合所有进程的要求
{
Finish[i]=1;
for(int k=0;k<n;k++)
Work[k]+=Allocation[i][k]; //把进程i的资源释放
p[l++]=i; //安全序列
i=-1; //从0开始再一次遍历查找
}
else continue; //跳过当前的不符合的,查找下一个
}
}
if(l==m)//m是从1开始的,l是从0开始的
{
cout<<"系统是安全的"<<'\n';
cout<<"安全序列是:\n";
for(i=0;i<l;i++)
{
cout<<p[i];
if(i!=l-1)
cout<<"-->";
}
cout<<'\n';
return 1;
}
else
return 0;
}
int IsOut() //判断是否满足进程的请求
{
int i,j,mi;
while(1)
{
cout<<"输入要申请资源的进程号(注:第1个进程号为0,依次类推)\n";
cin>>mi;
cout<<"输入进程所请求的各资源的数量\n";
for(i=0;i<n;i++)
cin>>Request[mi][i];//进程mi需要的各类资源
for(i=0;i<n;i++)
{
if(Request[mi][i]>Need[mi][i])
{
cout<<"你输入的请求数超过进程的需求量!\n";
return 0;
}
if(Request[mi][i]>Available[i])
{
cout<<"你输入的请求数超过系统有的资源数!\n";
return 0;
}
}
for(i=0;i<n;i++)
{
Available[i]-=Request[mi][i];
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i];
}
if(IsSafe()) cout<<"同意分配请求!\n";
else
{
cout<<"你的请求被拒绝!\n";
for(i=0;i<n;i++) //不能分配,把资源回收回来
{
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i];
Need[mi][i]+=Request[mi][i];
}
}
for(i=0;i<m;i++)
Finish[i]=0;
char YesOrNo;
cout<<"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\n";
while(1)
{
cin>>YesOrNo;
if(YesOrNo=='y'||YesOrNo=='Y'||YesOrNo=='n'||YesOrNo=='N') //判断大小写
break;
else
{
cout<<"请按要求输入!\n";
continue;
}
}
if(YesOrNo=='y'||YesOrNo=='Y') continue;
else break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -