C语言学习笔记20260606- 求月份天数三种写法

C语言学习笔记20260606- 求月份天数三种写法

一、知识点总结:闰年判断规则

闰年条件(满足其一即为闰年):

  1. 能被4整除,但不能被100整除

  2. 能被400整除

闰年2月29天,平年2月28天


二、实现方法

方法一:基础if判断法(最易懂、新手推荐)

思路:

  1. 定义数组存储平年12个月的天数

  2. 默认读取数组天数

  3. 如果是闰年并且是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;
}

方法二:二维数组法

思路:

  1. 建立二维数组:第0行存平年、第1行存闰年

  2. 通过闰年结果(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;
}

方法三:函数封装法

思路:

  1. 将闰年判断单独封装函数

  2. 将获取天数单独封装函数

  3. 主函数只负责输入输出,结构清晰

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;
}

三、 运行结果

相关推荐
tiankongdeyige17 分钟前
游戏战斗系统学习第2篇:有限状态机 (FSM)
学习·游戏·typescript
an12321213 小时前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
by209993 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
乌暮4 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
铅笔小新z4 小时前
【C语言】操作符
c语言
小雪崩5 小时前
嵌入式学习 day60:ARM汇编——触摸屏与SPI
汇编·arm开发·学习
by209995 小时前
从 malloc/free 到 new/delete:真正理解 C++ 中的内存管理与对象生命周期
c语言·c++·经验分享·动态内存管理
额额额对了5 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
问天_观心6 小时前
大模型训练与推理优化(二)
人工智能·深度学习·学习·大模型·transformer
Because_of_Her16 小时前
dfs-洪水填充技巧
笔记·算法·深度优先·洪水填充