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

📄 yhj.cpp

📁 yoyo上传的银行家算法
💻 CPP
字号:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
int Available[50],Allocation[100][100],Max[100][100];
    //可分配资源量,已分配资源量,最大资源需求量
int Need[100][100],Request[40],Work[50],Finish[100],p[100];
    //资源需求量,资源请求量,工作向量,完成状态,进程编号
int i,j,n,m,l=0;
    //进程序号,资源序号,进程序号,资源序号,
void safe();           
    //安全算法

void safe()
{	
	for (i=0; i<n;i++)
	{
		if (Finish[i]!=1)
		{
			for (j=0; j<m; j++)
			{
				if(Work[j]<Need[i][j])
				{
					break;
				}
			}
			if(j==m)
			{
				Finish[i]=1;   //资源分配成功
				for (j=0; j<m;j++)
				{
					Work[j]=Work[j]+Allocation[i][j];
				}
				p[l++]=i;    //保存安全序列
				i= -1;      //当遇到满足条件的进程时,
				           //又从第0个进程开始查找是否还是未完成的进程
			}
		}
	}
}

int main()
{
	cout<<"           --------------------------------------------------"<<endl;
	cout<<"           ||                                               ||"<<endl;
	cout<<"           ||               欢迎试用模拟银行家算法          ||"<<endl; 
	cout<<"           ||                                               ||"<<endl; 
	cout<<"           ||                                作者:黄翠清   ||"<<endl; 
	cout<<"           ||                                班级:计Y052   ||"<<endl; 
	cout<<"           ||                           学号:200502001041   ||"<<endl; 
	cout<<"           ||                                               ||"<<endl; 
	cout<<"           --------------------------------------------------"<<endl;
	cout<<"友情提示: 数据间请用空格隔开,输入完成请按回车^_^"<<endl<<endl;
	int k=0,s=0;             
	    //申请资源的进程编号
	char b;                  
	    //是否继续申请资源
	cout<<"输入进程的数量: ";//从此开始输入有关数据
    cin>>n;
    cout<<"输入资源种类数: ";
	cin>>m;
	cout<<"输入各种资源可利用的数量Available["<<m<<"]: "<<endl;      //可分配的资源数
    for (j=0; j<m; j++)
	{
		cin>>Available[j];
		Work[j]=Available[j];          //初始化Work[j]
	}
    cout<<"\n请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]: "<<endl;//已分配资源数
	cout<<"\n请严格按照("<<n<<"行×"<<m<<"列)的距阵输入:"<<endl;
	for (i=0; i<n; i++)
	{
		for (j=0; j<m; j++)
			cin>>Allocation[i][j];
		Finish[i]=0;//初始化Finish[i]为假
	}

	cout<<"\n输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]: "<<endl;//各资源最大需求数
    cout<<"\n请严格按照("<<n<<"行×"<<m<<"列)的距阵输入:"<<endl;
	for (i=0; i<n; i++)
	{
		for (j=0; j<m; j++)
		{
			cin>>Max[i][j];
			Need[i][j] = Max[i][j]-Allocation[i][j];
		}
	}
	for (i=0; i<n; i++)                //判断各资源最大需求数输入是否正确
	{
		for (j=0; j<m; j++)
		{
			while(Max[i][j]<Allocation[i][j])
			{
				cout<<"出错,请输入Max["<<i<<"]["<<j<<"]:";
				cin>>Max[i][j];
				Need[i][j] = Max[i][j]-Allocation[i][j];
			}
		}
	}
	//输出当前资源分配情况
	//判断当前状态的安全性
	safe();
	if(l==n)
	{
		cout<<"系统是安全的"<<endl;
		cout<<"安全序列:"<<endl;
		for(i=0;i<l;i++)
		{
			cout<<"P["<<p[i]<<"]";
			if(i!=l-1)
			{
				cout<<"-->";
			}
		}
		cout<<""<<endl;
	}
	else
	{
		cout<<"系统不安全"<<endl;
		return 0;
	}
	
	//输入请求
	do
	{
		cout<<"\n请输入申请资源的进程编号(0-"<<n-1<<"):P";
		cin>>k;
		while(k>n-1)
		{
			cout<<"出错,请重新输入申请资源的进程编号(0-"<<n-1<<"):P";
			cin>>k;
		}

		cout<<"\n请输入申请各类资源的数量: "<<endl;
		for (j=0; j<m; j++)
		{
			cin>>Request[j];	
		}

		//判断输入的情况
		for (j=0; j<m; j++)
		{
			if(Request[j] > Need[k][j])
			{
				cout<<"Request["<<j<<"] > Need["<<k<<"]["<<j<<"],出错.";
				s=1;
				break;
			}
		}
		for (j=0; j<m; j++)
		{
			while(Request[j] > Available[j])
			{
				cout<<"P["<<k<<"]的Request["<<j<<"]尚无足够资源,让P["<<k<<"]等待.";
				s=1;
				break;
			}
		}

		//资源预分配
		if(s==0)
		{
			for (j=0; j<m; j++)
			{
				Available[j] = Available[j]-Request[j];
				Allocation[k][j] = Allocation[k][j]+Request[j];
				Need[k][j] = Need[k][j]-Request[j];
				Work[j] = Available[j];
			}

			//判断当前状态的安全性
			safe();
			if(l==n)
			{
				cout<<"系统是安全的"<<endl;
				cout<<"安全序列:"<<endl;
				for(i=0;i<l;i++)
				{
					cout<<"P["<<p[i]<<"]";
					if(i!=l-1)
					{
						cout<<"-->";
					}
				}
				cout<<""<<endl;
			}
			else
			{
				cout<<"系统不安全"<<endl;
				//恢复数据 
				for (j=0; j<m; j++)
				{
					Available[j] = Available[j]+Request[j];
					Allocation[k][j] = Allocation[k][j]-Request[j];
					Need[k][j] = Need[k][j]+Request[j];
					Work[j] = Available[j];
				}
				for (i=0; i<n; i++)
					Finish[i]=0;
			}
			l=0;

			//显示输入各数组的值
			cout<<"\n当前状态:"<<endl;
			cout<<"Available[m]:"<<endl;
			for (j=0; j<m; j++)
			{
				cout<<Available[j]<<"    ";
			}
			cout<<endl;
			cout<<"\nAllocation[n][m]:"<<endl;
			for (i=0; i<n; i++)
			{
				for (j=0; j<m; j++)
				{
					cout<<Allocation[i][j]<<"    "; 
				}
				cout<<endl;
			}
			cout<<"\nMax[n][m]:"<<endl;
			for (i=0; i<n; i++)
			{
				for (j=0; j<m; j++)
				{
					cout<<Max[i][j]<<"    ";
				}
				cout<<endl;
			}
		}
		cout<<"\n要继续申请资源,请按'y'或'Y',否则按'n'或'N'"<<endl;
		cin>>b;
		s=0;
	}while(b=='y'||b=='Y');
	cout<<"           ----------------------------------------------------"<<endl;
	cout<<"           ||                                                ||"<<endl;
	cout<<"           ||                                                ||"<<endl; 
	cout<<"           ||                  欢迎再次使用!!!               ||"<<endl; 
	cout<<"           ||                       Welcome Back!!!          ||"<<endl; 
	cout<<"           ||                                                ||"<<endl; 
	cout<<"           ----------------------------------------------------"<<endl;
	return 0;
}

⌨️ 快捷键说明

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