⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kuer.cpp

📁 银行家算法演示
💻 CPP
字号:

#include<stdio.h>
#include<conio.h>
#include<iostream.h>

//进程所需最大资源
typedef struct Max
{
	int m_a;
	int m_b;
	int m_c;
}Max;
//进程占有
typedef struct Allocation
{
	int a_a;
	int a_b;
	int a_c;
}Allocation;
//还需要的
typedef struct Need
{
	int n_a;
	int n_b;
	int n_c;
}Need;
//总共的资源
struct Available
{
	int av_a;
	int av_b;
	int av_c;
} q;

//记录进程状态
struct pr
{
	char name;
	Max max;
	Allocation allocation;
	Need need;
	int finishflag;
}p[5];

char na[5];

//*****************************

int init()//读入
{
	printf("各进程的NEED:\n");
	FILE *fp;
	if(!(fp=fopen("1.txt","r+"))){
		printf("无法打开文件或文件不存在!");
		char c=getchar();   
	    return(0);
	}
	else{
	for(int i=0;i<5;i++)
	{

		fscanf(fp,"%c,%d,%d,%d,%d,%d,%d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b,&p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c  );
		p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;
		p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;
		p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;
		
		printf("%c:%d,%d,%d\n",p[i].name,p[i].need.n_a,p[i].need.n_b,p[i].need.n_c);
        
		
	}
	fclose(fp);
	}
	 return(1);
}

//*****************************
int anquan()//分配
{
	printf("Available:\n");
	printf("%d,%d,%d\n",q.av_a,q.av_b,q.av_c);
	int finishcnt=0,k=0,count=0;
	for(int j=0;j<5;j++)
		p[j].finishflag=0;

	while(finishcnt<5)
	{
		for(int i=0;i<5;i++)
		{
			if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c)
			{
				q.av_a+=p[i].allocation.a_a;
				q.av_b+=p[i].allocation.a_b;
				q.av_c+=p[i].allocation.a_c;
				p[i].finishflag=1;
				finishcnt++;
				na[k++]=p[i].name;
				
				break;
			}
			
		}
		count++;//禁止循环过多
		if(count>5)return 0;
	}
return 1;

}

//*****************************

int shq()
{
	int m,i,j,k;
	printf("请输入进程号和请求资源");
	printf("\n");
	printf("例如:0 2 0 2\n");
	scanf("%d%d%d%d",&m,&i,&j,&k);
	if(i<=p[m].need.n_a&&j<=p[m].need.n_b &&k<=p[m].need.n_c)
	{
		if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c)
		{
			p[m].allocation.a_a+=i;
			p[m].allocation.a_b+=j;
			p[m].allocation.a_c+=k;
			
			p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;
			p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;
			p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;
	
			printf("各进程的NEED:\n");
			for(int w=0;w<5;w++)
			printf("%c:%d,%d,%d\n",p[w].name,p[w].need.n_a,p[w].need.n_b,p[w].need.n_c);
			return 1;
		}
		else
			printf("Request>Available\n让%c等待......\n",p[m].name);
	}
	else printf("Request>Need\n让%c等待......\n",p[m].name);
	return 0;

}


//*****************************

void main()
{
	int flag;
	char c;
	int i;
	cout<<"\n\n\n\n\n\n\n\n\n\t           ";

	
	cout<<endl<<"\t"<<"********** 银 行 家 算 法 ************"<<endl;
	printf("\t           ");


	printf("\n\n\n\n\n");
	getch();
	printf("\t    请确认已经在\"1.txt\"的相关进程信息\n");
	getch();
	if(init()){
	//定义总共的资源
	q.av_a=10;
	q.av_b=5;
	q.av_c=7;
	
	while(flag)
	{
		for(i=0;i<5;i++)
		{
			q.av_a-= p[i].allocation.a_a;
			q.av_b-= p[i].allocation.a_b;
			q.av_c-= p[i].allocation.a_c;
		}
		if(anquan())
		{
			printf("\n这样配置资源是安全的!\n");

			printf("\n其安全序列是:  ");
			for(int k=0;k<5;k++)
				printf("-->%c",na[k]);
			printf("\n");
			printf("\n");
			printf("有进程发出Request请求向量吗???(Enter y or Y)\n");
			c=getch();
			if(c=='y'||c=='Y')
			{
				if(shq())continue;
				else break;
			}else flag=0;
			
		}
		else {flag=0;printf("不安全\n");}
		

	}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -