阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 某文本文件中保存了若干个日期数据,格式如下(年/月/日): 2005/1 2/1 2013/2/29 1997/10/11 1980/5/15

admin2017-09-14  33

问题 阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
某文本文件中保存了若干个日期数据,格式如下(年/月/日):
    2005/1 2/1
    2013/2/29
    1997/10/11
    1980/5/15
但是其中有些日期是非法的,例如2013/2/29是非法日期,闰年(即能被400整除或者能被4整除而不能被100整除的年份)的2月份有29天,2013年不是闰年。现要求将其中自1985/1/1开始、至2010/12/31结束的合法日期挑选出来并输出。
下面的C代码用于完成上述要求。
【C代码】
    #include
    typedef struct{
    int year,month,day;  /*年,月,日*/
    }DATE;
    int isLeapYear(int y)    /*判断y表示的年份是否为闰年,是则返回1,否则返回0*/
    {
    return((y%4=0&&y%100 1=0)‖(y%400==0});
    }
    int isLegal(DATE date)  /*判断date表示的日期是否合法,是则返回1,否则返回0*/
    {
    int y=date.year,m=date.month,d=date.day;
    if(y<1 985 ‖ y>201 0‖ m<1‖ m>12 ‖ d<1‖ d>31)  return 0;
    if((m=4 ‖ m=6 ‖m==9‖m==i 1)&&  (1)  )  return 0;
    if(m==2)  {
    if(isLeapYear(y)&& (2) )  return 1;
    eise
    if  (d>2 8)  return 0;
    }
    return 1;
    }
    int Lteq(DATE dl,DATE d2)
    /*比较日期d1和d2,若dl在d2之前或相同则返回1,否则返回0*/
    {
    long t1,t2;
    t1=d1.year*10000+d1.month*100+d1.day;
    t2=d2.year*10000+d2.month*100+d2.day;
    if(  (3)  )  return 1;
    else    return 0;
    }
    int main()
    {
    DATE date,start={1 98 5,1,1},end={2 01 0,12,31);
    FILE*fp;
    fp=fopen(“dtxt”,“r”);
    if(    (4)    )
    return一1;
    while(!feof(fp)){
    if(fscanf(fp,“%d/%d/%d”,&date.year,&date.month,&date.day)!=3)
    break;
    if(    (5)    )    /*判断是否为非法日期*/
    continue;
    if( (6)  )/*调用Lteq判断是否在起至日期之间*/
    printf(“%d/%d/%d\n”,date.year,date.month,date.day);
    }
    fclose(fp);
    return 0;
    }

选项

答案(1)d>30 或d>=31或等价形式 (2)d<=29 或d<30或等价形式 (3)t1<=t2 或等价形式 (4)!fp或fp==0或fp==NULL (5)!isLegal(date) (6)Lteq(start,date)&&Lteq(date,end)或等价形式

解析 本题考查C程序设计的基本结构和运算逻辑。
阅读程序时需先理解程序的结构,包括各函数的作用,然后确定主要变量的作用。本题中,函数isLegal(DATE date)的作用是判断date表示的日期是否合法。对于一个日期数据,需要分别判断年、月、日的合法性。基本的规则是月份只能在整数区间[1,12],日只能在整数区间[1,3 1],还需结合大、小月及2月份的特殊性。按照题目要求,满足条件(y<1985 ‖ y>2010 ‖ m<1 ‖m>12 ‖ d<1 ‖ d>31)的日期先排除,接下来考虑小月份,即4、6、9、11这四个月份不存在3 1日,所在这几个月中若出现3 1日或更大值,就是非法日期,即空(1)处应填入“d>30”或其等价形式。当月份为2时,需要考虑是否闰年,闰年的2月是29天、平年是28天,因此空(2)处应填入“d<30”或其等价形式。
    函数L,teq(DATE d1,DATE d2)的功能是比较日期d1和d2的前后,若d1在d2之前或相同则返回1,否则返回0。通过将日期数据转换为整数来比较日期的先后,显然,日期靠前时其对应的整数就小,因此空(3)处应填入“t1<=t2”或其等价形式。
    在main函数中,从文本文件中读取日期数据,因此文件指针fp与文件的关联失败时,应结束程序,空(4)处应填入“fp==NULL”或其等价形式。
    根据题意,非法日期不输出,因此空(5)处应填入“!isL,egal(date)”或“isL,egal(date)==0”。
    根据注释,空(6)处应填入“L,teq(start,date)&&Lteq(date,end)”或其等价形式。
转载请注明原文地址:https://kaotiyun.com/show/q9jZ777K
0

最新回复(0)