#include <iostream> #include <string> #define m 3 //资源的种类数 #define n 5 //进程的个数 void output(int imax[n][m],int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]); //统一的输出格式 bool safety(int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]); bool banker(int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]); int main() { int i,j; //当前可用每类资源的资源数 int i**ailable[m]={3,3,2}; //系统中n个进程中的每一个进程对m类资源的最大需求 int imax[n][m]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //ineed[n][m]每一个进程尚需的各类资源数 //iallocation[n][m]为系统中每一类资源当前已分配给每一进程的资源数 int ineed[n][m],iallocation[n][m]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //进程名 char cname[n]={'a','b','c','d','e'}; bool bexitflag=true; //退出标记 char ch; //接收选择是否继续提出申请时传进来的值 bool bsafe; //存放安全与否的标志 //计算ineed[n][m]的值 for(i=0;i<n;i++) for(j=0;j<m;j++) ineed[i][j]=imax[i][j]-iallocation[i][j]; //输出初始值 output(imax,iallocation,ineed,i**ailable,cname); //判断当前状态是否安全 bsafe=safety(iallocation,ineed,i**ailable,cname); //是否继续提出申请 while(bexitflag) { cout<<"\n"<<"继续提出申请?\ny为是;n为否。\n"; cin>>ch; switch(ch) { case 'y': //cout<<"调用银行家算法"; bsafe=banker(iallocation,ineed,i**ailable,cname); if (bsafe) //安全,则输出变化后的数据 output(imax,iallocation,ineed,i**ailable,cname); break; case 'n': cout<<"退出。\n"; bexitflag=false; break; default: cout<<"输入有误,请重新输入:\n"; } } } //输出 void output(int imax[n][m],int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]) { int i,j; cout<<"\n\t max \tallocation\t need \t **ailable"<<endl; cout<<"\ta b c\ta b c\ta b c\t a b c"<<endl; for(i=0;i<n;i++) { cout<<cname[i]<<"\t"; for(j=0;j<m;j++) cout<<imax[i][j]<<" "; cout<<"\t"; for(j=0;j<m;j++) cout<<iallocation[i][j]<<" "; cout<<"\t"; for(j=0;j<m;j++) cout<<ineed[i][j]<<" "; cout<<"\t"; cout<<" "; //**ailable只需要输出一次 if (i==0) for(j=0;j<m;j++) cout<<i**ailable[j]<<" "; cout<<endl; } } //安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示; bool safety(int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]) { } //定位ch对应的进程名在数组中的位置 //没找见返回-1,否则返回数组下标 int locate(char cname[n],char ch) { int i; for(i=0;i<n;i++) if (cname[i]==ch) //找到 return i; //未找到 return -1; } //提出申请,返回提出申请的进程名对应的下标 int request(char cname[n],int irequest[m]) { int i,loc; char ch; bool bflag=true; //判断输入的进程名是否有误 while(bflag) { //输出进程名 for(i=0;i<n;i++) cout<<cname[i]<<"\t"; //输入提出申请的进程名 cout<<"\n输入提出资源申请的进程名:\n"; cin>>ch; //定位ch对应的进程名在进程名数组中的位置 loc=locate(cname,ch); //没找到,重新输入 if (loc==-1) cout<<"\n您输入的进程名有误!请重新输入"; //找到,退出循环 else bflag=false; } //输入提出申请的资源数 cout<<"输入申请各类资源的数量:\n"; for(i=0;i<m;i++) cin>>irequest[i]; //返回提出申请的进程名对应的下标 return loc; } bool banker(int iallocation[n][m],int ineed[n][m],int i**ailable[m],char cname[n]) { }这个是c++的 我的报告 20210311