题目
日期结构体:判断是否合法日期
思路
读 y,m,d,校验月日范围,2 月用闰年天数;daysInMonth(y,m) 辅助函数返回该月最大日。
解题分析
月份 1~12,日期不超过当月天数,2 月看闰年。不要用固定 2 月 28 判所有年份。
完整程序
#include <stdio.h>
static int is_leap(int y)
{
return (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
}
static int days_in_month(int y, int m)
{
int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (m == 2 && is_leap(y)) {
return 29;
}
return d[m];
}
int main(void)
{
int y, m, d;
if (scanf("%d %d %d", &y, &m, &d) != 3) {
return 1;
}
if (m < 1 || m > 12 || d < 1 || d > days_in_month(y, m)) {
printf("no\n");
} else {
printf("yes\n");
}
return 0;
}
运行示例
输入:
2024 2 29输出:
yes