打印本文 打印本文  关闭窗口 关闭窗口  
C趣味程序百例(17)哪个大夫哪天值班
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 13:59:07  文章录入:杜斌  责任编辑:杜斌

55.哪个大夫哪天值班
    医院有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大夫的中间就可以”。
    请考虑允许跨周的情况下,可能的时间安排表。
打印本文 打印本文  关闭窗口 关闭窗口