银行家算法简洁版

#include #include #include #include #define M 3 //资源种类m种#define N 4 //进程个数nint need[10][3]; //进程还需资源矩阵int max[10][3]; //进程最大需求矩阵int allocation[10][3]; //已分配资源矩阵int available[3]; //可用资源向量int work[3]; //可用资源向量int finish[10],finish1[10]; //记录进程申请的资源是否能分配int path[10]={0,1,2,3,4,5,6,7,8,9}; //记录安全序列int is_save; //是否产生安全序列int mark[10]; //记录某进程是否已分配资源void display(int *a,int n) //显示一维数组 { int i; for(i=0;i<n;i++) printf("%3d",a[i]); } void disp( ) //显示资源列表 { int i; printf("Nnumber\t Max\t\t need\t\t allocation\t avalible\n"); for(i=0;i<N;i++) {printf("p%d\t",i);//--分别显示P0,P1,P2的Max,Need,Allocation,Avalible display(max[i],M); printf("\t"); display(need[i],M); printf("\t"); display(allocation[i],M); printf("\t"); if(i==0) display(available,M); printf("\n"); }}void init( ){ int i,j; srand(time(NULL)); for(i=0;i<M;i++) for(j=0;j<N;j++) { allocation[i][j]=rand()%10; need[i][j]=rand()%10; max[i][j]=allocation[i][j]+need[i][j]; } for(i=0;i<N;i++) { available[i]=rand()%12;} disp(); is_save=0;}void showMenu( ){ puts("\n*****************************************************"); puts("*0.初始化数据 1.安全性算法 2.银行家算法 3.退出*"); puts("*******************************************************");}int safe()//检查安全序列 { int i,j,k=1; // k用来结束安全序列的查找 int flag=1; // flag = 0表示当前可用资源< 进程申请资源数 int r=0,r1=0; // 记录所需资源能被满足的进程数; for( j = 0; j < M; j++) //初始化work { work[j] = available[j]; } printf("现在进行安全性检查......\n"); for( i = 0; i < N; i++)//初始化finish[],表示true,表示false{finish[i]=0;finish1[i]=0; }//请在此处插入完成安全性检查算法的代码! for(i=0;i<N;i++) { int g=0; if(finish[i]==0) { for(j=0;j<M;j++) { if(need[i][j]<=work[j]) { g=1; } else break; } } else break; if(g==1) { for(j=0;j<M;j++) { work[j]=work[j]+allocation[i][j]; } finish[i]=1; } } for(i=0;i=4){ printf("-----找到安全序列-----\n");for(i=0;i<N;i++){if(i!=N-1) printf("p%d->",path[i]); else printf("p%d\n",path[i]);} return 1;} else{ printf("进行安全性检查后.....\n"); printf("当前状态不安全!\n"); return 0; }}void print_sav_seq(){int i,j;printf("安全序列如下:");for( j = 0; j < N; j++){printf(j? "-->":"");printf("p%d", path[j]);}puts("");puts("*****************************************************************");puts("* Work Need Allocation Work+Allocation Finish *");puts("* A B C A B C A B C A B C *");for( j = 0; j < M; j++){work[j] = available[j];}for( j = 0; j < N; j++){int i = path[j];printf("*P%d ", i);printf("%3d%3d%3d ", work[0], work[1], work[2]);printf("%3d%3d%3d ", need[i][0], need[i][1], need[i][2]);printf("%3d%3d%3d ", allocation[i][0], allocation[i][1], allocation[i][2]);work[0] += allocation[i][0];work[1] += allocation[i][1];work[2] += allocation[i][2];printf("%3d%3d%3d true *\n", work[0], work[1], work[2]);}puts("*****************************************************************");printf("可用资源:A->%d;B->%d;C->%d\n\n\n",available[0], available[1], available[2] );}void banker(){int oper, i, j, flag1 = 0, flag2 = 0; //用来比较request[j] > need[i][j] 和request[j] > available[j] int g = 0;int request[3];while(1){flag1 = flag2 = 0;printf("请输入要操作的进程号:");scanf("%d", &i);if(i>N||i<0) { printf("你输入的进程号不存在!"); break;}printf("请输入各类资源的请求数:");scanf("%d %d %d", &request[0], &request[1], &request[2]);//请在此处插入银行家算法实现的代码!for(j=0;j<M;j++){if(request[j]<=need[i][j]&&request[j]<=available[j]){g = 1;}elseg =0;}if(g==1){for(j = 0;j<M;j++){available[j] = available[j] - request[j];allocation[i][j] = allocation[i][j]+request[j];need[i][j] = need[i][j] - request[j];}puts("检查通过进行安全性检查"); i=safe();}elseputs("检查未通过谢谢");puts(" 1.继续操作 2.退出");scanf("%d", &oper);if(oper == 2){break;}}}int main(){int oper;while(1){showMenu();printf("请选择接下来的操作:");scanf("%d", &oper);switch( oper ){case 0:init();break;case 1:if(safe()==1) is_save =1;if(is_save == 1){print_sav_seq();}else{puts("无法找到安全序列,请重新生成数据再运行程序");return 0;}break;case 2:banker();break;case 3: return 0;default:puts("输入有误,清重试");break;}}system("pause");return 0;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值