【问题描述】编写一函数timedifvalue,计算两个日期之间的时间差,并将其值返回。要求:定义结构体数据类型,在主函数中完成两个日期的输入,调用timedifvalue函数计算两个日期之间的时间差。日期以年、月、日表示,“时间差”以天数表示,注意考虑日期之间的闰年。函数的输入参数为日期1和日期2,函数的返回值为时间差,单位为天数。
【输入形式】两个日期,日期以年、月、日表示
【输出形式】时间差,“时间差”以天数表示
【样例输入】2010,5,3 2013,6,9
【样例输出】1133
下面都是data1的年份早于data2的年份的形式(因为本人太笨没想出来)
step1:因为用到结构体所以先用结构体把时间表示出来
step2:再写出主函数
step3:最后完成timedifvalue函数
首先思考如何计算时间差,年-年,月-月,日-日?貌似可行但很繁琐容易多解少解。同样的方法换个角度,先计算出年的差值乘以365,然后分别算出两个时间段从1月1日到所输入的日期一共多少天,最后两个时间段相减再取绝对值(因为不知道第二个日期的月是比第一个日期的月大还是小),再+年*365就大功告成了。
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};方便计算天数,前面多个0为了下标与月份数对上,方便理解与计算。
其中
判断是否为闰年,如果是闰年还有多一天
最后代码演示:
#include <math.h>
struct data{
int Year;
int Month;
int Day;
};
int timedifvalue(struct data data1, struct data data2)
{
int i = data1.Year, j = data2.Year; //i,j临时存储下面还会用到年份
int day = 0, z1 = 0, z2 = 0;
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
day = (data2.Year - data1.Year) * 365;
for (; data2.Year > data1.Year; data1.Year++)
if (data1.Year % 400 == 0 || (data1.Year % 4 == 0 && data1.Year % 100 != 0))//判断是否为闰年
day++;
for (int m = 1; m <= 12; m++)
{
if (m < data1.Month)
z1 += a[m];
}
if ((i % 400 == 0 || (i % 4 == 0 && i % 100 != 0))&&(data1.Month >=2))
z1++;
for (int m = 1; m <= 12; m++)
{
if (m < data2.Month)
z2 += a[m];
}
if ((j % 400 == 0 || (j % 4 == 0 && j % 100 != 0))&&(data2.Month >=2))
z2++;
return abs(day += ((z2 + data2.Day) - (z1 + data1.Day)));
}
int main()
{
struct data data1, data2;//早年写在前面
scanf("%d%d%d",&data1.Year, &data1.Month, &data1.Day);
scanf("%d%d%d", &data2.Year, &data2.Month, &data2.Day);
int day = timedifvalue(data1, data2);
printf("%d", day);
return 0;
}
下面再来个带闰年的演示: