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

📄 1.cpp

📁 该程序由C++编写
💻 CPP
字号:
////////////////////////////////////////////////////////////
// 功能:
//   银行家算法
//   给出安全序列
//   设系统中有三种类型的资源
////////////////////////////////////////////////////////////

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
//   定义数据类型
typedef struct Max1
{
	int m_a;
	int m_b;
	int m_c;
}Max;//   自定义最大需求矩阵
typedef struct Allocation1
{
	int a_a;
	int a_b;
	int a_c;
}Allocation;//   自定义已分配资源矩阵
typedef struct Need1
{
	int n_a;
	int n_b;
	int n_c;
}Need;//   自定义各进程的资源需求量
struct Available1
{
	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];
//*****************************

void init()//读入
{
	printf("各进程的NEED:\n");
	FILE *fp;
	fp=fopen("1.txt","r+");
	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);
}

//*****************************
int fenpei()//分配
{
	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("请输入进程号和请求资源!如: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;
	cout<<"\n\n\n\n\n\n\n\n\n\t           ";
	for(int i=0;i<30;i++)
		cout<<"*";
	cout<<endl<<"\t"<<"           * 银  行  家  算  法   *"<<endl;
	
	printf("\t           ");
	for( i=0;i<30;i++)
		printf("*");
	printf("\n\n\n\n\n");
	getch();
	printf("\t    请确认已经在\"1.txt\"中正确输入各进程的有关信息\n");
	getch();
	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(fenpei())
		{
			printf("\n这样配置资源是安全的!\001_\001\n");
			printf("其安全序列是:  ");
			for(int k=0;k<5;k++)
				printf("-->%c",na[k]);
			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 + -