首页 > 技术文章 > 睡眠理发师问题

geziyu 2018-12-22 15:51 原文

  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("请输入理发店内沙发数量:\n");
 16     scanf("%d",&c);
 17     blank=getchar();
 18     printf("理发店内总共有%d张沙发。\n",c);
 19     printf("是否营业?y/n\n");
 20     opendoor=getchar();
 21     
 22     while(opendoor!='y')
 23     {
 24         printf("对不起,理发店还没有开门!\n");
 25         blank=getchar();
 26         printf("是否营业?y/n\n");
 27         opendoor=getchar();
 28     }
 29     printf("开门营业!\n");
 30     if(random%2)
 31     {//刚开门时随机产生顾客,分有顾客和没顾客两种情况,若为真,则有顾客
 32         Loop:for(count=0;random%2 && count<=5;count++)
 33         {    
 34             customers++;
 35             printf("第%d个顾客到来了。\n",customers);
 36             sleeping1=0;   //设定理发师没有休息
 37             if(work1==1)
 38             {             //判断是否正为顾客理发,是则新来顾客等待,否则不用等待
 39                 if(w<c)     //判断是否有空沙发
 40                 {
 41                     printf("有%d张空沙发,顾客坐下等待。\n",c-w);
 42                     w++;
 43                 }
 44                 else 
 45                     printf("没有空沙发,顾客离开。\n");
 46             }
 47             else
 48             {
 49                 printf("A理发师为第%d个顾客理发。\n",customers);
 50                 work1=1;    
 51             }
 52             customers++;
 53             printf("第%d个顾客到来了。\n",customers);
 54             sleeping2=0;//设定理发师不在打瞌睡状态
 55             
 56             if(work2==1)//判断是否正为顾客理发,是则新来顾客等待,否则不用等待
 57             {
 58                 if(w<c)//判断是否有空沙发
 59                 {
 60                     printf("有%d张空沙发,顾客坐下等待。\n",c-w);
 61                     w++;
 62                 }
 63                 else 
 64                     printf("没有空沙发,顾客离开。\n");
 65             }
 66             else 
 67             {
 68                 printf("B理发师为第%d个顾客理发。\n",customers);
 69                 work2=1;
 70             }
 71             customers++;
 72             printf("第%d个顾客到来了。\n",customers);
 73             sleeping3=0;
 74             if(work3==1)
 75             {//判断是否正为顾客理发,是则新来顾客等待,否则不用等待
 76                 if(w<c)   //判断是否有空沙发
 77                 {
 78                     printf("有%d把空沙发,顾客坐下等待。\n",c-w);
 79                     w++;    
 80                 }
 81                 else
 82                     printf("没有空沙发,顾客离开。\n");
 83             }
 84             else
 85             {
 86                 printf("C理发师为第%d个顾客理发。\n",customers);
 87                 work3=1;
 88             }
 89         }
 90         if(work1==1)
 91         {        
 92             Sleep(2000);//为一个顾客理发需要时间
 93             printf("A理发完成。\n");
 94             work1=0;//理发完成,理发师空闲
 95             finish++;//理发完人数加1
 96         }
 97         if(work2==1)
 98         {
 99             Sleep(2000);//为一个顾客理发需要时间
100             printf("B理发完成。\n");
101             work2=0;//理发完成,理发师空闲
102             finish++;//理发完人数加1
103         }
104         if(work3=1)
105         {
106         Sleep(2000);//为一个顾客理发需要时间
107         printf("C理发完成。\n");
108         work3=0;//理发完成,理发师空闲
109         finish++;//理发完人数加1
110         }
111         if(finish>5)//完成为4个人理发的任务,询问理发师是否继续工作
112         {
113             printf("已经为%d位顾客理发了,还有%d个顾客在等待,是否继续工作?y/n\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理发师继续为等待的顾客理发\n",w);
125             w--;
126             work1=1;//有则进入工作状态
127             if(w>0)//看看是否有人在等待理发
128             {
129                 printf("有%d位顾客等待,A理发师继续为等待的顾客理发\n",w);
130                 w--;
131                 work2=1;//有则进入工作状态
132                 if(w>0)//看看是否有人在等待理发
133                 {
134                     printf("有%d位顾客等待,A理发师继续为等待的顾客理发\n",w);
135                     w--;
136                     work1=1;//有则进入工作状态
137                 }
138             }
139         }
140         else
141         {
142             if(sleeping1==0&&sleeping2==0&&sleeping3==0)
143             {
144                 printf("没有顾客来理发,理发师坐在沙发上休息\n");
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("没有顾客来理发,理发师坐在沙发上\n");
154             sleeping1=1;
155             sleeping2=0;
156             sleeping3=0;
157         }goto Loop;
158         
159     return 0;
160 }

 

推荐阅读