zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

C语言算法 实现 注释 银行家
2023-06-13 09:11:27 时间

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

银行家算法 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.cn/142965.html原文链接:https://javaforall.cn