• 睡眠理发师问题


      1 #include<stdio.h>
      2 #include<windows.h>
      3 #define random (rand()*10000)/RAND_MAX //用来产生随机数
      4 int main()
      5 {
      6     int c;//沙发数
      7     int customers=0;//顾客数
      8     int count=0;//循环中用来计量的
      9     int w=0;//等候理发的人数
     10     int finish=0;//已经理完发的人数
     11     int work1=0,work2=0,work3=0;//理发师是否在工作
     12     int sleeping1=0,sleeping2=0,sleeping3=0;     //理发师是否在休息
     13     char opendoor;       //理发店是否开门接待顾客
     14     char blank;          //获取空白字符
     15     printf("请输入理发店内沙发数量:
    ");
     16     scanf("%d",&c);
     17     blank=getchar();
     18     printf("理发店内总共有%d张沙发。
    ",c);
     19     printf("是否营业?y/n
    ");
     20     opendoor=getchar();
     21     
     22     while(opendoor!='y')
     23     {
     24         printf("对不起,理发店还没有开门!
    ");
     25         blank=getchar();
     26         printf("是否营业?y/n
    ");
     27         opendoor=getchar();
     28     }
     29     printf("开门营业!
    ");
     30     if(random%2)
     31     {//刚开门时随机产生顾客,分有顾客和没顾客两种情况,若为真,则有顾客
     32         Loop:for(count=0;random%2 && count<=5;count++)
     33         {    
     34             customers++;
     35             printf("第%d个顾客到来了。
    ",customers);
     36             sleeping1=0;   //设定理发师没有休息
     37             if(work1==1)
     38             {             //判断是否正为顾客理发,是则新来顾客等待,否则不用等待
     39                 if(w<c)     //判断是否有空沙发
     40                 {
     41                     printf("有%d张空沙发,顾客坐下等待。
    ",c-w);
     42                     w++;
     43                 }
     44                 else 
     45                     printf("没有空沙发,顾客离开。
    ");
     46             }
     47             else
     48             {
     49                 printf("A理发师为第%d个顾客理发。
    ",customers);
     50                 work1=1;    
     51             }
     52             customers++;
     53             printf("第%d个顾客到来了。
    ",customers);
     54             sleeping2=0;//设定理发师不在打瞌睡状态
     55             
     56             if(work2==1)//判断是否正为顾客理发,是则新来顾客等待,否则不用等待
     57             {
     58                 if(w<c)//判断是否有空沙发
     59                 {
     60                     printf("有%d张空沙发,顾客坐下等待。
    ",c-w);
     61                     w++;
     62                 }
     63                 else 
     64                     printf("没有空沙发,顾客离开。
    ");
     65             }
     66             else 
     67             {
     68                 printf("B理发师为第%d个顾客理发。
    ",customers);
     69                 work2=1;
     70             }
     71             customers++;
     72             printf("第%d个顾客到来了。
    ",customers);
     73             sleeping3=0;
     74             if(work3==1)
     75             {//判断是否正为顾客理发,是则新来顾客等待,否则不用等待
     76                 if(w<c)   //判断是否有空沙发
     77                 {
     78                     printf("有%d把空沙发,顾客坐下等待。
    ",c-w);
     79                     w++;    
     80                 }
     81                 else
     82                     printf("没有空沙发,顾客离开。
    ");
     83             }
     84             else
     85             {
     86                 printf("C理发师为第%d个顾客理发。
    ",customers);
     87                 work3=1;
     88             }
     89         }
     90         if(work1==1)
     91         {        
     92             Sleep(2000);//为一个顾客理发需要时间
     93             printf("A理发完成。
    ");
     94             work1=0;//理发完成,理发师空闲
     95             finish++;//理发完人数加1
     96         }
     97         if(work2==1)
     98         {
     99             Sleep(2000);//为一个顾客理发需要时间
    100             printf("B理发完成。
    ");
    101             work2=0;//理发完成,理发师空闲
    102             finish++;//理发完人数加1
    103         }
    104         if(work3=1)
    105         {
    106         Sleep(2000);//为一个顾客理发需要时间
    107         printf("C理发完成。
    ");
    108         work3=0;//理发完成,理发师空闲
    109         finish++;//理发完人数加1
    110         }
    111         if(finish>5)//完成为4个人理发的任务,询问理发师是否继续工作
    112         {
    113             printf("已经为%d位顾客理发了,还有%d个顾客在等待,是否继续工作?y/n
    ",finish,w);
    114             blank=getchar();
    115             opendoor=getchar();
    116             if(opendoor=='n')
    117                 exit(0);
    118             sleeping1=0;
    119             sleeping2=0;
    120             sleeping3=0;//继续工作
    121         }
    122         if(w>0)//看看是否有人在等待理发
    123         {
    124             printf("有%d位顾客等待,A理发师继续为等待的顾客理发
    ",w);
    125             w--;
    126             work1=1;//有则进入工作状态
    127             if(w>0)//看看是否有人在等待理发
    128             {
    129                 printf("有%d位顾客等待,A理发师继续为等待的顾客理发
    ",w);
    130                 w--;
    131                 work2=1;//有则进入工作状态
    132                 if(w>0)//看看是否有人在等待理发
    133                 {
    134                     printf("有%d位顾客等待,A理发师继续为等待的顾客理发
    ",w);
    135                     w--;
    136                     work1=1;//有则进入工作状态
    137                 }
    138             }
    139         }
    140         else
    141         {
    142             if(sleeping1==0&&sleeping2==0&&sleeping3==0)
    143             {
    144                 printf("没有顾客来理发,理发师坐在沙发上休息
    ");
    145                 sleeping1=1;sleeping2=0;sleeping3==0;
    146             }goto Loop;
    147         
    148         }
    149     }
    150         else
    151         {
    152             if(sleeping1==0&&sleeping2==0&&sleeping3==0)
    153             printf("没有顾客来理发,理发师坐在沙发上
    ");
    154             sleeping1=1;
    155             sleeping2=0;
    156             sleeping3=0;
    157         }goto Loop;
    158         
    159     return 0;
    160 }
  • 相关阅读:
    Redis基本数据结构总结之SET、ZSET和HASH
    C# .Net计算函数执行的时间
    千万级规模高性能、高并发的网络架构经验分享
    c#单元测试:使用Moq框架Mock对象
    spring bean的构造器参数
    Java并发编程:ThreadLocal
    redis过期策略
    JAVA线程的生命周期状态
    jdk1.8新特性之Optional
    对Java中interrupt、interrupted和isInterrupted的理解
  • 原文地址:https://www.cnblogs.com/geziyu/p/10161334.html
Copyright © 2020-2023  润新知