C语言学习笔记20260606- 求月份天数三种写法
一、知识点总结:闰年判断规则
闰年条件(满足其一即为闰年):
-
能被4整除,但不能被100整除
-
能被400整除
闰年2月29天,平年2月28天
二、实现方法
方法一:基础if判断法(最易懂、新手推荐)
思路:
-
定义数组存储平年12个月的天数
-
默认读取数组天数
-
如果是闰年并且是2月,天数+1
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year, month, day;
//平年每月天数
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
printf("请输入年份和月份:\n");
scanf("%d%d", &year, &month);
//基础合法性判断
if (month < 1 || month > 12)
{
printf("月份输入错误!\n");
return 0;
}
day = days[month - 1];
//闰年二月单独加一天
if (((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) && month == 2)
{
day += 1;
}
printf("%d年%d月共有%d天\n", year, month, day);
return 0;
}
方法二:二维数组法
思路:
-
建立二维数组:第0行存平年、第1行存闰年
-
通过闰年结果(0或1)直接选择对应行
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year, month;
//二维数组:[0]平年 [1]闰年
int days[2][12] = {
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
printf("请输入年份和月份:\n");
scanf("%d%d", &year, &month);
if (month < 1 || month > 12)
{
printf("月份输入错误!\n");
return 0;
}
//闰年为1,平年为0
int is_leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
//直接取值
printf("%d年%d月共有%d天\n", year, month, days[is_leap][month - 1]);
return 0;
}
方法三:函数封装法
思路:
-
将闰年判断单独封装函数
-
将获取天数单独封装函数
-
主函数只负责输入输出,结构清晰
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//判断闰年
int IsLeapYear(int y)
{
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
//获取当月天数
int GetMonthDays(int y, int m)
{
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (m == 2 && IsLeapYear(y))
{
return 29; //闰年二月是29天
}
return days[m - 1];
}
int main()
{
int year, month;
printf("请输入年份和月份:\n");
scanf("%d%d", &year, &month);
if (month < 1 || month > 12)
{
printf("月份输入错误!\n");
return 0;
}
int day = GetMonthDays(year, month);
printf("%d年%d月共有%d天\n", year, month, day);
return 0;
}