某年某月某日到某年某月某日有多少天

 #include<stdio.h>


typedef struct Date
{
   int Year;
   int Month;
   int Day;
}Date;


Date Start_date, End_date;                                            /* 全局变量 */
Date S, E;                                                            /* 用来存放起止日期的初始值,最终输出时用 */ 
int result_day = 0;                                                   /* 最终算得的总天数,初始值设为0 */
                                                                      /* 函数声明 */
int Enter_date();                                                     /* 输入起止日期 */
int Count_month(int, int, int, int);                                  /* 计算两日期之间的月份差的天数 */
int Count_year(int, int);                                             /* 计算两日期之间的年份差的天数 */
int Is_leap_year(int year);                                           /* 判断当前年份是否为闰年 */
int Judge_month(int month, int year);                                 /* 判断当前年份中的当前月份的天数 */


int main()                                                            /* 主函数 */
{
   Enter_date();                                                      /* 调用函数,输入起始日期和截止日期 */
   result_day += (End_date.Day - Start_date.Day);                     /* 计算截止日期的日与起始日期的的日的天数的差*/
   result_day = Count_month(Start_date.Month, End_date.Month, Start_date.Year, End_date.Year);       
                                                                      /* 调用函数,计算截止日期的月份与起始日期的月份的差的天数 */
   result_day = Count_year(Start_date.Year, End_date.Year);           /* 调用函数,计算相隔整数年份的天数 */
   printf("\n从%d年%d月%d日到%d年%d月%d日共有%d天。\n\n",             /* 输出结果 */
        S.Year, S.Month, S.Day, E.Year, E.Month, E.Day, result_day);
   return 0;
}


int Enter_date()
{
   printf("\n程序将给出您输入的两个日期(年月日)之间的天数。\n");     /* 对程序功能的简单说明 */
   printf("您输入的年份范围是公元元年至公元3000年。\n\n");
   printf("请输入起始日期, \n Year:");                                 /* 输入起始日期 */
   scanf("%d", &Start_date.Year);
   while (Start_date.Year < 0 || Start_date.Year > 3000)               /* 判断输入的年份是否正确 */
   {
      printf("Error: 年份输入错误!请重新输入。\n");
  printf(" Year:");
  scanf("%d", &Start_date.Year);
   }
   printf(" Month:");
   scanf("%d", &Start_date.Month);
   while (Start_date.Month < 1 || Start_date.Month > 12)              /* 判断输入的月份是否正确 */
   {
  printf("Error: 月份输入错误!请重新输入。\n");
  printf(" Month:");
  scanf("%d", &Start_date.Month);
   }
   printf(" Day:");
   scanf("%d", &Start_date.Day);
   while (Start_date.Day < 1 || Start_date.Day > 31)                  /* 判断输入的日期是否正确 */
   {
  printf("Error: 日期输入错误!请重新输入。\n");
  printf(" Day:");
  scanf("%d", &Start_date.Day);
   }
   printf("请输入截止日期,\n Year:");                                 /* 输入截止日期 */
   scanf("%d", &End_date.Year);
   while (End_date.Year < Start_date.Year  || End_date.Year > 3000)   /* 判断输入的年份是否正确 */
   {
      printf("Error: 年份输入错误!请重新输入。\n");
  printf(" Year:");
  scanf("%d", &End_date.Year);
   }
   printf(" Month:");
   scanf("%d", &End_date.Month);
   while (End_date.Month < 1 || End_date.Month > 12)                  /* 判断输入的月份是否正确 */
   {
  printf("Error: 月份输入错误!请重新输入。\n");
  printf(" Month:");
  scanf("%d", &End_date.Month);
   }
      /* 当起止日期的年份相同时,判断截止日期的月份是否大于起始日期的月份*/
   while (End_date.Year == Start_date.Year && End_date.Month < Start_date.Month)
   {
  printf("Error: 输入的月份错误!请重新输入。\n");
  printf(" Month:");
  scanf("%d", &End_date.Month);
   }


   printf(" Day:");
   scanf("%d", &End_date.Day);
   while (End_date.Day < 1 || End_date.Day > 31)                      /* 判断输入的日期是否正确 */
   {
  printf("Error: 日期输入错误!请重新输入。\n");
  printf(" Day:");
  scanf("%d", &End_date.Day);
   }
       /* 当起止日期的年份月份都相同时,判断截止日期的日是否大于起始日期*/
   while (End_date.Year == Start_date.Year && End_date.Month == Start_date.Month && End_date.Day < Start_date.Day)
   {
  printf("Error: 输入的日期错误!请重新输入。\n");
  printf(" Day:");
  scanf("%d", &End_date.Day);
   }


   S.Year = Start_date.Year;                                           /* 赋值给S和E中的各项 */
   S.Month = Start_date.Month;
   S.Day = Start_date.Day;
   E.Year = End_date.Year;
   E.Month = End_date.Month;
   E.Day = End_date.Day;


   return 0;
}


int Count_month(int S_Month, int E_Month, int S_Year, int E_Year)
{
   while (E_Month - S_Month != 0)                                       /* 计算截止日期的月份与起始日期的月份的差的天数*/
   {
      if (E_Month > S_Month)                                            /* 当截止日期的月份大于起始日期的月份时,应从起始日期的月份算起 */
  {
 result_day += Judge_month(S_Month, S_Year);          /* 调用判断月份的函数,确定当前月份的天数*/
 ++S_Month;
  }
  else                                                         /* 否则,应从截止日期的月份算起,减去不足的天数 */
  {
 result_day -= Judge_month(E_Month, E_Year);
 ++E_Month;
  }
   }
   return result_day;
}


int Count_year(int S_Year, int E_Year)
{
   while (E_Year - S_Year >= 1)                                         /* 计算整数年份的天数 */
   {
      if (Is_leap_year(S_Year))
 result_day += 366;
  else
 result_day += 365;
  S_Year++;
   }
   return result_day;
}


int Is_leap_year(int year)                                             /* 判断当前年份是否为闰年 */
{
   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  return 1;
   else
  return 0;
}


int Judge_month(int month, int year)                                   /* 判断某一年中的当前月份的天数 */
{
   switch(month)
   {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12: return 31; break;
  case 2:
 if (Is_leap_year(year))
return 29;
 else
return 28; break;
  default: return 30; break;
   }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值