刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题


阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。

【说明】

某文本文件中保存了若干个日期数据,格式如下(年/月/日):

2005/12/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 <stdio.h>
typedef struct{
int year,  month, day;/* 年,月,日*/
}DATE;
 
int  isLeap  Year(int  y)  /*判断y表示的年份是否为闰年,是则返回1,否则返回0*/
{
return((y%4==0 && y%100!=0)Il(y%400==0));
}
 
int  isLegal(DATE  date)  /*判断date表示的日期是否合法,是则返回1,否则返回0*/
{
int  y=date.year,m=date.month,d=date.day;
if(y<1985 II  y>2010  II   m<1  II  m>12  II  d<l  II  d>31)  return  0;
if((m==4  ll  m==6   ll  m==9  II  m==11)&&(1) )   return  0;
If(m==2){
if(isLeap   Year(y) &&  (2))   return  1;
else
if(d28)  return  0;
}
return   1;
}
 
Int  Lteq(DATE  d1,DATE  d2)
/*比较日期d1和d2,若d1在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={1985,1,1},end={2010,12,30};
FILE*fp;
 
fp=fopen(“d.txt”,”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或t1-t2<=0或其等价表示

(4)fp==null或!fp或其等价表示

(5)!isLegal(date) 或其等价表示

(6)Lteq(start,date)==1&&Lteq(date,end)==1或其等价表示

解析:

(1)对于判断日期是否合法,需要考虑每个月的天数。对于月份为4、6、9、11的情况,它们的最大天数为30,所以如果日期大于30则为非法日期。因此,第一个空填写的条件是检查天数是否大于最大天数或者是否等于超过最大天数的那一天。例如,对于月份为4的情况,可以填写为“d > 30 且 m == 4”。其他月份同理。

(2)对于二月份的天数判断,需要考虑闰年和非闰年的情况。在闰年中,二月份有29天,而在非闰年中只有28天。因此,第二个空填写的条件是检查二月份的天数是否超过了这个月的最大天数或者是否等于这个月的最后一天。例如,“d <= 29 或 d < 30”。对于闰年的情况,可以使用条件“isLeapYear(y) && d <= 29”。对于非闰年的情况,可以使用条件“d <= 28”。两者结合即可得到正确答案。

(3)在比较两个日期时,如果第一个日期在第二个日期之前或相同,则返回真。因此第三个空填写的条件是检查第一个日期的数值是否小于或等于第二个日期的数值。例如,“t1 <= t2”或者“t1 - t2 <= 0”。这两种表示方式是等价的。

(4)在读取文件之前,需要判断文件是否存在。第四个空填写的条件是检查文件指针是否为空或者文件是否成功打开。例如,“fp == NULL”或“!fp”。这两种表示方式是等价的。如果文件指针为空或者文件打开失败,则返回-1并退出程序。

(5)在判断日期是否合法时,使用isLegal函数进行判断。如果日期不合法,则跳过该日期继续处理下一个日期。因此第五个空填写的条件是判断日期是否不合法。例如,“!isLegal(date)”。如果isLegal函数返回假(即日期不合法),则跳过该日期。

(6)在判断日期是否在起始日期和结束日期之间时,需要使用Lteq函数进行比较。如果日期在起始日期之前且在结束日期之后或在两者之间相同,则输出该日期。因此第六个空填写的条件是判断日期是否在起始日期和结束日期之间。例如,“(Lteq(start, date) == 1 && Lteq(date, end) == 1)”。如果起始日期小于或等于当前日期且当前日期小于或等于结束日期,则输出该日期。

创作类型:
原创

本文链接:阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】某文本文件中保存了若干个

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share