江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
2009秋江苏计算机等级C上机真题1

改错题:
[程序功能]
  输入两个正确日期且年份在1900-9999范围内,计算
并输出两个日期之间间隔的天数,例如:2008-8-1
和2009-8-1之间间隔的天数为365
  提示:能被4整除并且不能被100整除的年份是闰年,能
被400整除的年份也是闰年,其他年份则是平年
[测试数据与运行结果]
显示:first  date:
输入:1980-2-1
显示:second date:2009-8-1
输出:10774  days
[含有错误的源程序]
#include <stdio.h>
#define leap(int y) ((y)%4==0 && (y)%100!=0||(y)%400==0)
struct d
{int y,m,d;};
int days(struct d d1,struct d d2)
{int mon[2][13]=
  {{0,31,28,31,30,31,30,31,31,30,31,30,31},
   {0,31,29,31,30,31,30,31,31,30,31,30,31}};
 int i; long td=0;
 for(i=d1.y;i<d2.y;i++)
   td=leap(i)?366:365;
 for(i=1;i<d1.m;i++)
   td-=mon[leap(d1.y)][i];
 td-=d1.d-1;
 for(i=1;i<d2.m;i++)
  td+=mon[leap(d2.y)][i];
 td+=d2.d-1;
 return td;
}

void main()
{struct d d1,d2;
 long td;
 printf("first date:");
 scanf("%d-%d-%d",d1.y,d1.m,d1.d);
 printf("second date:");
 scanf("%d-%d-%d",d2.y,d2.m,d2.d);
 td=days(d1,d2);
 printf("%ld",td);
}