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

📄 banker.cpp

📁 一个完整的多用户银行家算法
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>

#define N 5
struct bank
{
 char num[6];
 int max[4];
 int allocation[4];
 int need[4];
 int available[4];
 int work[4];
 int wa[4];
 char finish;
}bank[N];


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

 for(i=0;i<N;i++)
 finish1[i]=b;                                      /*置初值False */   

 for(i=0;i<N;i++)                                   /*输入进程的Max,Allocation值*/
 {
   printf("\nPlease Input data of course %d:\n",i);
   printf("Please Input the NO.:");
   scanf("%s",&bank[i].num);

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

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

   printf("\n");
  }

 for(i=0;i<N;i++)                               /*计算出进程的Need值*/
 {
   for(j=0;j<4;j++)
   bank[i].need[j]=bank[i].max[j]-bank[i].allocation[j];
  }

 for(j=0;j<4;j++)                                     /*输入Available值*/
  {
   printf("Please Enter the data of available %d:\n",j+1);
   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   D   A   B   C   D   A   B   C   D   A   B   C   D\n");

 for(i=0;i<N;i++)
 {
     printf("%5s",bank[i].num);
     for(j=0;j<4;j++)
     printf("%4d",bank[i].max[j]);
     for(j=0;j<4;j++)
     printf("%4d",bank[i].allocation[j]);
     for(j=0;j<4;j++)
     printf("%4d",bank[i].need[j]);
     if(i==0)
     { 
           for(j=0;j<4;j++)
	    printf("%4d",bank[i].available[j]);
	    printf("\n");
     }
     else
     {
         printf("\n");
     }
  }

 loop: 
 {
      printf("\n Which number of the course did the system request?\n");
      scanf("%d",&number);
      printf("\n");
 }

 for(j=0;j<4;j++)
 {
      printf("Please Enter the data of request %d:\n",j+1);
      scanf("%d",&request[j]);
 }
      
      q=0;                                        /*三类资源系统必须都满足*/
      for(j=0;j<4;j++)
      {
         if ((request[j]<=bank[number].need[j])&&(request[j]<=bank[0].available[j]))
	     q++;
         else
	     q+=0;
      }

      {                                          /*若三类资源系统都满足*/
        if(q==4)
	 {
          for(j=0;j<4;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   D   A   B   C   D   A   B   C   D   A   B   C   D\n");

	   for(i=0;i<N;i++)
	  {
            printf("%5s",bank[i].num);
	     for(j=0;j<4;j++)
	     printf("%4d",bank[i].max[j]);
	     for(j=0;j<4;j++)
	     printf("%4d",bank[i].allocation[j]);
	     for(j=0;j<4;j++)
	     printf("%4d",bank[i].need[j]);
	     if (i==0)
	     {  
              for(j=0;j<4;j++)
	       printf("%4d",bank[i].available[j]);
	       printf("\n");
	     }
	     else
	        printf("\n");
	  }


           for(j=0;j<4;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];
          bank[i].work[3]=work1[3];
	         work1[0]=work1[0]+bank[i].allocation[0];
       	     work1[1]=work1[1]+bank[i].allocation[1];
	         work1[2]=work1[2]+bank[i].allocation[2];
             work1[3]=work1[3]+bank[i].allocation[3];
		  finish1[i]=a;                   /*值为T则表示可行*/

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

		  m++;
	        }
	        else
	           continue;
	     }
	    t++;
	   }
            printf("\n");
	     {
              if (m==5)                  /*m值为5则表示系统处于安全状态*/
       	{
            printf("           Max             Allocation       Need           Available\n");
	        printf("   NO.  A   B   C   D   A   B   C   D   A   B   C   D   A   B   C   D\n");

		 for(k=0;k<N;k++)
		 {
                 p=record[k];
		   printf("%5s",bank[p].num);
		   for(j=0;j<4;j++)
		   printf("%4d",bank[p].work[j]);
		   for(j=0;j<4;j++)
		   printf("%4d",bank[p].need[j]);
		   for(j=0;j<4;j++)
		   printf("%4d",bank[p].allocation[j]);
		   for(j=0;j<4;j++)
		   printf("%5d",bank[p].wa[j]);
		   printf("%5c",bank[p].finish);
		   printf("\n");
		  }
                printf("\n");
                printf("\n");
                printf("The order is:");
		  for(k=0;k<N;k++)
		  printf("%d",record[k]);

	         printf("\n Contiune or Not(Y/N)?");
		  getchar();
		  S=getchar();
		  if(S=='N'||S=='n')
		  {
                  getchar();
		    exit(0);
                }
                else
                for(i=0;i<N;i++)
		  { 
                   finish1[i]=f[i];
		  }
                goto loop;

               }
	       else
		printf("The system is not safe to assign!");
		printf("\n Contiune or Not(Y/N)?");
		getchar();
		S=getchar();
		if(S=='N'||S=='n')
		{
                 getchar();
		    exit(0);
              }
		else
		{
                     printf("\nPlease Enter the request:\n");
                     for(j=0;j<4;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("\nOut the extent!");
	   printf("\n Contiune or Not(Y/N)?");
	   getchar();
	   S=getchar();
	   if (S=='N'||S=='n')
	   {
                    getchar();
                    exit(0);
	   }
	   else
	   {
             printf("\nPlease Rewrite the request\n");
	      goto loop;
          }
	 }
	 }
}

⌨️ 快捷键说明

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