C编程练习-输入两个日期(yyyy-mm-dd),计算两个日期间隔的天数,考虑代码冗余问题

#include<stdio.h>
#include<stdint.h>
#include<stdbool.h>
#include<stdlib.h>

uint32_t date_to_days(uint16_t y,uint8_t m,uint8_t d);   //把日期转换成天数
bool is_leap(uint16_t y);    // 判断是否是闰年
uint8_t get_month_days(uint16_t y,uint8_t m);    //获取当月天数
bool is_date(uint32_t y,uint8_t m,uint8_t d);    // 判断输入的日期是否合法

int main(int argc,const char* argv[])
{
  uint16_t y=0;
  uint8_t m=0,d=0;
  printf("请输入第一个日期:\n");  
  scanf("%hd-%hhd-%hhd",&y,&m,&d);
  if(!is_date(y,m,d))
  {
    printf("日期有误!\n");
    return 0;   /若日期有误,直接结束程序
  }
  uint32_t sum1 = date_to_days(y,m,d);
  printf("请输入第二个日期:\n");
  scanf("%hd-%hhd-%hhd",&y,&m,&d);
  if(!is_date(y,m,d))
  {
    printf("日期有误!\n");
    return 0;
  }
  uint32_t sum2 = date_to_days(y,m,d);

  printf("两个日期相隔%hd天\n",abs(sum1-sum2));
 }

bool is_date(uint32_t y,uint8_t m,uint8_t d)
{
  return 0<y && 0<m && 13>m && 0<d && get_month_days(y,m)>=d;
}

bool is_leap(uint16_t y)
{
  return 0==y%4 && 0!=y%100 || 0==y%400;
}

uint8_t get_month_days(uint16_t y,uint8_t m)
{
  switch(m)
  {
    case 2:
      return 28+is_leap(y); break;
    case 4: case 6: case 9: case 11:
      return 30; break;
    default:
      return 31;
  }
}

uint32_t date_to_days(uint16_t y,uint8_t m,uint8_t d)
{
  uint32_t sum=d-1;
  for(int i=1; i<y; i++)
  {
    sum += 365+is_leap(i);
  }
  for(int i=1; i<m; i++)
  {
    sum +=get_month_days(y,i);
  }
  return sum;
}

 

posted @ 2023-07-27 11:32  冲他丫的  阅读(367)  评论(0)    收藏  举报