• 银行家算法


      1 #include<iostream>
      2 #include<cstring>
      3 #include<cstdio>
      4 using namespace std;
      5 int work,progress,available[100],mmax[100][100],allocation[100][100],need[100][100];
      6 int p[100];
      7 void init()
      8 {
      9    int i,j;
     10    printf("请输入多少系统资源数
    ");
     11    scanf("%d",&work);
     12    printf("请输入总共有多少进程
    ");
     13    scanf("%d",&progress);
     14    for(i=1;i<=work;i++)
     15    {
     16        printf("第%d类资源有的资源实例:",i);
     17        scanf("%d",&available[i]);
     18    }
     19    for(i=1;i<=progress;i++)
     20      for(j=1;j<=work;j++)
     21      {
     22         printf("进程p[%d]当前分配第%d类资源数: ",i,j);
     23         scanf("%d",&allocation[i][j]);
     24      }
     25      int sum;
     26      for(j=1;j<=work;j++)
     27      {
     28             sum=0;
     29          for(i=1;i<=progress;i++)
     30          {
     31              sum+=allocation[i][j];
     32 
     33          }
     34           available[j]-=sum;
     35      }
     36     for(i=1;i<=progress;i++)
     37      for(j=1;j<=work;j++)
     38      {
     39          printf("进程p[%d]对第%d类资源的最大需求量: ",i,j);
     40          scanf("%d",&mmax[i][j]);
     41      }
     42    for(i=1;i<=progress;i++)
     43      for(j=1;j<=work;j++)
     44      {
     45          need[i][j]=mmax[i][j]-allocation[i][j];
     46      }
     47      printf("当前的状态:
    ");
     48      printf("           Max        Allocation      Need
    ");
     49      printf("进程");
     50      for(i=1;i<=3;i++)
     51      {
     52          for(j=1;j<=work;j++)
     53              printf("  %d类",j);
     54      }
     55      for(i=1;i<=progress;i++)
     56      {
     57       printf("
    P[%d]",i);
     58         for(j=1; j<=work; j++)
     59         {
     60             printf("   %d ",mmax[i][j]);
     61         }
     62         for(j=1; j<=work; j++)
     63         {
     64             printf("   %d ",allocation[i][j]);
     65         }
     66         for(j=1; j<=work; j++)
     67         {
     68             printf("   %d ",need[i][j]);
     69         }
     70      }
     71       printf("
    
    系统剩余资源量:   ");
     72       for(i=1; i<=work; i++)
     73       {
     74         printf("   %d ",available[i]);
     75       }
     76      printf("
    ");
     77 }
     78 bool safe()
     79 {
     80   int w[100],finish[100],i,j,k,l=0;
     81    memset(finish,0,sizeof(finish));
     82    for(i=1;i<=work;i++)
     83       w[i]=available[i];
     84       printf("
    ");
     85     for(i=1;i<=progress;i++)
     86     {
     87         if(finish[i]==1)
     88              continue;
     89         for(j=1;j<=work;j++)
     90           {
     91             if(need[i][j]>w[j])
     92                 break;
     93           }
     94          if(j==work+1)
     95            {
     96                 finish[i]=1;
     97                 for(k=1;k<=work;k++)
     98                    w[k]+=allocation[i][k];
     99                  p[l++]=i;
    100                  i=0;
    101            }
    102          else
    103            continue;
    104      if(l==progress)
    105        {
    106         printf("系统是安全的
    ");
    107         printf("安全序列:
    ");
    108         for(i=0;i<l;i++)
    109         {
    110            printf("%d",p[i]);
    111            if(i!=l-1) //最后一项不输-->
    112              {
    113               printf("-->");
    114              }
    115          }
    116        printf("""
    ");
    117      return true;
    118       }
    119    }
    120   printf("系统是不安全的
    ");
    121     return false;
    122 }
    123 void  Request()
    124 {
    125     int m,i,request[100],flag=0,j;
    126     printf("请输入申请资源的进程:");
    127        scanf("%d",&m);
    128      for(i=1;i<=work;i++)
    129        {
    130           printf("请输入进程p[%d]对%d类资源的申请量:",m,i);
    131           scanf("%d",&request[i]);
    132           }
    133       for(j=1;j<=work;j++)
    134       {
    135           if(request[j]>need[m][j])
    136           {
    137              flag=1;
    138           }
    139       }
    140       if(flag)
    141           printf("请求的资源数超过了需求的最大值
    ");
    142       else
    143       {
    144         for(j=1;j<=work;j++)
    145           if(request[j]>available[j])
    146               flag=1;
    147           if(flag)
    148               printf("尚无足够资源,P[%d]须等待
    ",m);
    149           else
    150           {
    151             for(j=1;j<=work;j++)
    152             {
    153                 available[j]=available[j]-request[j];
    154                 allocation[m][j]=allocation[m][j]+request[j];
    155                 need[m][j]=need[m][j]-request[j];
    156             }
    157              printf("
    ");
    158              if(safe())
    159                 {
    160                     printf("可以分配给进程p[%d]
    ",m);
    161                 }
    162               else
    163               {
    164                   printf("aaa
    ");
    165                   printf("让进程p[%d]等待",m);
    166                   for(j=1;j<=work;j++)
    167                   {
    168                   available[j]=available[j]+request[j];
    169                   allocation[m][j]=allocation[m][j]-request[j];
    170                   need[m][j]=need[m][j]+request[j];
    171                   }
    172               }
    173           }
    174       }
    175 
    176 }
    177 int main()
    178 {
    179     int cas;
    180      printf("★★★★★★★★欢迎使用本程序★★★★★★★★
    ");
    181      printf("
    
    ");
    182       init();
    183       for(;;)
    184       {
    185         Request();
    186         printf("输入0程序运行结束,输入其他继续执行");
    187         scanf("%d",&cas);
    188         if(cas==0)
    189             break;
    190       }
    191        return 0;
    192 }
  • 相关阅读:
    【NOIp】NOIp2015
    【题解】Luogu P2899 [USACO008JAN] 手机网络 树形dp
    「EZEC-4.5」走方格
    ZJOI2013 K大数查询
    CF765F Souvenirs
    [Vani有约会] 雨天的尾巴 /【模板】线段树合并
    中国剩余定理(CRT / EXCRT)
    洛谷 P1516 青蛙的约会
    CQOI2009 叶子的染色
    CSP2019 Emiya 家今天的饭
  • 原文地址:https://www.cnblogs.com/cancangood/p/4099468.html
Copyright © 2020-2023  润新知