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 }