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

📄 5.cpp

📁 银行家算法
💻 CPP
字号:
#include<stdio.h>

#include<iostream.h>

struct pr
{
	char name;
	int max[5];
	int al[5];
	int need[5];
	int finishflag;
}p[10];

int av[5];

int re[5];

char na[10];

int a(int i,int b)
{
	for(int j=0;j<b;i++)
		if(av[j]>=p[i].need[j])
			continue;
	if(j==(b-1))
		return 1;
	else
		return 0;
}

int aa(int i,int b)
{
	int j,a=0;
	for(j=0;j<b;j++)
	{
		if(av[j]>=p[i].need[j])
			a++;
	}
	if(a==j)
		return 1;
	else 
		return 0;
}

int bb(int j,int b)
{
	int i,a=0;
	for(i=0;i<b;i++)
	{	
		if(re[i]<=p[j].need[i])
			a++;
	}
	if(a==i)
		return 1;
	else 
		return 0;
}

int cc(int b)
{
	int j,a=0;
	for(j=0;j<b;j++)
	{
		if(av[j]>=re[j])
			a++;
	}
	if(a==j)
		return 1;
	else 
		return 0;
}

int distribute(int a,int b)//分配
{
	cout<<"Available:";
	for(int i=0;i<b;i++)
		cout<<av[i]<<" ";
	cout<<endl;
	int finish=0,k=0,count=0;
	for(int j=0;j<a;j++)
		p[j].finishflag=0;
	while(finish<a)
	{
		for(i=0;i<a;i++)	
		{
			if(p[i].finishflag==0&&aa(i,b))
			{
				for(j=0;j<b;j++)
				av[j]+=p[i].al[j];
				p[i].finishflag=1;
				finish++;
				na[k++]=p[i].name;
				break;
			}
		}
		count++;
		if(count>a)
			return 0;
	}
	return 1;
}

int request(int a,int b)
{
	char m;
	int l;
	cout<<"请输入进程名称:"<<endl;
	cin>>m;
	for(int j=0;j<a;j++)
		if(m==p[j].name)
			l=j;
	cout<<"请输入进程"<<p[l].name<<"请求资源数:"<<endl;
	for(int i=0;i<b;i++)
		cin>>re[i];
	if(bb(l,b))
	{
		if(cc(b))
		{
			for(i=0;i<b;i++)
			{
				p[l].al[i]+=re[i];
				p[l].need[i]=p[l].max[i]-p[l].al[i];
			}
		cout<<"各进程还需要的资源数(NEED):"<<endl;
		for(i=0;i<a;i++)
		{
			cout<<p[i].name<<": ";
			for(int j=0;j<b;j++)
				cout<<p[i].need[j]<<" ";
			cout<<endl;
		}
			return 1;
		}
		else
			cout<<"Request>=Available 让"<<p[l].name<<"等待!"<<endl;
	}
	else 
		cout<<"Request>=Need 让"<<p[l].name<<"等待!"<<endl;
	return 0;
}

void main()
{
	cout<<"                   银行家算法"<<endl;
	int a,b;
	cout<<"请输入进程数目:";
	cin>>a;
	cout<<"请输入共有几类资源:";
	cin>>b;
	cout<<"请依次输入"<<a<<"个进程的名称:"<<endl;
	for(int i=0;i<a;i++)
	    cin>>p[i].name;	
	cout<<"请依次输入"<<a<<"个进程对"<<b<<"类资源的最大需求量(MAX):"<<endl;
	for(i=0;i<a;i++)
	    for(int j=0;j<b;j++)
			cin>>p[i].max[j];	
	cout<<"请依次输入"<<a<<"个进程对"<<b<<"类资源的已分配量(Allocation):"<<endl;
	for(i=0;i<a;i++)
	    for(int j=0;j<b;j++)
			cin>>p[i].al[j];
	for(i=0;i<a;i++)
		for(int j=0;j<b;j++)
			p[i].need[j]=p[i].max[j]-p[i].al[j];
	cout<<"请输入当前每种资源的总量(All):"<<endl;
	for(int j=0;j<b;j++)
		cin>>av[j];
	cout<<"各进程还需要的资源数(NEED):"<<endl;
	for(i=0;i<a;i++)
	{
		cout<<p[i].name<<": ";
		for(int j=0;j<b;j++)
			cout<<p[i].need[j]<<" ";
		cout<<endl;
	}
	int flag=1;
	char ac;

	while(flag)
	{
		for(i=0;i<a;i++)
			for(j=0;j<b;j++)
				av[j]-=p[i].al[j];
		if(distribute(a,b))
		{
			cout<<"\n资源配置是安全的!\n";
			cout<<"其安全序列是:";
			for(int k=0;k<a;k++)
				cout<<"-->"<<na[k];
			cout<<endl;
			cout<<"有进程发出Request吗?(Y/N)"<<endl;
			cin>>ac;
			if(ac=='y'||ac=='Y')
			{
				if(request(a,b))
					continue;
				else 
					flag=0;
			}
			else
				flag=0;
		}
		else 
		{
			flag=0;
			cout<<"不安全!"<<endl;
		}		
	}
}

⌨️ 快捷键说明

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