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 @   冲他丫的  阅读(305)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示