📄 bank.cpp
字号:
#include <iostream>
#include <iomanip>
//#define FALSE 0
//#define TRUE 1
using namespace std;
void create()
{
int m; //进程数
int n; //资源数
int i=0;
int j=0;
std::cout<<"输入进程数:";
std::cin>>m;
std::cout<<"输入资源数:";
std::cin>>n;
std::cout<<endl;
int *work, *finish;
int temp1=0,temp2=0;
int **claim; //进程对资源的最大需求数
int **need; //各进程还需资源数
int **allocation; //进程已经分配到的资源数
int *available, *available1; //系统可用资源数
int *request; //请求资源数
int *process;
std::cout<<"输入已经分配的资源:"<<std::endl; //输入已经分配的资源
//arr(m,n,allocation);
allocation=new int *[m];
for( i=0; i<m; i++)
{
allocation[i]=new int[n];
std::cout<<"进程"<<i;
for(j=0; j<n; j++)
{
std::cout<<" 资源"<<j<<":";
std::cin>>allocation[i][j];
std::cout<<"\t";
}
std::cout<<std::endl;
}
char flag1='y'; //选择输入最大需求资源数还是输入还需要的资源数
while(flag1=='y'||flag1=='Y')
{
int k;
std::cout<<"选0输入最大需求资源数!"<<std::endl
<<"选1输入还需要的资源数!";
std::cout<<std::endl;
std::cin>>k;
if(k==0)
{
std::cout<<std::endl;
std::cout<<"输入最大需求资源数:"<<std::endl;
claim=new int *[m];
for( i=0; i<m; i++)
{
claim[i]=new int[n];
std::cout<<"进程"<<i;
for(j=0; j<n; j++)
{
std::cout<<" 资源"<<j<<":";
std::cin>>claim[i][j];
std::cout<<"\t";
}
std::cout<<std::endl;
}
need=new int *[m];
for( i=0; i<m; i++)
{
need[i]=new int[n];
for(j=0; j<n; j++)
{
need[i][j]=0;
}
}
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
{
need[i][j]=claim[i][j]-allocation[i][j];
}
}
flag1='n';
break;
}
else
if(k==1)
{
std::cout<<"输入还需要的资源数:"<<std::endl;
//arr(m,n,need);
need=new int *[m];
for( i=0; i<m; i++)
{
need[i]=new int[n];
std::cout<<"进程"<<i;
for(j=0; j<n; j++)
{
std::cout<<" 资源"<<j<<":";
std::cin>>need[i][j];
std::cout<<"\t";
}
std::cout<<std::endl;
}
flag1='n';
break;
}
else
std::cout<<"输入有误,请重新输入!"<<std::endl;
}
std::cout<<"输入可用的资源数:"<<std::endl; //输入可用的资源数
//arr(n, available);
available=new int[n];
for(j=0; j<n; j++)
{
std::cout<<"资源"<<j<<":";
std::cin>>available[j];
std::cout<<"\t";
}
std::cout<<std::endl;
available1=new int[n];
for(j=0; j<n; j++)
{
available1[j]=available[j];
}
request=new int[n]; //请求资源数
for(j=0; j<n; j++)
{
request[j]=0;
}
finish=new int[m];
for(i=0; i<m; i++)
{
finish[i]=0;
}
work=new int[n];
for(j=0; j<n; j++)
{
work[j]=0;
}
process=new int[m];
for(i=0; i<m; i++)
{
process[i]=0;
}
std::cout<<"已分配资源:"<<std::endl; //输出已分配的资源
for(i=0; i<m; i++)
{
std::cout<<"进程"<<i;
for(j=0; j<n; j++)
{
std::cout<<" 资源"<<j<<":";
std::cout<<allocation[i][j];
std::cout<<"\t";
}
std::cout<<std::endl;
}
std::cout<<"还需资源:"<<std::endl; //输出还需要的资源
for(i=0; i<m; i++)
{
std::cout<<"进程"<<i;
for(j=0; j<n; j++)
{
std::cout<<" 资源"<<j<<":";
std::cout<<need[i][j];
std::cout<<"\t";
}
std::cout<<std::endl;
}
std::cout<<"可用资源:"<<std::endl; //输出可用资源
for(j=0; j<n; j++)
{
std::cout<<"资源"<<j<<":";
std::cout<<available[j];
std::cout<<"\t";
}
std::cout<<std::endl;
/*for(j=0; j<n; j++)
{
available[j]=available[j]-request[j];
allocation[i][j]=allocation[i][j]+request[j];
need[i][j]=need[i][j]-request[j];
}*/
for(j=0; j<n; j++)
{
work[j]=available[j];
}
bool flag4=false;
int q=0;
while(flag4==false&&q<m)
{
for(i=0; i<m; i++)
{
if(finish[i]==0)
{
for(j=0; j<n; j++)
{
if(need[i][j]>work[j])
break;
}
if(j==n)
{
for(int k=0; k<n; k++)
work[k]+=allocation[i][k];
process[temp1]=i;
temp1++;
finish[i]=1;
flag4=true;
}
}
else
continue;
}
q++;
for(i=0; i<m; i++)
if(finish[i]==0)
flag4=false;
}
int k=0;
for( ; k<m; k++)
{
if(finish[k]==0)
{
std::cout<<"系统不安全!"<<std::endl;
break;
}
}
bool flag5=false;
if(k==m)
{
std::cout<<"系统安全!"<<std::endl;
flag5=true;
std::cout<<"安全序列为:"<<std::endl;
for(i=0; i<m; i++)
std::cout<<"进程"<<process[i]<<"→ ";
}
std::cout<<std::endl;
std::cout<<std::endl;
char flag2='y';
while(flag5=true &&(flag2=='Y'||flag2=='y'))
{
i=-1;
while(i<0||i>=m)
{
std::cout<<"请输入要申请资源的进程号(从0到"<<m-1<<")";
std::cin>>i;
if(i<0||i>=m)
std::cout<<"输入的进程号不存在,请重新输入!"<<std::endl;
}
std::cout<<"输入进程"<<i<<" 申请资源数"<<std::endl;
for(j=0; j<n; j++)
{
std::cout<<"资源"<<j<<":";
std::cin>>request[j];
if(request[j]>need[i][j])
{
std::cout<<"进程"<<i<<"申请的资源大于进程"<<i<<"还需要的"<<j<<"类资源数!";
std::cout<<"请重新选择!"<<std::endl;
flag2='n';
break;
}
else
if(request[j]>available[j])
{
std::cout<<"进程"<<i<<"申请的资源大于系统可用的"<<j<<"类资源数!";
std::cout<<"请重新选择!"<<std::endl;
flag2='n';
break;
}
}
if(flag2=='y'||flag2=='Y')
{
for(j=0; j<n; j++)
{
available1[j]=available1[j]-request[j];
allocation[i][j]=allocation[i][j]+request[j];
need[i][j]=need[i][j]-request[j];
}
for(j=0; j<n; j++)
{
work[j]=available1[j];
}
bool flag3=false;
int p=0;
while(flag3==false&&p<m)
{
for(i=0; i<m; i++)
{
if(finish[i]==0)
{
for(j=0; j<n; j++)
{
if(need[i][j]>work[j])
break;
}
if(j==n)
{
for(int k=0; k<n; k++)
work[k]+=allocation[i][k];
process[temp2]=i;
temp2++;
finish[i]=1;
flag3=true;
}
}
else
continue;
}
p++;
for(i=0; i<m; i++)
if(finish[i]==0)
flag3=false;
}
int k=0;
for( ; k<m; k++)
{
if(finish[k]==0)
{
std::cout<<"系统不安全!"<<std::endl;
break;
}
}
if(k==m)
{
std::cout<<"系统安全!"<<std::endl;
std::cout<<"安全序列为:"<<std::endl;
for(i=0; i<m; i++)
std::cout<<"进程"<<process[i]<<"→ ";
}
flag2='n';
}
std::cout<<std::endl;
std::cout<<"是否继续银行家算法演示,按‘Y’或‘y’继续,按‘N’或‘n’退出演示:";
std::cin>>flag2;
}
}
int main()
{
create();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -