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

📄 1.cpp

📁 用c++编的银行家算法
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include "windows.h"
#define MAX_PROCESS 32             //最大进程数
#define MAX_COURCE 64              //最大资源类别

int MAX_FACT_PROCESS;              //实际总进程数
int MAX_FACT_COURCE;               //实际资源类别数
int Available[MAX_COURCE];                 //可利用资源向量
int Max[MAX_PROCESS][MAX_COURCE];          //最大需求矩阵
int Allocation[MAX_PROCESS][MAX_COURCE];   //分配矩阵
int Need[MAX_PROCESS][MAX_COURCE];         //需求矩阵

int Request_PROCESS;                       //发出请求的进程
int Request_COURCE;                        //被请求资源类别
int Request_COURCE_NEMBER;                 //请求资源数

struct COMP{
	int value;
	int num;
	int next;
};
int flag=0;
void Read_Initiate(void){
	ifstream infile("Initiate.txt");
	    if(!infile){
		cout<<"不能打开输入文件:"<<"Initiate.txt"<<'\n';
		exit(1);
	}
	cout<<"开始读入初始化文档"<<'\n';
	int ch;
	int Array[MAX_PROCESS*MAX_COURCE*2];
	int num=0;
	while(infile>>ch)
	     Array[num++]=ch;
	num=0;
    MAX_FACT_COURCE=Array[num++];
    for(int j=0;j<MAX_FACT_COURCE;j++)
		Available[j]=Array[num++];
    MAX_FACT_PROCESS=Array[num++];
	for(int i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			Max[i][j]=Array[num++];
	}
	infile.close();
}

void Write_Initiate(void){
	ofstream outfile("Initiate.txt");
	if(!outfile){
		cout<<"不能打开初始化文档:"<<'\n';
		exit(1);
	}
	int Array[MAX_PROCESS*MAX_COURCE*2];
	int num=0;
	Array[num++]=MAX_FACT_COURCE;
    for(int i=0;i<MAX_FACT_COURCE;i++)
		Array[num++]=Available[i];
	Array[num++]=MAX_FACT_PROCESS;
	for(i=0;i<MAX_FACT_PROCESS;i++)
		for(int j=0;j<MAX_FACT_COURCE;j++)
			Array[num++]=Max[i][j];

	num=0;
	outfile<<Array[num++]<<" ";
	for(i=0;i<MAX_FACT_COURCE;i++)
		outfile<<Array[num++]<<" ";
	outfile<<'\n'<<Array[num++]<<endl;
	for(i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			outfile<<Array[num++]<<" ";
		outfile<<endl;
	}
	DWORD m_delay=3000;
	Sleep(m_delay);	
	outfile.close();
	cout<<"修改初始化文档成功!"<<endl;
}

void Allocated_list(void){
	ifstream infile("Allocated_list.txt");
	    if(!infile){
		cout<<"不能打开输入文件:"<<"Allocated_list.txt"<<'\n';
		exit(1);
	}
	cout<<"开始读入已分配资源列表"<<'\n';
	int ch,num=0;
	int Array[MAX_PROCESS*MAX_COURCE];
	while(infile>>ch)
		Array[num++]=ch;
	num=0;
		for(int i=0;i<MAX_FACT_PROCESS;i++)
			for(int j=0;j<MAX_FACT_COURCE;j++)
				Allocation[i][j]=Array[num++];
		infile.close();
}

void Set_Need(void){
	cout<<"设置需求矩阵"<<'\n';
	for(int i=0;i<MAX_FACT_PROCESS;i++)
		for(int j=0;j<MAX_FACT_COURCE;j++)
			Need[i][j]=Max[i][j]-Allocation[i][j];
}

void Read_Request(void){
	ifstream infile("Request_list.txt");
	    if(!infile){
		cout<<"不能打开输入文件:"<<"Request_list.txt"<<'\n';
		exit(1);
	}
    cout<<"开始读入请求向量"<<'\n';
	int Array[3];
	int num=0,ch;
	while(infile>>ch)
	     Array[num++]=ch;
    Request_PROCESS=Array[0];
    Request_COURCE=Array[1];
    Request_COURCE_NEMBER=Array[2];
	infile.close();
}

void Write_Allocation(void){
	ofstream outfile("Allocated_list.txt");
	if(!outfile){
		cout<<"不能打开资源分配列表:"<<'\n';
		exit(1);
	}
	for(int i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			outfile<<Allocation[i][j]<<" ";
		outfile<<endl;
	}
    DWORD m_delay=3000;
	Sleep(m_delay);	
	cout<<"修改资源分配列表成功!"<<endl;
	outfile.close();
}

void Allocate_Source(void){
	cout<<'\n'<<"开始给第"<<Request_PROCESS<<"个进程分配第"<<Request_COURCE
		<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;
	Write_Initiate();
	Write_Allocation();
	DWORD m_delay=3000;
	Sleep(m_delay);	
	cout<<'\n'<<"祝贺您,资源分配已成功!"<<endl;
}

