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

📄 bank.cpp

📁 使用Visual C++ 6.0开发
💻 CPP
字号:
#include <iostream>
#include <vector>
using namespace std;

class Resource
{
public:
	int *pRe;
	int m_count;
public:
	Resource(int);
	~Resource();	
};

Resource::Resource(int count) : m_count(count)
{
	pRe=new int[count];
}

Resource::~Resource()
{
	delete [] pRe;
	m_count=0;
}

class Process //进程类
{
public:
	Resource *allocate;
	Resource *need;
	bool finish;
	int m_count;
public:
	Process(int);
	Process(const Process&);
	~Process();
};

 
Process::Process(int count) : m_count(count)
{
	allocate=new Resource(count);
	need=new Resource(count);
	finish=false;
}

Process::Process(const Process& p) //深拷贝构造函数,allocator类使用
{
	allocate=new Resource(p.m_count);
	need=new Resource(p.m_count);
	finish=p.finish;
	m_count=p.m_count;
}

Process::~Process()
{
	delete allocate;
	delete need;	
	m_count=0;
}

int main()
{
	cout<<"                  ---------------银行家算法---------------\n                               作者:汪宏浩\n";
	cout<<"请输入需要多少进程:";
	int numPro;
	cin>>numPro;
	cout<<"请输入每个进程的资源数:";
	int count;
	cin>>count;

//  VC 2008下可用
//	allocator<Process> alloc;
//	Process *p=alloc.allocate(numPro);
//	for (int i=0;i<numPro;i++)
//		alloc.construct(p+i,Process(count));

	Resource *available; //整体的资源需求量
	available=new Resource(count);

	vector<Process> p(numPro,Process(count));

//  赋初值的
//	Process p[5]={Process(4),Process(4),Process(4),Process(4),Process(4)};
	
	//available->pRe[0]=1;
	//available->pRe[1]=1;
	//available->pRe[2]=2;
	//available->pRe[3]=2;

	//p[0].allocate->pRe[0]=0;
	//p[0].allocate->pRe[1]=0;
	//p[0].allocate->pRe[2]=3;
	//p[0].allocate->pRe[3]=2;
	//p[0].need->pRe[0]=0;
	//p[0].need->pRe[1]=0;
	//p[0].need->pRe[2]=1;
	//p[0].need->pRe[3]=2;

	//p[1].allocate->pRe[0]=1;
	//p[1].allocate->pRe[1]=0;
	//p[1].allocate->pRe[2]=0;
	//p[1].allocate->pRe[3]=0;
	//p[1].need->pRe[0]=1;
	//p[1].need->pRe[1]=7;
	//p[1].need->pRe[2]=5;
	//p[1].need->pRe[3]=0;

	//p[2].allocate->pRe[0]=1;
	//p[2].allocate->pRe[1]=3;
	//p[2].allocate->pRe[2]=5;
	//p[2].allocate->pRe[3]=4;
	//p[2].need->pRe[0]=2;
	//p[2].need->pRe[1]=3;
	//p[2].need->pRe[2]=5;
	//p[2].need->pRe[3]=6;

	//p[3].allocate->pRe[0]=0;
	//p[3].allocate->pRe[1]=3;
	//p[3].allocate->pRe[2]=3;
	//p[3].allocate->pRe[3]=2;
	//p[3].need->pRe[0]=0;
	//p[3].need->pRe[1]=6;
	//p[3].need->pRe[2]=5;
	//p[3].need->pRe[3]=2;

	//p[4].allocate->pRe[0]=0;
	//p[4].allocate->pRe[1]=0;
	//p[4].allocate->pRe[2]=1;
	//p[4].allocate->pRe[3]=4;
	//p[4].need->pRe[0]=0;
	//p[4].need->pRe[1]=6;
	//p[4].need->pRe[2]=5;
	//p[4].need->pRe[3]=6;

	system("cls");	
	cout<<"请先输入资源状态数......"<<endl;
	cout<<"可用资源:"<<endl;
	for (int i=0;i<count;i++)
	{
		cout<<"资源"<<(char)(i+65)<<"的数量:";
		cin>>available->pRe[i];
	}
	cout<<"\n\n\n各个进程的资源状态:"<<endl;	
	for (i=0;i<numPro;i++)
	{
		cout<<"进程p["<<i<<"]:"<<endl;
		cout<<"   已分配资源..."<<endl;
		for (int j=0;j<count;j++)
		{
			cout<<"     资源"<<(char)(j+65)<<"的数量:";
			cin>>p[i].allocate->pRe[j];
		}
		cout<<"   所需资源..."<<endl;
		for (j=0;j<count;j++)
		{
			cout<<"     资源"<<(char)(j+65)<<"的数量:";
			cin>>p[i].need->pRe[j];
		}
	}

	cout<<"\n\n有进程提出请求否?(y/n)"<<endl<<"  输入:";
	char ch;
	cin>>ch;
	ch&=0x0DF;
	if (ch=='Y')
	{
		cout<<"现有进程为:";
		for (int i=0;i<numPro;i++)
		{			
			cout<<"p["<<i<<"] ";
		}
REINPUT:
		cout<<"\n选择进程:";
		int sel;
		cin>>sel;
		if (sel<0 || sel>=numPro)
		{
			cout<<"没有该进程,请重新输入!"<<endl;
			goto REINPUT;
		}
		cout<<"  输入请求资源数:"<<endl;
		int request;
		for (i=0;i<count;i++)
		{
REQUEST:
			cout<<"  请求资源"<<(char)(i+65)<<"的数量:";
			cin>>request;
			if (request>p[sel].need->pRe[i])
			{
				cout<<"请求量不能大于该进程的资源需求量!\n请重新输入!。。。"<<endl;
				goto REQUEST;
			}
			p[sel].allocate->pRe[i]+=request;
			p[sel].need->pRe[i]-=request;
			available->pRe[i]-=request; //修改现在的资源分配情况。
		}
	}


	int j=0, k=0;
	int *l=new int[numPro]; //保存分配资源序列
	bool isSafe=false; //判断系统是否安全
	bool hasAlloc; //判断是否已经全部分配完
	while (true)
	{
		bool allFinish=true; //标志,判断是否所有进程都执行结束
		bool flag=true; //标志,用于判断
		//int *tmpAvail; //保存可用资源数,用于判断系统的安全状态
		
		
		if (j==0) //如果是一个新的探测轮回
		{
			hasAlloc=false;
		}	
		if (p[j].finish==false) //如果当前进程未执行完毕
		{
			for (int i=0;i<count;i++)
				flag&=(available->pRe[i]>=p[j].need->pRe[i]); //判断是否可分配
			if (flag)
			{
				for (int i=0;i<count;i++)
					available->pRe[i]+=p[j].allocate->pRe[i];
				p[j].finish=true;
				l[k++]=j; //保存分配序列
				hasAlloc=true;
			}
		}
		for (int i=0;i<numPro;i++)
		{
			allFinish&=p[i].finish;
			//cout<<i<<p[i].finish<<' ';
		}
		if (allFinish) //如果所有的进程都执行完毕
		{
			isSafe=true; //状态是安全的
			break; //退出
		}				
		j++; //指向下一个进程
		if (j==numPro) //如果已经到进程尾 
		{		
			if (!hasAlloc) //如果一个轮回也没有分配出资源
				break; //则系统是不安全的,退出
			j=0; //否则回到第一个进程			
		}		
	}


	cout<<"\n\n";
	if (!isSafe) //如果是不安全的
		cout<<"无法分配!"<<endl;
	else //安全的则输出安全序列
	{
		cout<<"系统安全!分配资源过程为:"<<endl<<"   ";
		for (int i=0;i<numPro;i++)
		{
			cout<<"p["<<l[i]<<']';
			if (i!=numPro-1)
				cout<<"-->";
		}
	}
	cout<<endl;
	
	delete available;
	delete []l;

//  VC 2008下可用
//	for (int i=0;i<numPro;i++)
//		alloc.destroy(p+i);
//	alloc.deallocate(p,numPro);

	system("pause");

	return 0;
}

⌨️ 快捷键说明

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