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

📄 银行家算法程序.txt

📁 操作系统小程序--银行家算法
💻 TXT
字号:
#include <stdio.h>
#define N 5

struct bank                     //定义数结构体
{char num[6];                   //进程编号
 int max[3];                    //最大需求矩阵
 int allocation[3];             //分配矩阵
 int need[3];                   //需求矩阵
 int available[3];              //可利用资源向量
 int work[3];                   //工作向量
 int wa[3];                     // work+allocation
 char finish;
}bank[N];

main()
{int i,j,k,number,p,t;
 int request[3];
 char h;
 char a='T';
 char b='F';
 int q=0;
 char finish1[5];
 int m;
 int record[5];
 int work1[3];
 char f[5];

 for(i=0;i<N;i++)
 finish1[i]=b;

 for(i=0;i<N;i++)
  {printf("\nInput data of bank %d:\n",i);
   printf("NO.:");
   scanf("%s",&bank[i].num);

   for(j=0;j<3;j++)
   {printf("max %d:\n",j+1);
    scanf("%d",&bank[i].max[j]);}

   for(j=0;j<3;j++)
   {printf("allocation %d:\n",j+1);
    scanf("%d",&bank[i].allocation[j]);}

   printf("\n");}

 for(i=0;i<N;i++)
  {for(j=0;j<3;j++)
   bank[i].need[j]=bank[i].max[j]-bank[i].allocation[j];}
//得到需求量
 for(j=0;j<3;j++)
  {printf("enter data of available:\n");
   scanf("%d",&bank[0].available[j]);}

 for(i=0;i<N;i++)
  {f[i]=finish1[i];}

 printf("        max      allocation    need      available\n");
 printf(" NO.  A   B   C   A   B   C   A   B   C   A   B   C\n");

 for(i=0;i<N;i++)
    {printf("%5s",bank[i].num);
     for(j=0;j<3;j++)
     printf("%4d",bank[i].max[j]);
     for(j=0;j<3;j++)
     printf("%4d",bank[i].allocation[j]);
     for(j=0;j<3;j++)
     printf("%4d",bank[i].need[j]);
     if(i==0)
       {for(j=0;j<3;j++)
	     printf("%4d",bank[i].available[j]);
	     printf("\n");}
     else
       {printf("\n");}
    }                           //输出资源分配表

 loop: {printf("\n which number of request?\n"); 
       scanf("%d",&number);
       printf("\n");}

      for(j=0;j<3;j++)
      {printf("enter data of request %d:\n",j+1);
       scanf("%d",&request[j]);}   //输入请求资源进程号

      q=0;
      for(j=0;j<3;j++)
{if((request[j]<=bank[number].need[j])&&(request[j]<=bank[0].available[j]))
	  q++;
       else
	  q+=0;}

      {if (q==3)
	 {for(j=0;j<3;j++)
	   {bank[number].need[j]=bank[number].need[j]-request[j];
	    bank[0].available[j]=bank[0].available[j]-request[j];
	bank[number].allocation[j]=bank[number].allocation[j]+request[j];}   //安全检测

	   printf("    max      allocation    need      available\n");
	   printf("NO. A  B  C  A  B  C   A   B   C   A   B   C\n");

	   for(i=0;i<N;i++)
	  {printf("%5s",bank[i].num);
	   for(j=0;j<3;j++)
	   printf("%4d",bank[i].max[j]);
	   for(j=0;j<3;j++)
	   printf("%4d",bank[i].allocation[j]);
	   for(j=0;j<3;j++)
	   printf("%4d",bank[i].need[j]);
	   if (i==0)
	      {for(j=0;j<3;j++)
	       printf("%4d",bank[i].available[j]);
	       printf("\n");}
	   else
	      printf("\n");
	  }//请求资源分配后的资源分配表

           for(j=0;j<3;j++)
	   {work1[j]=bank[0].available[j];}

     m=0;
	  t=0;
	  while (t<5)
	   {for(i=0;i<5;i++)
	{if((work1[0]>=bank[i].need[0])&&(work1[1]>=bank[i].need[1])&&(work1[2]>=bank[i].need[2])&&(finish1[i]==b))
	       {record[m]=i;
		     bank[i].work[0]=work1[0];
		     bank[i].work[1]=work1[1];
		     bank[i].work[2]=work1[2];

	        work1[0]=work1[0]+bank[i].allocation[0];
       	 work1[1]=work1[1]+bank[i].allocation[1];
	        work1[2]=work1[2]+bank[i].allocation[2];

		    finish1[i]=a;

		bank[i].wa[0]=work1[0];
	    	bank[i].wa[1]=work1[1];
		    bank[i].wa[2]=work1[2];

		    bank[i].finish=finish1[i];

		   m++; }
	      else
	       continue;
	     }
	    t++;}  //安全算法

	  printf("\n");
	     {if (m==5)
{printf("   work   need   allocation   work+alloct   finish\n");
printf("NO.  A  B  C   A  B  C   A  B  C   A  B  C   \n");

		for(k=0;k<N;k++)
		  {p=record[k];
		   printf("%5s",bank[p].num);
		   for(j=0;j<3;j++)
		   printf("%4d",bank[p].work[j]);
		   for(j=0;j<3;j++)
		   printf("%4d",bank[p].need[j]);
		   for(j=0;j<3;j++)
		   printf("%4d",bank[p].allocation[j]);
		   for(j=0;j<3;j++)
		   printf("%4d",bank[p].wa[j]);
		   printf("%4c",bank[p].finish);
		   printf("\n");}  //输出申请资源时的安全性检查表

		  for(k=0;k<N;k++)
		  printf("%4d",record[k]);  //安全序列输出
printf("\n Contiune or not(Y/N)?");
		  getchar();
		  h=getchar();
		  if (h=='N'||h=='n')
		     {getchar();
		      exit(0);
        else
           for(i=0;i<N;i++)
		    {finish1[i]=f[i];}
            goto loop;
  }  //选择继续或选择退出
	    else
		printf("it is not safe to assign");
		printf("\n Contiune or not(Y/N)?");
		getchar();
		h=getchar();
		if (h=='N'||h=='n')
		   {getchar();
		    exit(0);}
		else
		   {printf("\n  Enter the request\n");
for(j=0;j<3;j++)
	       {bank[number].need[j]=bank[number].need[j]+request[j];
	        bank[0].available[j]=bank[0].available[j]+request[j];
bank[number].allocation[j]=bank[number].allocation[j]-request[j];
	                          }//恢复判断前的原始数据
for(i=0;i<N;i++)
		    {finish1[i]=f[i];}

		    goto loop;
		}}}
	   else
	 {printf("\n Waring: Out the extent!");
	   printf("\n Contiune or not(Y/N)?");
	   getchar();
	   h=getchar();
	   if (h=='N'||h=='n')
	      {getchar();
          exit(0);  }
	   else
	      {printf("\n  Rewrite the request\n");
	      goto loop;  }//判断选择继续或退出
	 }}} 

⌨️ 快捷键说明

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