阅读以下说明和C语言函数,填补空缺。 [说明] 函数count months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。 该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。 规

admin2012-04-11  23

问题 阅读以下说明和C语言函数,填补空缺。
[说明]
   函数count months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。
   该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。
   规定两个相邻年份的同月同日之间的问隔为1年。例如,2007.5.30—2008.5.30的间隔为1年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.2.29—2009.2.28的间隔为1年。
   规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29—2007.2.28的间隔为1个月,同理,2007.1.30—2007.2.28、2007.1.31—2007.2.28的间隔都是1个月。
   计算起止日期间隔不足一年的完整月份数时,分两种情况:
   (1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.31—2008.9.20,通过月号算出月份数为6。修正时,通过调用函数makevalid将2008.9.31改为2008.9.30,与终止日期2008.9.20比较后,将月份数修正为5。
   (2)起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.25—2009.3.31,先计算2008.7.25—2008.12.25的月份数为5,再算出2008.12.25—2009.3.25的月份数为3,因此2008.7.25—2009.3.31之间的完整月份数为8。
   日期数据类型定义如下:
   typedef  struct  {
     int year; int month; int day; /*日期的年号(4位)、月和日号*/
   }DATE;
   程序中使用的函数cmp_date(    )、isLeapYear(    )和makevalid(    )说明如表11-8所示。
表11-8 函数说明

[C语言函数]
   int count_months(DATE start, DATE end)
   {
     int years=0, months=0;
     DATE r;
     if (cmp_date(start, end)>0) {
       r=start; start=end; end=r;
     }
     years=end.year-start.year;    /*计算年数*/
     r=start;
     r.year=end.year;
     if (cmp_date(r, end)>0) {    /*修正年数*/
        _________;
       r.year--;
     }
     if(r. year<end. year) {    /*跨年度时,先计算到12月的月份数*/
       months= _______ ;
       r. month=  (12)  ;
     }
     months+=(end. month+12-r. month)%12;
     r. year=end. year; r. month=end. month;
     makeva!id(  _______  );     /*将日期r修正为有效日期*/
     if(cmp_date(r, end)>0)    /*修正月份数*/
        ________  ;
     months+=  ________  ;     /*计算总月份数*/
     return months;
   }

选项

答案years--,或其他等价形式 12_r.month,或其他等价形式 &r months--,或其他等价形式 years*12

解析 years=end. year-start. year语句计算出的年份多算了一年,应该减去1,所以(1)处应为years--。跨年度时计算日期应该分两阶段,年前部分和年后部分,所以(2)处应为12-r.month。根据函数makevalid的接口说明可知,函数的实参应该是变量r的地址,所以(3)处应为“&r”。用两个月份号相减可能会多算一个月,因此应该将months减少1,所以(4)处应为“months--”。计算总月份数时,年份数years*12再加上不足一整年的月份数即可得到月份总数,所以(5)处为“years*12”。
转载请注明原文地址:https://jikaoti.com/ti/bvL7FFFM
0

相关试题推荐
最新回复(0)