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

📄 bank.cpp

📁 二维动态数组的银行家算法 可以自己输入进程数和资源数
💻 CPP
字号:
#include <iostream>   
#include <iomanip> 
//#define FALSE 0
//#define TRUE 1
using namespace std;

void create()
{
	int m;        //进程数
	int n;         //资源数
	int i=0;
	int j=0;
	std::cout<<"输入进程数:";
	std::cin>>m;
	std::cout<<"输入资源数:";
	std::cin>>n;
	std::cout<<endl;
	int *work, *finish;
	int temp1=0,temp2=0;
	int **claim;                    //进程对资源的最大需求数
	int **need;                    //各进程还需资源数
	int **allocation;              //进程已经分配到的资源数
	int *available, *available1;                 //系统可用资源数
	int *request;             	//请求资源数
	int *process;

	std::cout<<"输入已经分配的资源:"<<std::endl;                   //输入已经分配的资源
	//arr(m,n,allocation);
	allocation=new int *[m];          
	for( i=0; i<m; i++)
	{
		allocation[i]=new int[n];
		std::cout<<"进程"<<i;
		for(j=0; j<n; j++)
		{
			std::cout<<"  资源"<<j<<":";
			std::cin>>allocation[i][j];
			std::cout<<"\t";
		}
		std::cout<<std::endl;
	}
	
	
        char flag1='y';                            //选择输入最大需求资源数还是输入还需要的资源数
	while(flag1=='y'||flag1=='Y')
	{
	        int k;
	        std::cout<<"选0输入最大需求资源数!"<<std::endl
	                    <<"选1输入还需要的资源数!";
		std::cout<<std::endl;
	        std::cin>>k;
	        if(k==0)
	        {
			std::cout<<std::endl;
			std::cout<<"输入最大需求资源数:"<<std::endl;
			
			claim=new int *[m];
			for( i=0; i<m; i++)
			{
				claim[i]=new int[n];
		                std::cout<<"进程"<<i;
		                for(j=0; j<n; j++)
				{
					std::cout<<"  资源"<<j<<":";
					std::cin>>claim[i][j];
			                std::cout<<"\t";
		                }
				std::cout<<std::endl;
	                }
			
			need=new int *[m];
			for( i=0; i<m; i++)
			{
				need[i]=new int[n];
		                for(j=0; j<n; j++)
				{
					need[i][j]=0;
		                }
	                }

			for(i=0; i<m; i++)
			{
				for(j=0; j<n; j++)
				{
					need[i][j]=claim[i][j]-allocation[i][j];
				}
			}
		        flag1='n';
			break;
	        }
	        else  
			if(k==1)
		        {
				std::cout<<"输入还需要的资源数:"<<std::endl;
				//arr(m,n,need);
				need=new int *[m];
				for( i=0; i<m; i++)
			        {
					need[i]=new int[n];
					std::cout<<"进程"<<i;
					for(j=0; j<n; j++)
				        {
						std::cout<<"  资源"<<j<<":";
						std::cin>>need[i][j];
						std::cout<<"\t";
		                        }
					std::cout<<std::endl;
	                        }
			        flag1='n';
			        break;
			}
	        else
			std::cout<<"输入有误,请重新输入!"<<std::endl;
        }
	
	std::cout<<"输入可用的资源数:"<<std::endl;          //输入可用的资源数
	//arr(n, available);
	available=new int[n];
	for(j=0; j<n; j++)
	{
		std::cout<<"资源"<<j<<":";
		std::cin>>available[j];
		std::cout<<"\t";
	}
	std::cout<<std::endl;
	
	available1=new int[n];
	for(j=0; j<n; j++)
	{
		available1[j]=available[j];
	}
	
	request=new int[n];             //请求资源数
	for(j=0; j<n; j++)
	{
		request[j]=0;
	}
	
	finish=new int[m];            
	for(i=0; i<m; i++)
	{
		finish[i]=0;
	}
	
	work=new int[n];             
	for(j=0; j<n; j++)
	{
		work[j]=0;
	}
	
	process=new int[m];             
	for(i=0; i<m; i++)
	{
		process[i]=0;
	}

	std::cout<<"已分配资源:"<<std::endl;           //输出已分配的资源
	for(i=0; i<m; i++)
	{
		std::cout<<"进程"<<i;
		for(j=0; j<n; j++)
		{
			std::cout<<"  资源"<<j<<":";
			std::cout<<allocation[i][j];
			std::cout<<"\t";
		}
		std::cout<<std::endl;
	}
	
	std::cout<<"还需资源:"<<std::endl;             //输出还需要的资源
	for(i=0; i<m; i++)
	{
		std::cout<<"进程"<<i;
		for(j=0; j<n; j++)
		{
			std::cout<<"  资源"<<j<<":";
			std::cout<<need[i][j];
			std::cout<<"\t";
		}
		std::cout<<std::endl;
	}
	
	std::cout<<"可用资源:"<<std::endl;             //输出可用资源
	for(j=0; j<n; j++)
	{
		std::cout<<"资源"<<j<<":";
		std::cout<<available[j];
		std::cout<<"\t";
	}
	std::cout<<std::endl;
	
	/*for(j=0; j<n; j++)                                     
	{
		available[j]=available[j]-request[j];
		allocation[i][j]=allocation[i][j]+request[j];
		need[i][j]=need[i][j]-request[j];
	}*/
	for(j=0; j<n; j++)
	{
		work[j]=available[j];
	}
			
	bool flag4=false;
	int q=0;
	while(flag4==false&&q<m)
	{
		for(i=0; i<m; i++)
		{
			if(finish[i]==0)
			{
				for(j=0; j<n; j++)
				{
					if(need[i][j]>work[j])
					break;
				}
				if(j==n)
				{
					for(int k=0; k<n; k++)
					        work[k]+=allocation[i][k];
					process[temp1]=i;
					temp1++;
					finish[i]=1;
					flag4=true;
				}
			}
			else 
				continue;
		}
		q++;
		for(i=0; i<m; i++)
		        if(finish[i]==0)
				flag4=false;
	}
				
	int k=0;
	for( ; k<m; k++)
	{
		if(finish[k]==0)
		{
			std::cout<<"系统不安全!"<<std::endl;
			break;
		}
	}
	bool flag5=false;
	if(k==m)
	{
		std::cout<<"系统安全!"<<std::endl;
		flag5=true;
		std::cout<<"安全序列为:"<<std::endl;
		for(i=0; i<m; i++)
			std::cout<<"进程"<<process[i]<<"→  ";
	}
	std::cout<<std::endl;
	std::cout<<std::endl;
	
	char flag2='y';
	while(flag5=true &&(flag2=='Y'||flag2=='y'))
	{
		i=-1;
		while(i<0||i>=m)
		{
			std::cout<<"请输入要申请资源的进程号(从0到"<<m-1<<")";
			std::cin>>i;
			if(i<0||i>=m)
				std::cout<<"输入的进程号不存在,请重新输入!"<<std::endl;
		}
		std::cout<<"输入进程"<<i<<"   申请资源数"<<std::endl;
		for(j=0; j<n; j++)
		{
			std::cout<<"资源"<<j<<":";
			std::cin>>request[j];
			if(request[j]>need[i][j])
			{
				std::cout<<"进程"<<i<<"申请的资源大于进程"<<i<<"还需要的"<<j<<"类资源数!";
				std::cout<<"请重新选择!"<<std::endl;
			        flag2='n';
				break;
			}
			else
				if(request[j]>available[j])
				{
					std::cout<<"进程"<<i<<"申请的资源大于系统可用的"<<j<<"类资源数!";
				        std::cout<<"请重新选择!"<<std::endl;
					flag2='n';
					break;
				}
		}
		
		if(flag2=='y'||flag2=='Y')
		{
			for(j=0; j<n; j++)
			{
				available1[j]=available1[j]-request[j];
				allocation[i][j]=allocation[i][j]+request[j];
				need[i][j]=need[i][j]-request[j];
			}
			for(j=0; j<n; j++)
			{
				work[j]=available1[j];
			}
			
			bool flag3=false;
			int p=0;
			while(flag3==false&&p<m)
			{
				for(i=0; i<m; i++)
				{
					if(finish[i]==0)
					{
						for(j=0; j<n; j++)
						{
							if(need[i][j]>work[j])
								break;
						}
						if(j==n)
						{
							for(int k=0; k<n; k++)
								work[k]+=allocation[i][k];
							process[temp2]=i;
							temp2++;
							finish[i]=1;
							flag3=true;
						}
					}
					else 
						continue;
				}
				p++;
				for(i=0; i<m; i++)
					if(finish[i]==0)
						flag3=false;
			}
				
			int k=0;
			for( ; k<m; k++)
			{
				if(finish[k]==0)
				{
					std::cout<<"系统不安全!"<<std::endl;
					break;
				}
			}
			if(k==m)
			{
				std::cout<<"系统安全!"<<std::endl;
				std::cout<<"安全序列为:"<<std::endl;
				for(i=0; i<m; i++)
					std::cout<<"进程"<<process[i]<<"→  ";
			}

			flag2='n';
		}
	    std::cout<<std::endl;
		
		std::cout<<"是否继续银行家算法演示,按‘Y’或‘y’继续,按‘N’或‘n’退出演示:";
		std::cin>>flag2;
		
	}
}

int main()
{
	create();
	return 0;
}
			
	
			
	

⌨️ 快捷键说明

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