银行家算法 C语言实现 带注释

银行家算法 C语言实现 带注释银行家算法C语言实现带注释加粗样式****在这里插入代码片#include<stdio.h>#defineM100#defineN50///定义M个进程,N类资源voidInit();boolcheckSecurity(int);voidshow();intBank(int);intAvailable[M];///可利用资源数组intMax[N][M];///最大需求矩阵intAllocation[N][M];///

大家好,又见面了,我是你们的朋友全栈君。

银行家算法 C语言实现 带注释加粗样式****

在这里插入代码片#include <stdio.h>
#define M 100
#define N 50 ///定义M个进程,N类资源
void Init();
bool checkSecurity (int);
void show();
int Bank(int);
int Available[M];       ///可利用资源数组
int Max[N][M];   ///最大需求矩阵
int Allocation[N][M];  ///分配矩阵
int Need[N][M];        ///需求矩阵
int Request[N][M];   /**M个进程还需要N类资源的资源量*/
bool Finish[N];
int p[N];
int m,n;   ///M个进程,N类资源
int main (void)
{ 
   
	int i;
	int Flag0 = 0;
	int Flag1 = 1;
	printf("O(∩_∩)O 您好!欢迎使用本系统! O(∩_∩)O\n");
	Init ();
	while(1)
	{ 
   

	printf(" 1 --> /****************银行家算法***********/\n");
	printf(" 2 --> /****************死锁检测*************/\n") ;
	printf(" 3 --> /****************退出本次实验*********/\n");
	printf(" 请输入相应的数字来选择你要进行的操做(注意只能输入1,2,3中的一个,否则将输出error):");

	scanf("%d",&i);

	/*switch(i) { case 1: Bank(Flag0); break; case 2: checkSecurity (Flag1); break; case 3: C }*/
	if(i==1)
    { 
   
        Bank(Flag0);
        break;
    }
    else if(i==2)
    { 
   
        checkSecurity (Flag1);
		break;
    }
    else if(i==3)
    { 
   
        return 0;
    }
    else
    { 
   
        printf("error (输入错误 请重新输入)\n");
    }
	}
}
/****************初始化算法***************************/
void Init()
{ 
   
	int i,j;
	printf ("请输入进程的数目并按回车:\n");
	scanf ("%d",&m);
	printf ("请输入资源的种类:\n");
	scanf ("%d",&n);
	printf ("请输入每个进程对资源的最大需求量,按照[%d*%d]矩阵输入(构建 Max 矩阵):\n",m,n);
	 for (i=0;i<m;++i)
	  { 
   
	  	for (j=0;j<n;++j)
	  	 scanf ("%d",&Max[i][j]);
	  }
	printf ("请输入每个进程已经分配的各类资源数量,按照[%d*%d]矩阵输入(构建 Allocation 矩阵):\n",m,n);
	  for (i=0;i<m;++i)
	  { 
   
	  	for (j=0;j<n;++j)
	  	  { 
   
		    scanf ("%d",&Allocation[i][j]);

	       }
	     }
	 printf ("获得 Need 矩阵的值为:\n");
	 { 
   
	 	 for (i=0;i<m;++i)
	 	 { 
   
	 	 	for (j=0;j<n;++j)
	 	 	{ 
   
	 	 		Need[i][j] = Max[i][j]-Allocation[i][j];
	 	 	    printf ("%d ",Need[i][j]);
			}
			printf ("\n");

	  	    if (Need[i][j]<0)
	       { 
   
			  printf ("第%d行第%d个资源错误,请重新输入:\n",i+1,j+1);
	         j--;
	         continue;
		  }
	     }

	  }

	printf ("请输入各类资源剩余量:\n");
	 for (i=0;i<n;++i)
	  scanf ("%d",&Available[i]);

	printf ("进程的全部信息如下:\n");
	printf ("进程名\tMax\t\tAllocation\tNeed\n");
	for (int i=0;i<m;++i)
	{ 
   
		printf ("P%d\t",i);
		for (int j=0;j<n;++j)
		{ 
   
			printf ("%d ",Max[i][j]);
		}
		printf ("\t");
			for (int j=0;j<n;++j)
		{ 
   
			printf ("%d ",Allocation[i][j]);
		}
		printf ("\t");
			for (int j=0;j<n;++j)
		{ 
   
			printf ("%d ",Need[i][j]);
		}
		printf ("\n");
	}
	printf ("目前可利用的资源量 Available:\n");
	for (int i=0;i<n;i++)
	{ 
   
		printf ("%d ",Available[i]);
	}
	printf ("\n");
 }
