📄 yhj.cpp
字号:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
int Available[50],Allocation[100][100],Max[100][100];
//可分配资源量,已分配资源量,最大资源需求量
int Need[100][100],Request[40],Work[50],Finish[100],p[100];
//资源需求量,资源请求量,工作向量,完成状态,进程编号
int i,j,n,m,l=0;
//进程序号,资源序号,进程序号,资源序号,
void safe();
//安全算法
void safe()
{
for (i=0; i<n;i++)
{
if (Finish[i]!=1)
{
for (j=0; j<m; j++)
{
if(Work[j]<Need[i][j])
{
break;
}
}
if(j==m)
{
Finish[i]=1; //资源分配成功
for (j=0; j<m;j++)
{
Work[j]=Work[j]+Allocation[i][j];
}
p[l++]=i; //保存安全序列
i= -1; //当遇到满足条件的进程时,
//又从第0个进程开始查找是否还是未完成的进程
}
}
}
}
int main()
{
cout<<" --------------------------------------------------"<<endl;
cout<<" || ||"<<endl;
cout<<" || 欢迎试用模拟银行家算法 ||"<<endl;
cout<<" || ||"<<endl;
cout<<" || 作者:黄翠清 ||"<<endl;
cout<<" || 班级:计Y052 ||"<<endl;
cout<<" || 学号:200502001041 ||"<<endl;
cout<<" || ||"<<endl;
cout<<" --------------------------------------------------"<<endl;
cout<<"友情提示: 数据间请用空格隔开,输入完成请按回车^_^"<<endl<<endl;
int k=0,s=0;
//申请资源的进程编号
char b;
//是否继续申请资源
cout<<"输入进程的数量: ";//从此开始输入有关数据
cin>>n;
cout<<"输入资源种类数: ";
cin>>m;
cout<<"输入各种资源可利用的数量Available["<<m<<"]: "<<endl; //可分配的资源数
for (j=0; j<m; j++)
{
cin>>Available[j];
Work[j]=Available[j]; //初始化Work[j]
}
cout<<"\n请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]: "<<endl;//已分配资源数
cout<<"\n请严格按照("<<n<<"行×"<<m<<"列)的距阵输入:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
cin>>Allocation[i][j];
Finish[i]=0;//初始化Finish[i]为假
}
cout<<"\n输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]: "<<endl;//各资源最大需求数
cout<<"\n请严格按照("<<n<<"行×"<<m<<"列)的距阵输入:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cin>>Max[i][j];
Need[i][j] = Max[i][j]-Allocation[i][j];
}
}
for (i=0; i<n; i++) //判断各资源最大需求数输入是否正确
{
for (j=0; j<m; j++)
{
while(Max[i][j]<Allocation[i][j])
{
cout<<"出错,请输入Max["<<i<<"]["<<j<<"]:";
cin>>Max[i][j];
Need[i][j] = Max[i][j]-Allocation[i][j];
}
}
}
//输出当前资源分配情况
//判断当前状态的安全性
safe();
if(l==n)
{
cout<<"系统是安全的"<<endl;
cout<<"安全序列:"<<endl;
for(i=0;i<l;i++)
{
cout<<"P["<<p[i]<<"]";
if(i!=l-1)
{
cout<<"-->";
}
}
cout<<""<<endl;
}
else
{
cout<<"系统不安全"<<endl;
return 0;
}
//输入请求
do
{
cout<<"\n请输入申请资源的进程编号(0-"<<n-1<<"):P";
cin>>k;
while(k>n-1)
{
cout<<"出错,请重新输入申请资源的进程编号(0-"<<n-1<<"):P";
cin>>k;
}
cout<<"\n请输入申请各类资源的数量: "<<endl;
for (j=0; j<m; j++)
{
cin>>Request[j];
}
//判断输入的情况
for (j=0; j<m; j++)
{
if(Request[j] > Need[k][j])
{
cout<<"Request["<<j<<"] > Need["<<k<<"]["<<j<<"],出错.";
s=1;
break;
}
}
for (j=0; j<m; j++)
{
while(Request[j] > Available[j])
{
cout<<"P["<<k<<"]的Request["<<j<<"]尚无足够资源,让P["<<k<<"]等待.";
s=1;
break;
}
}
//资源预分配
if(s==0)
{
for (j=0; j<m; j++)
{
Available[j] = Available[j]-Request[j];
Allocation[k][j] = Allocation[k][j]+Request[j];
Need[k][j] = Need[k][j]-Request[j];
Work[j] = Available[j];
}
//判断当前状态的安全性
safe();
if(l==n)
{
cout<<"系统是安全的"<<endl;
cout<<"安全序列:"<<endl;
for(i=0;i<l;i++)
{
cout<<"P["<<p[i]<<"]";
if(i!=l-1)
{
cout<<"-->";
}
}
cout<<""<<endl;
}
else
{
cout<<"系统不安全"<<endl;
//恢复数据
for (j=0; j<m; j++)
{
Available[j] = Available[j]+Request[j];
Allocation[k][j] = Allocation[k][j]-Request[j];
Need[k][j] = Need[k][j]+Request[j];
Work[j] = Available[j];
}
for (i=0; i<n; i++)
Finish[i]=0;
}
l=0;
//显示输入各数组的值
cout<<"\n当前状态:"<<endl;
cout<<"Available[m]:"<<endl;
for (j=0; j<m; j++)
{
cout<<Available[j]<<" ";
}
cout<<endl;
cout<<"\nAllocation[n][m]:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<Allocation[i][j]<<" ";
}
cout<<endl;
}
cout<<"\nMax[n][m]:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<Max[i][j]<<" ";
}
cout<<endl;
}
}
cout<<"\n要继续申请资源,请按'y'或'Y',否则按'n'或'N'"<<endl;
cin>>b;
s=0;
}while(b=='y'||b=='Y');
cout<<" ----------------------------------------------------"<<endl;
cout<<" || ||"<<endl;
cout<<" || ||"<<endl;
cout<<" || 欢迎再次使用!!! ||"<<endl;
cout<<" || Welcome Back!!! ||"<<endl;
cout<<" || ||"<<endl;
cout<<" ----------------------------------------------------"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -