睡眠理发师问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
睡眠理发师问题
1 #include<stdio.h>
2 #include<windows.h>
3#define random (rand()*10000)/RAND_MAX //⽤来产⽣随机数
4int main()
5 {
6int c;//沙发数
7int customers=0;//顾客数
8int count=0;//循环中⽤来计量的
9int w=0;//等候理发的⼈数
10int finish=0;//已经理完发的⼈数
11int work1=0,work2=0,work3=0;//理发师是否在⼯作
12int sleeping1=0,sleeping2=0,sleeping3=0; //理发师是否在休息
13char opendoor; //理发店是否开门接待顾客
14char 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
22while(opendoor!='y')
23 {
24 printf("对不起,理发店还没有开门!\n");
25 blank=getchar();
26 printf("是否营业?y/n\n");
27 opendoor=getchar();
28 }
29 printf("开门营业!\n");
30if(random%2)
31 {//刚开门时随机产⽣顾客,分有顾客和没顾客两种情况,若为真,则有顾客
32 Loop:for(count=0;random%2 && count<=5;count++)
33 {
34 customers++;
35 printf("第%d个顾客到来了。
\n",customers);
36 sleeping1=0; //设定理发师没有休息
37if(work1==1)
38 { //判断是否正为顾客理发,是则新来顾客等待,否则不⽤等待
39if(w<c) //判断是否有空沙发
40 {
41 printf("有%d张空沙发,顾客坐下等待。
\n",c-w);
42 w++;
43 }
44else
45 printf("没有空沙发,顾客离开。
\n");
46 }
47else
48 {
49 printf("A理发师为第%d个顾客理发。
\n",customers);
50 work1=1;
51 }
52 customers++;
53 printf("第%d个顾客到来了。
\n",customers);
54 sleeping2=0;//设定理发师不在打瞌睡状态
55
56if(work2==1)//判断是否正为顾客理发,是则新来顾客等待,否则不⽤等待
57 {
58if(w<c)//判断是否有空沙发
59 {
60 printf("有%d张空沙发,顾客坐下等待。
\n",c-w);
61 w++;
62 }
63else
64 printf("没有空沙发,顾客离开。
\n");
65 }
66else
67 {
68 printf("B理发师为第%d个顾客理发。
\n",customers);
69 work2=1;
70 }
71 customers++;
72 printf("第%d个顾客到来了。
\n",customers);
73 sleeping3=0;
74if(work3==1)
75 {//判断是否正为顾客理发,是则新来顾客等待,否则不⽤等待
76if(w<c) //判断是否有空沙发
77 {
78 printf("有%d把空沙发,顾客坐下等待。
\n",c-w);
79 w++;
80 }
81else
82 printf("没有空沙发,顾客离开。
\n");
83 }
84else
85 {
86 printf("C理发师为第%d个顾客理发。
\n",customers);
87 work3=1;
88 }
89 }
90if(work1==1)
91 {
92 Sleep(2000);//为⼀个顾客理发需要时间
93 printf("A理发完成。
\n");
94 work1=0;//理发完成,理发师空闲
95 finish++;//理发完⼈数加1
96 }
97if(work2==1)
98 {
99 Sleep(2000);//为⼀个顾客理发需要时间
100 printf("B理发完成。
\n");
101 work2=0;//理发完成,理发师空闲
102 finish++;//理发完⼈数加1
103 }
104if(work3=1)
105 {
106 Sleep(2000);//为⼀个顾客理发需要时间
107 printf("C理发完成。
\n");
108 work3=0;//理发完成,理发师空闲
109 finish++;//理发完⼈数加1
110 }
111if(finish>5)//完成为4个⼈理发的任务,询问理发师是否继续⼯作
112 {
113 printf("已经为%d位顾客理发了,还有%d个顾客在等待,是否继续⼯作?y/n\n",finish,w); 114 blank=getchar();
115 opendoor=getchar();
116if(opendoor=='n')
117 exit(0);
118 sleeping1=0;
119 sleeping2=0;
120 sleeping3=0;//继续⼯作
121 }
122if(w>0)//看看是否有⼈在等待理发
123 {
124 printf("有%d位顾客等待,A理发师继续为等待的顾客理发\n",w);
125 w--;
126 work1=1;//有则进⼊⼯作状态
127if(w>0)//看看是否有⼈在等待理发
128 {
129 printf("有%d位顾客等待,A理发师继续为等待的顾客理发\n",w);
130 w--;
131 work2=1;//有则进⼊⼯作状态
132if(w>0)//看看是否有⼈在等待理发
133 {
134 printf("有%d位顾客等待,A理发师继续为等待的顾客理发\n",w);
135 w--;
136 work1=1;//有则进⼊⼯作状态
137 }
138 }
139 }
140else
141 {
142if(sleeping1==0&&sleeping2==0&&sleeping3==0)
143 {
144 printf("没有顾客来理发,理发师坐在沙发上休息\n");
145 sleeping1=1;sleeping2=0;sleeping3==0;
146 }goto Loop;
147
148 }
149 }
150else
151 {
152if(sleeping1==0&&sleeping2==0&&sleeping3==0)
153 printf("没有顾客来理发,理发师坐在沙发上\n");
154 sleeping1=1;
155 sleeping2=0;
156 sleeping3=0;
157 }goto Loop;
158
159return0;
160 }。