运行界面
![](https://img-blog.csdn.net/20140324225043656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlfanVuXzA5XzA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
/************************************************************************
实现功能:计算2个日期的差。
思 路:1、将问题简化为:计算某个日期是该年的第几天,
那么只要将月份不断的累加,以日数做为计数器。
例如计算2014-09-05是2014年的第几天,只要将
1-8月的天数相加,然后加上5便可。我们将这种操作记为F(X)。
2、所以,F(X_1)-F(X_2)便是他们的是日期差。
3、这里有个BUG,如果不是同一个年份,计算结果将不正确。
4、所以,我们要令X_1的年份 == X_2,反之亦可。
5、将年份逐渐累加,直至相等,我们将这种操作记为C。
6、显然,最后结果为:|F(X_1) - F(X_2)|+C。
************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
int _month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//为了和月份对应,前面的0用来占位。
typedef struct DATE
{
int year;
int month;
int date;
}DATE;//一个日期,包含年、月、日。
/********************************************
函数名:Leap_Year
参 数:一个合法的年份
功 能:判断是否为闰年
返 回:是闰年,返回true,否则,返回false
********************************************/
bool Leap_Year(int year)
{
if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))
return true;
return false;
}
/********************************************
函数名:Sky_Number
参 数:合法的年、月、日
功 能:计算该日期是该年的第几天
返 回:返回一个天数
********************************************/
int Sky_Number(int year,int month,int date)
{
if( 3 <= month && Leap_Year(year) )
++date;//闰年的2月要多一天。
for(int i=1; i<month; i++)
date += _month[i];
return date;
}
/********************************************
函数名:Input_Data
参 数:无参数
功 能:输入一个合法的日期
返 回:返回一个指针型的日期
********************************************/
DATE *Input_Data(void)
{
DATE *temp = (DATE *)malloc(sizeof(DATE));
scanf("%d-%d-%d",&temp->year,&temp->month,&temp->date);
return temp;
}
/********************************************
函数名:Add_Number
参 数:2个年份
功 能:使2者日期的年份相等(小的向大的递增)
返 回:返回计算过程中增加的天数
********************************************/
int Add_Number(int year_max,int year_min)
{
int count = 0;
if(year_max < year_min)
{
year_max = year_max + year_min;
year_min = year_max - year_min;
year_max = year_max - year_min;
}
for(int i=year_min; i<year_max; i++)
Leap_Year(i+1) ? count+=366 : count += 365;
return count;
}
/********************************************
函数名:main
参 数:无参数
功 能:计算2个日期的差
返 回:成功时,返回0
********************************************/
int main(void)
{
while(true)
{
int answer = 0;
DATE *input_front = Input_Data();
DATE *input_later = Input_Data();
answer = Add_Number(input_front->year,input_later->year);
answer +=
Sky_Number(input_front->year,input_front->month,input_front->date)-
Sky_Number(input_later->year,input_later->month,input_later->date);
printf("%d\n\n",abs(answer));
free(input_front);
free(input_later);
}
return 0;
}