C趣味程序百例(17)哪个大夫哪天值班
55.哪天哪个医生值班
医院里有A、B、C、D、E、F、G七个医生,他们每个人一周(周一到周日)会轮流值班一天。现在已知:
A医生比C医生晚一天值班;
D医生比E医生晚两天值班;
B医生比G医生早三天值班;
F医生的值日在B医生和C医生之间,是周四;
请确定每天哪个医生值班?
*问题分析与算法设计
从题目可以推导出以下已知条件:
*F周四值班;
*周一到周三B值班,三天后G值班;
*C周五到周六值班,A晚一天值班;
*E还有两天就要值班了;e .值班日期只能是周一至周三;
在编程中,数组元素的下标1到7用来表示周一到周日,数组元素的值用来分别表示A到F七个医生。
*程序和程序注释
# include
# include
int a[8];
char *day[]={ " "、"周一"、"周二"、"周三"、"周四"、
"周五"、"周六"、"周日" };/*建立周表*/
void main()
{
int I,j,t;
a[4]= 6;/*周四是F值班*/
for(I = 1;I {
a[I]= 2;/*假设B的值日日期*/
if(!a[I+3])a[I+3]= 7;/*如果三天后没人值班,安排G值班*/
else { a[I]= 0;继续;}/*否则,B的值日日期不断更改为*/
for(t = 1;t {
if(!a[t])a[t]= 5;/*如果当天没人值班,安排E值班*/
否则继续;
如果(!a[t+2])a[t+2]= 4;/*如果E值班两天没人管,应该是D */
else { a[t]= 0;继续;}/*否则E的值日日期错误*/
for(j = 5;j {
if(!a[j])a[j]= 3;/*如果当天没人值班,安排C值班*/
否则继续;
如果(!a[j+1])a[j+1]= 1;/* C无人值班的后一天,应该是A值班*/
else { A[j]= 0;继续;}/*否则A的值日日期不对*/
for(I = 1;i printf("医生%c值班% s . " n ",' A'+a[i]-1,day[I]);
退出(0);
}
}
}
*运行结果
E医生周一值班。(星期一:E)
B医生星期二值班。(星期二:b .医生d星期天值班。(星期三:D)f医生今天值班。(星期四:F)
G医生星期五值班。C医生星期六值班。A医生星期天值班。(星期日:A)
*思考问题
在解决这个问题的过程中,我们只考虑了一周内的情况,没有考虑跨周的情况。“B医生比G医生早三天值班”的条件,简单认为是同一周早三天。如果考虑跨周情况,可能会出现:B医生周一值班,而G医生上周周五值班。同样,“F医生的值日在B医生和C医生之间”的条件可以扩展为“只要F医生的值日在B医生和C医生之间”。
如果允许跨周,请考虑可能的日程安排。
0条评论