/*****************安全性检测算法****************/
bool checkSecurity (int Flag)
{ 
   
	int i,j,k,l=0;
	int Work[100];///可以用的资源数组;
	for (i=0;i<n;++i)
	{ 
   
		Work[i] = Available[i];///赋初值
	}
	for (i=0;i<m;++i)
	{ 
   
		Finish[i]=false;///Finish 记录每个进程是否安全
    }

	for (i=0;i<m;++i)
	{ 
   
		if (Finish[i]==true)
		  continue;
		else
		 { 
   
			for (j=0;j<n;++j)/**循环查找第i个进程所需的各个资源数是否超过系统现有的第j个资源数*/
	     	{ 
   
		     	if (Need[i][j]>Work[j])/**如果第i个进程所需的第j个资源数超过系统现有的第j个资源数,则拒绝申请*/
			 	 	break;
		    }

			if (j == n)/**如果第i个进程所需的各个资源数没有超过系统现有的资源数*/
		 	{ 
   
		    	Finish[i]=true;
		    	for (k=0;k<n;++k)
		       		Work[k]=Work[k]+Allocation[i][k];/**将第i个进程各个已分配资源数+系统有的对应资源数赋值给Work*/
		    	p[l++]=i;
		    	 i=-1;///记录进程号;
	      	}
			else ///如果超过则继续循环执行下一个过程
		 	{ 
   
				continue;
			}
		}

        if (Flag==0)
		{ 
   
			if (l == m)/**如果所有的进程都能够被满足运行时*/
		    { 
   
				printf ("系统是安全的!\n");
				printf ("安全序列为:\n");
				for (i=0;i<l;++i)///显示资源分配给进程的顺序;
				{ 
   
					printf ("%d",p[i]);
					if(i != l-1)///输出箭头
					printf ("-->");
				}
				printf ("\n");
				return true;
			}
			else
			{ 
   
			    printf ("系统是不安全的!\n");
	            return false;
			}

		}
		else if (Flag==1)
		{ 
   
			show ();
		}


    }//for循环
	    return 0;
}
/******************银行家算法的实现********************/
int Bank(int Flag)
{ 
   

   while (1)
    { 
   
		int mi,i;
		printf ("请输入要申请资源的进程号: (第一个进程号为0,第二个进程号为1,以此类推)\n");
		scanf ("%d",&mi);
		printf ("请输入进程所请求得各个资源的数量:\n");
		for (i=0;i<n;++i)
	     { 
   
			scanf ("%d",&Request[mi][i]);
		 }
		for (i=0;i<n;++i)
		 { 
   
			if (Request[mi][i]>Need[mi][i])
			 { 
   
				printf ("所请求的资源超过进程进程的需求量!\n");
				return 0;
			 }
			if (Request[mi][i]>Available[i])
			 { 
   
				printf ("所请求的资源超过系统现有的资源数!\n");
				return 0;
			 }

		 }
		for (i=0;i<n;++i)
		 { 
   
			if ( Request[mi][i] <= Need[mi][i] && Request[mi][i] <= Available[i] )
			 { 
   
				Available[i] = Available[i]-Request[mi][i];
				Allocation[mi][i] = Allocation[mi][i]+Request[mi][i];
				Need[mi][i] = Need[mi][i]-Request[mi][i];
			 }
			if (checkSecurity (Flag))
			 { 
   
				printf ("同意您的分配请求!\n");
			 }
			else
			 { 
   
				printf ("您的请求被拒绝!\n");
				for (i=0;i<n;++i)
				 { 
   
				   Available[i] = Available[i]-Request[mi][i];
			  	   Allocation[mi][i] = Allocation[mi][i]+Request[mi][i];
				   Need[mi][i] = Need[mi][i]-Request[mi][i];
				 }
			 }
			for (i=0;i<m;i++)
			 { 
   
			 	 Finish[i]=false;
			 }

			char Fl;/**设置一个标志位*/
			printf ("是否再次请求分配?是请按Y/有,否请按N/n\n");
			while(1)
			 { 
   
				scanf ("%c\n",&Fl);
				if (Fl == 'Y'||Fl == 'y'||Fl == 'N'||Fl == 'n')
				 break;
				else
				 { 
   
					printf ("请重新输入:\n");
					continue;
				 }
			 }
			 if (Fl == 'Y'||Fl == 'y')
			   continue;
			else
			   break;
	 }
   }
}
void show()
{ 
   
	int i;
	for(i=0;i<m;i++) /**当前系统可满足%d进程的需求,分配资源给该进程。进程运行结束后,系统收回该进程%d的资源。*/
		printf("第%d步,删除进程%d的边\n",i+1,p[i]);
	printf ("当前环境不会发生死锁!\n");
}



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142965.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • J2me开发大致框架「建议收藏」

    J2me开发大致框架「建议收藏」J2me开发名目繁多.但大致框架还算有规律可寻,我根据开发经验给大家提点意见,做下总结:游戏的结构很多,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2me的程序一般都包含两个class文件,一个是MIDlet,一个是Displayable。一般我都是把游戏的主要代码放在Displayable这个类里面。这个类是基

    2022年7月27日
    6
  • Redis 安装

    Redis 安装

    2021年10月16日
    35
  • python字符串的使用方法_python输入字符串str

    python字符串的使用方法_python输入字符串strpython字符串常用方法find(sub[,start[,end]])在索引start和end之间查找字符串sub​找到,则返回最左端的索引值,未找到,则返回-1​start和end都可

    2022年7月28日
    2
  • 基于51单片机的交通灯控制系统设计开题报告_交通灯控制系统设计的毕业论文

    基于51单片机的交通灯控制系统设计开题报告_交通灯控制系统设计的毕业论文摘要交通灯是生活中的重要系统。本设计为基于51单片机交通灯系统的设计,采用模块化、层次化设计。运用单片机AT89C51进行数据的分析和处理,为显示提供信号,显示部分采用8位数码管显示倒计时值。系统电路简单、集成度高、工作稳定、调试方便、检测精度高,具有一定的实用价值。【关键词】AT89C518位数码管发光二级管按键

    2022年9月25日
    1
  • pycharm怎么配置django环境_pycharm环境搭建

    pycharm怎么配置django环境_pycharm环境搭建用Pycharm安装配置Django框架1.打开Pycharm—–左下角—-Terminal命令行 pipinstalldjango#默认下载最新版本django框架 pipinstalldjango==1.11.8#可以下载自己所需的指定版本 pipshowdjangoversion#查看自己当前的django框架版本可能下载的途中会出现如下错…

    2022年8月25日
    8
  • CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿

    CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿安装以太坊源码,即安装GoEthereum(安装Geth)1、安装Golang可以直接使用yum这个包管理器安装Golangyuminstallgolang2、下载以太坊源码(GoEthereum)首先下载geth源码go-ethereum,这里以go-ethereum-1.9.7.tar.gz,直接在GitHub下载3、安装以太坊源码(安装Geth)接下来解压源码:tar-xzfgo-ethereum-1.9.7.tar.gz用下…

    2022年8月31日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号