计算2个日期的差

      运行界面

/************************************************************************
   实现功能:计算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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值