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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!