![]() ![]() |
|
C趣味程序百例(17)哪个大夫哪天值班 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 13:59:07 文章录入:杜斌 责任编辑:杜斌 | |
|
|
医院有A、B、C、D、E、F、G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天。现在已知: A大夫比C大夫晚一天值班; D大夫比E大夫晚二天值班; B大夫比G大夫早三天值班; F大夫的值班日在B和C大夫的中间,且是星期四; 请确定每天究竟是哪位大夫值班? *问题分析与算法设计 由题目可推出如下已知条件: *F是星期四值班; *B值班的日期在星期一至星期三,且三天后是G值班; *C值班的日期在星期五至星期六,且一天后是A值班; *E两天后是D值班;E值班的日期只能在星期一至星期三; 在编程时用数组元素的下标1到7表示星期一到星期天,用数组元素的值分别表示A~F七位大夫。 *程序与程序注释 #include<stdio.h> #include<stdlib.h> int a[8]; char *day[]={"","MONDAY","TUESDAY","WEDNESDAY","THURSDAYT", "FRIDAY","SATUDAY","SUNDAY"}; /*建 立星期表*/ void main() { int i,j,t; a[4]=6; /*星期四是F值班*/ for(i=1;i<=3;i++) { a[i]=2; /*假设B值班的日期*/ if(!a[i+3]) a[i+3]=7; /*若三天后无人值班则安排G值班*/ else{ a[i]=0;continue;} /*否则B值班的日期不断对*/ for(t=1;t<=3;t++) /*假设E值班的时间*/ { if(!a[t]) a[t]=5; /*若当天无人值班则安排E值班*/ else continue; if(!a[t+2]) a[t+2]=4; /*若E值班两天后无人值班则应为D*/ else{ a[t]=0;continue;} /*否则E值班的日期不对*/ for(j=5;j<7;j++) { if(!a[j]) a[j]=3; /*若当天无人值班,则安排C值班*/ else continue; if(!a[j+1]) a[j+1]=1; /*C之后一天无人值班则应当是A值班*/ else{ a[j]=0;continue;} /*否则A值班日期不对*/ for(i=1;i<=7;i++) /*安排完毕,输出结果*/ printf("Doctor %c is on duty %s.\n",’A’+a[i]-1,day[i]);
exit(0); } } } } *运行结果 Doctor E is on duty MONDAY. (星期一:E) Doctor B is on duty TUESDAY. (星期二:B) Doctor D is on duty WEDNESDAY. (星期三:D) Doctor F is on duty THUESDAY. (星期四:F) Doctor G is on duty FRIDAY. (星期五:G) Doctor C is on duty SATURDAY. (星期六:C) Doctor A is on duty SUNDAY. (星期日:A) *思考题 在本题的求解过程中,我们只考虑了一星期之内的情况,没有考虑跨周的情况。对于“B大夫比G大夫早三天值班的”条件只是简单的认为是在同一周内早三天。若考虑跨周的情况就可能出现:B大夫星期一值班,而G大夫是上周的星期五。同样,对“F大夫的值班日在B和C大夫的中间”这个条件,也可以扩展为:“只要F大夫的值班日在B和C大夫的中间就可以”。 请考虑允许跨周的情况下,可能的时间安排表。 |
|
![]() ![]() |