#include <stdio.h>
#include <iostream>
#include<stack>
#include<queue>
#include<cmath>
#include<stdlib.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<iomanip>
using namespace std;
/*
*/
#define MaxNumber 20
static int n; //进程数
static int m; //资源数
static int Available[MaxNumber]; //系统可用资源数
static int Allocation[MaxNumber][MaxNumber]; //已分配资源矩阵
static int MaxNeed[MaxNumber][MaxNumber]; //最大需求矩阵
static int Need[MaxNumber][MaxNumber]; //还需资源矩阵
static int Request[MaxNumber];
static int SafeOrder[MaxNumber]; //安全序列
static bool Finish[MaxNumber];
void display(){
cout<<"----------------------------------------------------------------------"<<endl;
cout<<"当前进程个数为 n = "<<n<<endl;
cout<<"当前资源个数为 m = "<<m<<endl;
cout<<"系统可用资源数:"<<endl;
for (int i=0;i<m;i++){
cout<<setw(5)<<char('A'+i)<<" ";
}
cout<<endl;
for (int i=0;i<m;i++){
cout<<setw(5)<<Available[i]<<" ";
}
cout<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"各进程还需资源数:"<<endl;
cout<<setw(5)<<" ";
for (int i=0;i<m;i++){
cout<<setw(5)<<char('A'+i)<<" ";
}
cout<<endl;
for (int i=0;i<n;i++){
cout<<setw(5)<<"P"<<i+1;
for (int j = 0;j<m;j++){
cout<<setw(5)<<Need[i][j];
}
cout<<endl;
}
}
void input(){
cout<<"请输入进程数:"<<endl;
cin>>n;
cout<<"请输入资源种类数:"<<endl;
cin>>m;
cout<<"请输入系统每种资源数:"<<endl;
for (int i=0;i<m;i++){
cin>>Available[i];
}
cout<<"请输入已分配资源矩阵:"<<endl;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin>>Allocation[i][j];
}
}
cout<<"请输入最大需求矩阵:"<<endl;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin>>MaxNeed[i][j];
}
}
//(1)请在下方补充代码,用于计算系统当前每种资源可用数(种资源可用数=每种资源总数-已分配资源数)
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
Available[i]=Available[i]-Allocation[j][i];
} }
//求解还需资源矩阵
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
Need[i][j]=MaxNeed[i][j]-Allocation[i][j]; //(2)请补充循环体中的代码,用于计算T0时刻还需资源矩阵
}
}
cout<<"*****************************程序开始*******************************"<<endl;
display();
}
bool isSystemSafe(){
int work[MaxNumber];
for (int i=0;i<m;i++){
work[i] = Available[i];
}
for (int i=0;i<n;i++){
Finish[i] = false;
SafeOrder[i] = -1; //初始化安全序列
}
int FinishNumebr = 0;
int isSafe;
int i =0,j;
while(i<n){
isSafe = 0;
for(j = 0;j<m;j++){
if (Finish[i]==false && Need[i][j]<=work[j]){ //(3)请解释这个循环条件的含义
isSafe++;
}
else
break;
}
if (isSafe==m){ //(4)请补充if语句中的条件
Finish[i] = true;
SafeOrder[FinishNumebr] = i+1;
FinishNumebr++;
for (j = 0;j<m;j++){
work[j] += Allocation[i][j];
}
i=0; //找到满足条件的进程后,从头开始再进行寻找
}
else
i++;
if (FinishNumebr==n){ //(5)请补充if语句中的条件
cout<<"**********************************Safe!******************************"<<endl;
cout<<"对应的安全序列为:"<<endl;
cout<<"P"<<SafeOrder[0];
for (int i=1;i<n;i++){
cout<<"-->"<<"P"<<SafeOrder[i];
}
cout<<endl;
return true;
}
}
cout<<"******************************unSafe!******************************"<<endl;
return false;
}
int main(){
input();
isSystemSafe();
system("pause");
return 0;
}
/*
input:
4 3
9 3 6
1 0 0
6 1 2
2 1 1
0 0 2
3 2 2
6 1 3
3 1 5
4 2 2
*/
【水汐のC++】银行家算法
最新推荐文章于 2020-06-04 16:55:12 发布