一、题目解读
题目要求
给定一个年份y和月份m,我们需要计算并输出这个月有多少天。
核心考点
- 分支结构:if-else和switch的使用
- 逻辑运算:闰年判断的“与”、“或”、“非”组合
- 算术运算:模运算%的应用
- 变量定义与赋值:规范的变量声明和初始化
关键规则
- 大月(31天):1、3、5、7、8、10、12月
- 小月(30天):4、6、9、11月
- 二月:闰年29天,平年28天
- 闰年判断:能被400整除,或者能被4整除但不能被100整除
二、解题思路
我们可以把问题拆解成三步走:
- 输入处理:从键盘读入年份y和月份m。
- 判断月份类型:
- 先判断是否为大月,再判断是否为小月,剩下的就是二月。
- 也可以用switch语句直接匹配月份。
- 特殊处理二月:根据闰年规则判断二月的天数。
三、参考程序1:if-else 版本
#include<iostream>usingnamespace std;intmain(){ int y, m, d; cin >> y >> m; if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){ d =31; } else if(m==4||m==6||m==9||m==11){ d =30; } else{ if((y%400==0)||(y%4==0&& y%100!=0)){ d =29; } else{ d =28; } } cout << d << endl; return0;}
编程要点
- 逻辑清晰:先处理所有大月,再处理小月,最后处理二月,符合我们思考的自然顺序。
- 运算符优先级:在闰年判断中,&&的优先级高于||,所以(y%4==0 && y%100!=0)会先被计算。
- 变量初始化:d在赋值前没有初始化,但在所有分支中都被赋值了,所以是安全的。
四、参考程序2:switch 版本
#include<iostream>using namespace std;intmain(){ int y, m, d; cin >>y >>m; switch(m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: d = 31; break; case 4: case 6: case 9: case 11: d = 30; break; case 2: if((y%400==0) || (y%4==0 && y%100!=0)){ d = 29; } else{ d = 28; } break; default:; } cout <<d <<endl; return 0;}
编程要点
- 多case合并:case 1: case 3: ...的写法非常巧妙,让多个月份执行同一段代码。
- break的重要性:每个case执行完后都要有break,否则程序会“穿透”到下一个case(比如少写case 1后的break,输入1月也会执行case 3的逻辑)。
- default分支:虽然题目保证输入的月份是1-12,但保留default是个好习惯,能应对意外情况(比如输入0或13月)。
五、if-else vs switch 对比
对比维度 | if-else 语句 | switch 语句 |
判断类型 | 支持范围判断、复杂逻辑判断(比如m>10、y%4==0 && y%100!=0) | 仅支持固定值匹配(只能判断m==1、m==2这类等于某个具体数的情况) |
代码结构 | 层层递进,像“闯关答题”:先看是不是大月→再看是不是小月→最后看二月 | 直接匹配,像“找抽屉”:输入月份直接对应到对应的天数抽屉 |
执行效率 | 条件越多,需要判断的次数越多(比如判断12月要检查7个条件) | 几乎一步到位,不管匹配哪个case,耗时都差不多 |
代码可读性 | 适合逻辑复杂的场景,读起来像“自然语言” | 适合多固定值匹配的场景,结构更整洁,一目了然 |
易错点 | 容易漏写else、逻辑运算符写错(比如把&&写成||) | 容易漏写break导致“穿透”,或忘记写default |
六、编程习惯培养
- 变量命名要规范:y代表year(年),m代表month(月),d代表day(天),见名知意(别用a/b/c这种看不懂的变量名)。
- 代码风格要统一:缩进要一致(比如if里的代码要空4个空格),花括号要对齐,这样阅卷老师一眼就能看明白你的逻辑。
- 测试用例要全面:做完题一定要多试几个情况,确保都对:
- 测试大月:2023 1 → 输出31
- 测试小月:2023 4 → 输出30
- 测试闰年二月:2024 2 → 输出29
- 测试平年二月:2026 2 → 输出28
七、拓展练习
学完“每月天数”的核心逻辑,快来挑战这两道拓展题,巩固所学知识吧!记得编写程序在本地测试成功后,在评论区分享你的解题代码哦~
拓展题1:这一年的第几天
题目描述
给定某一年的年、月、日(y, m, d),请你计算并输出这一天是这一年的第几天。闰年规则与原题一致:能被400整除,或者能被4整除但不能被100整除的年份是闰年,闰年2月有29天,平年2月有28天。
输入格式
输入一行,包含三个整数y, m, d,分别表示年、月、日。约定2000 ≤ y ≤ 3000,1 ≤ m ≤ 12,1 ≤ d ≤ 当月天数。
输出格式
输出一行,包含一个整数,表示这一天是这一年的第几天。
样例输入1
2026 2 28
样例输出1
59
样例输入2
2024 3 1
样例输出2
61
拓展题2:闰年个数
题目描述
给定两个年份y1和y2(y1 ≤ y2),请你计算并输出在y1到y2之间(包含y1和y2)一共有多少个闰年。闰年规则与原题一致:能被400整除,或者能被4整除但不能被100整除的年份是闰年。
输入格式
输入一行,包含两个整数y1, y2,分别表示起始年份和结束年份。约定2000 ≤ y1 ≤ y2 ≤ 3000。
输出格式
输出一行,包含一个整数,表示闰年的个数。
样例输入1
2020 2026
样例输出1
2
样例输入2
2000 2000
样例输出2
1
快去试试拓展题吧!编写好程序并测试成功后,请在评论区分享你的代码,和大家一起交流学习~~