定义一个结构体来存储日期(含年、月、日)。并设计一个函数,计算传入的结构体存储的日期是一年中的第几天
注意:
1.考虑非法日期,如“4月小”,那就不能有31号
2.考虑是否为闰年
代码如下
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct date { short year; char month; char day; }; bool isValid(int year, int month, int day) { if(year<0 || month<1 || month>12 || day<1 || day>31) return false; if(month == 4 || month == 6 || month == 9 || month == 11) { if(day > 30) return false; } else if(month == 2) { if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if(day > 29) return false; } else { if(day > 28) return false; } } else { if(day > 31) return false; } return true; } int main(void) { printf("请输入年月日(格式:1969/09/23) :"); struct date sunny; scanf("%hd/%hhd/%hhd", &sunny.year, &sunny.month, &sunny.day); // 判定日期的合法性 if(!isValid(sunny.year, sunny.month, sunny.day)) { fprintf(stderr, "日期非法\n"); exit(0); } int days[12] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//每月的最大天数,特殊的二月另外赋值即可 int i, total_days = 0; // 判断是否闰年 if((sunny.year%4==0 && sunny.year%100!=0) || (sunny.year%400==0)) days[1] = 29; else days[1] = 28; for(i=0; i<sunny.month-1; i++) total_days += days[i]; total_days += sunny.day; printf("该日期是第%d天\n", total_days); return 0; }