void Test_Safty(){                         //安全性检测
	cout<<'\n'<<"进入安全性检测!"<<endl;
    int Work[MAX_COURCE];
	for(int i=0;i<MAX_FACT_COURCE;i++){
		Work[i]=Available[i];
	}
    bool Finish[MAX_PROCESS][MAX_COURCE];
	for(i=0;i<MAX_FACT_PROCESS;i++)
		for(int j=0;j<MAX_FACT_COURCE;j++)
			Finish[i][j]=false;
	COMP Array[32];
	for(i=0;i<MAX_FACT_PROCESS;i++)
	{
		Array[i].value=Need[i][Request_COURCE-1];
        Array[i].num=i;
	}
	for(i=0;i<MAX_FACT_PROCESS;i++)
		for(int j=i+1;j<MAX_FACT_PROCESS;j++){
			if(Array[i].value>=Array[j].value){
				int t;
				t=Array[j].value;
                Array[j].value=Array[i].value;
				Array[i].value=t;
				t=Array[j].num;
                Array[j].num=Array[i].num;
                Array[i].num=t;
			}
			else continue;
		}
	DWORD m_delay=3000;
	Sleep(m_delay);
/*	for(i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			cout<<Need[i][j]<<'\t';
		cout<<endl;	
	}
*/
	if(Finish[Request_PROCESS-1][Request_COURCE-1]==false&&Need[Request_PROCESS-1][Request_COURCE-1]<=Work[Request_COURCE-1])
	{
		Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Request_PROCESS-1][Request_COURCE-1];
        Finish[Request_PROCESS-1][Request_COURCE-1]=true;
	}
	else
	{
		cout<<"未通过安全性测试,不与以分配"<<endl;
		exit(0);
	}
    for(i=0;i<MAX_FACT_PROCESS;i++){
		if(Array[i].num==Request_PROCESS-1)
			continue;
		if(Array[i].num!=Request_PROCESS-1&&Finish[Array[i].num][Request_COURCE-1]==false&&Need[Array[i].num][Request_COURCE-1]<=Work[Request_COURCE-1]){
				Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Array[i].num][Request_COURCE-1];
                Finish[Array[i].num][Request_COURCE-1]=true;
		}
	}
    for(i=0;i<MAX_FACT_PROCESS;i++)
	{
		if(Finish[i][Request_COURCE-1]==true)
			continue;
		else
		{
			cout<<"未通过安全性测试,不与以分配"<<endl;
		    exit(0);
		}
	}
	cout<<'\n'<<"找到一个安全序列:"<<"P"<<Request_PROCESS<<"--->";
    for(i=0;i<MAX_FACT_PROCESS;i++){
		if(Array[i].num==Request_PROCESS)
			continue;
		else
			cout<<"P"<<Array[i].num<<"--->";
	}
	cout<<'\n'<<"已通过安全性测试!"<<endl;
	Allocate_Source();
}

void RUN(void){
	
    cout<<"*************************************************"<<'\n'<<"点击1执行!"
		<<'\n'<<"点击2退出!"
		<<'\n'<<"*************************************************"<<endl;
	cin>>flag;
	if(flag==2)
		exit(0);
	if(flag==1)
	{
	cout<<"开始扫描请求信息!"<<endl;
DWORD m_delay=3000;
	Sleep(m_delay);	
	if(Request_COURCE_NEMBER>Need[Request_PROCESS-1][Request_COURCE-1])
	{
		cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;
        cout<<"可是已超出该进程尚需的该类资源的最大数量,所以不予以分配!!"<<endl;
		exit(0);
	}
	if(Request_COURCE_NEMBER>Available[Request_COURCE-1])
	{
		cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;
        cout<<"可是系统中尚无足够的资源,所以进入等待队列!!"<<endl;
		exit(0);
	}
    else{
		Available[Request_COURCE-1]=Available[Request_COURCE-1]-Request_COURCE_NEMBER;
        Allocation[Request_PROCESS-1][Request_COURCE-1]=Allocation[Request_PROCESS-1][Request_COURCE-1]+Request_COURCE_NEMBER;
        Need[Request_PROCESS-1][Request_COURCE-1]=Need[Request_PROCESS-1][Request_COURCE-1]-Request_COURCE_NEMBER;
		cout<<"扫描通过"<<endl;
		Sleep(m_delay);	
		Test_Safty();
	}
	}
	else {
		cout<<"输入错误,请重新输入!"<<'\n';
		RUN();
	}
}



void main(void){
    Read_Initiate();	
	cout<<MAX_FACT_COURCE<<'\t';
	for(int i=0;i<MAX_FACT_COURCE;i++)
		cout<<Available[i]<<'\t';
	cout<<endl<<MAX_FACT_PROCESS<<endl;
	for(i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			cout<<Max[i][j]<<'\t';
		cout<<endl;	
	}
	DWORD m_delay=3000;
	Sleep(m_delay);	
	cout<<"读入成功"<<'\n';

	Allocated_list();
	for(i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			cout<<Allocation[i][j]<<'\t';
		cout<<endl;	
	}
	Sleep(m_delay);	
	cout<<"读入成功"<<'\n';

	Set_Need();
    for(i=0;i<MAX_FACT_PROCESS;i++){
		for(int j=0;j<MAX_FACT_COURCE;j++)
			cout<<Need[i][j]<<'\t';
		cout<<endl;	
	}
    Sleep(m_delay);	
	cout<<"设置成功"<<'\n';

    Read_Request();
	cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;
	cout<<'\n'<<"读入成功"<<'\n';
	
	RUN();
}

⌨️ 快捷键说明

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