📄 cn700_vc3484645.txt
字号:
#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,flag=0;//定义全局变量
void safe()
{
for (i=0; i<n;i++)
{
if (Finish[i]==0)
{
flag=0;
for (j=0; j<m; j++)
{
if (Work[j]>=Need[i][j])
flag=flag+1;
}
if(flag==m)
{
p[l]=i;
Finish[i]=1;
for (j=0; j<m;j++)
{
Work[j]=Work[j]+Allocation[i][j];
}
l=l+1;
i= -1;
}
}
i++;
}
}
int main()
{
cout<<" --------------------------------------------------"<<endl;
cout<<" || ||"<<endl;
cout<<" || 模拟银行家算法 ||"<<endl;
cout<<" || ||"<<endl;
cout<<" || 作者:严晓明 ||"<<endl;
cout<<" || 02102116 ||"<<endl;
cout<<" --------------------------------------------------"<<endl;
int k=0,r=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]
}
//system("cls");
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];
}
/*if(Available[j]<Allocation[i][j])
{
cout<<"您输入的已分配的资源量大于资源总量!!请重新输入!!"<<endl;
}*/
Finish[i]=0;//初始化Finish[i]
//break;
}
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];
}
}
//判断当前状态的安全性
safe();
if (l<n)
{
cout<<"\n当前状态不安全!!!!!"<<endl;
return 0;
}
else
{ int i;
l=0;
cout<<"\n安全的状态!!!"<<endl;
cout<<"安全序列为: ";
// if(i==0)
// {
//cout<<"进程(0)"<<endl;
//Finish[i]=0;
// }
for (i=0; i<n; i++)
{
cout<<"进程"<<"("<<p[i]<<")"<<"==>>";
Finish[i]=0;
}
cout<<endl;
}
//system("cls");
do
{
//输入请求
cout<<"\n请输入申请资源的进程编号: "<<endl;
cin>>k;
if(k>n-1)
{
cout<<"您输入了错误的进程号,请检查!!"<<endl;
break;
}
cout<<"\n请输入申请各类资源的数量: "<<endl;
for (j=0; j<m; j++)
{
cout<<"进程"<<k<<"["<<j<<"]:";
cin>>Request[j];
}
//判断输入的情况
for (j=0; j<m; j++)
{
if (Request[j] > Need[k][j])
{
system("cls");
cout<<"出错!申请大于需要量~~"<<endl;
return 0;
}
}
for (j=0; j<m; j++)
{
if (Request[j]>Available[j])
{
//system("cls");
cout<<"根本没那么多资源,请仔细检查!!!"<<endl;
return 0;
}
}
//改变Avilable、Allocation、Need的值
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)
{
l=0;
cout<<"\n当前状态不安全!!!!!!";
//恢复数据
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;
}
else
{ system("cls");
l=0;
cout<<"\n申请资源成功!!!"<<endl;
cout<<"\n安全的状态!!!"<<endl;
cout<<"安全序列为: ";
for (i=0; i<n; i++)
{
cout<<"进程"<<"("<<p[i]<<")"<<"==>>";
Finish[i]=0;
}
cout<<endl;
}
//显示输入各数组的值
cout<<"\n当前状态:"<<endl;
cout<<"资源量[m]:"<<endl;
for (j=0; j<m; j++)
{
cout<<Available[j]<<" ";
}
cout<<endl;
cout<<"\n已分配资源[n][m]:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<Allocation[i][j]<<" ";
}
cout<<endl;
}
cout<<"\n最大需求[n][m]:"<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<Max[i][j]<<" ";
}
cout<<endl;
}
//system("cls");
cout<<"\n要继续申请资源,请按'y'或'Y',否则按'n'或'N'"<<endl;
cin>>b;
if(b=='y'||b=='Y')
{
r=1;
//输入请求
cout<<"\n请输入申请资源的进程编号(0,1…,n-1):"<<endl;
cin>>k;
if(k>n-1)
{
cout<<"您输入了错误的进程号,请检查!!"<<endl;
break;
}
cout<<"\n请输入申请各类资源的数量:"<<endl;
for (j=0; j<m; j++)
{
cout<<"进程"<<k<<"["<<j<<"]:";
cin>>Request[j];
}
}
else
r=0;
system("cls");
cout<<" ----------------------------------------------------"<<endl;
cout<<" || ||"<<endl;
cout<<" || ||"<<endl;
cout<<" || 欢迎再次使用!!! ||"<<endl;
cout<<" || Welcome Back!!! ||"<<endl;
cout<<" || ||"<<endl;
cout<<" ----------------------------------------------------"<<endl;
}while (r==1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -