📄 wyf.cpp
字号:
#include<stdio.h>
#include "windows.h"
#define M 5
#define N 3
#define FALSE 0
#define TRUE 1
int Max[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Available[N]={2,3,0};
int Allocation[M][N]={{0,1,0},{3,0,2},{3,0,2},{2,1,1},{0,0,2}};
int Need[M][N]={{7,4,3},{0,2,0},{6,0,0},{0,1,1},{4,3,1}};
int Request[N]={0};
int Finish[M]={FALSE};
int Work[N]={0};
void showdata()
{
int i,j;
printf("●系统可用的资源数为:\n ");
for (j=0;j<N;j++)
printf("资源%c: %d ",j+65, Available[j]);
printf("\n");
printf("★★进程还需要的资源量: \n");
printf(" A B C\n" );
for(i=0;i<M;i++)
{
printf("进程%d:",i);
for(j=0;j<N;j++)
printf(" %d ", Need[i][j]);
printf("\n");
}
printf("★★进程已经得到的资源量:\n");
printf(" A B C\n" );
for(i=0;i<M;i++)
{
printf("进程%d:",i);
for(j=0;j<N;j++)
printf(" %d ",Allocation[i][j]);
printf("\n");
}
}
void changdata(int k)
{
for(int j=0;j<N;j++)
{
Available[j]-=Request[j];
Allocation[k][j]+=Request[j];
Need[k][j]-=Request[j];
}
}
int checkFinish(int k)
{
for(int j=0;j<N;j++)
if(Allocation[k][j]!=Max[k][j]) break;
if(j<N) return 0;
else{
Finish[k]=TRUE;
return 1;
}
}
void release(int k)
{
int j;
for(j=0;j<N;j++)
{
Available[j]+=Allocation[k][j];
Allocation[k][j]=0;
Need[k][j]=0;
}
}
void rstordata(int k)
{
for(int j=0;j<N;j++)
{
Available[j]+=Request[j];
Allocation[k][j]-=Request[j];
Need[k][j]+=Request[j];
}
}
int chkerr(int i,int Work[])
{
int j,count=15;
int signal[N]={FALSE} ;
while(count){
for(j=0;j<N;j++)
{
if (Finish[i]==FALSE&&Need[i][j]<=Work[j])
{
signal[j]=TRUE;
}
}
for(int m=0;m<N;m++)
if(signal[m]==FALSE) break;
if(m==N)
{ Finish[i]=TRUE;
for(j=0;j<N;j++)
Work[j]+=Allocation[i][j]; }
count--;
i++;
if(i==M) i=0;
}
for(i=0;i<M;i++)
if(Finish[i]==FALSE)
{
printf("====================\n系统不安全!!! \n本次资源申请不成功!!!\n=================\n");
return 1;
}
printf("=============================================================RIGHT!\n经安全性检查,系统安全,本次分配成功。\n");
printf("\n=============================================================RIGHT!\n");
printf("\n");
return 0;
}
//#include "Bank.h"
//#include "BankTest.h"
void main(){
int j=0;
char flag='Y';
showdata();
while(flag=='Y'||flag=='y')
{
int i=M+1;
while(i<0||i>=M)
{
printf("请输入申请资源的进程号(0--4):");
scanf("%d",&i);
if(i<0||i>=M)
printf("\n=========================ERROR!\n输入的进程号不存在,重新输入!\n=========================ERROR!\n");
}
printf("请输入进程%d申请的资源数",i);
for(j=0;j<N;j++)
{
printf("\n资源%c:",j+65);
scanf("%d",&Request[j]);
if(Request[j]>Need[i][j])
{
printf("=========================ERROR!\n进程%d申请的资源数大于进程%d还需要%c类资源的资源量!\n",i,i,j+65);
printf("申请不合理!请重新选择!\n=========================ERROR!\n");
flag='N';
break;
}
else
{
if(Request[j]>Available[j])
{
printf("=========================ERROR!\n进程%d申请的资源数大于系统可用%c类资源的资源量!\n",i,j+65);
printf("申请不合理!请重新选择!\n=========================ERROR!\n");
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
if(checkFinish(i)) {release(i) ; printf("====================================================================\n进程%d已经完成!\n",i);}
for(j=0;j<N;j++) Work[j]=Available[j];
if(chkerr(i,Work))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf("\n");
printf("是否继续银行家算法演示?(按'Y'或'y'键继续,按其它任意键退出演示): ");
getchar();
flag=getc(stdin);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -