当前位置:首页>java>GESP一级C++编程真题解析:每月天数(2023年3月)

GESP一级C++编程真题解析:每月天数(2023年3月)

  • 2026-09-08 13:36:30
GESP一级C++编程真题解析:每月天数(2023年3月)

一、题目解读

题目要求

给定一个年份y和月份m,我们需要计算并输出这个月有多少天。

核心考点

  1. 分支结构:if-else和switch的使用
  2. 逻辑运算:闰年判断的“与”、“或”、“非”组合
  3. 算术运算:模运算%的应用
  4. 变量定义与赋值:规范的变量声明和初始化

关键规则

  • 大月(31天):1、3、5、7、8、10、12月
  • 小月(30天):4、6、9、11月
  • 二月:闰年29天,平年28天
  • 闰年判断:能被400整除,或者能被4整除但不能被100整除

二、解题思路

我们可以把问题拆解成三步走:

  1. 输入处理:从键盘读入年份y和月份m。
  2. 判断月份类型:
    • 先判断是否为大月,再判断是否为小月,剩下的就是二月。
    • 也可以用switch语句直接匹配月份。
  1. 特殊处理二月:根据闰年规则判断二月的天数。
流程图

三、参考程序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

六、编程习惯培养

  1. 变量命名要规范:y代表year(年),m代表month(月),d代表day(天),见名知意(别用a/b/c这种看不懂的变量名)。
  2. 代码风格要统一:缩进要一致(比如if里的代码要空4个空格),花括号要对齐,这样阅卷老师一眼就能看明白你的逻辑。
  3. 测试用例要全面:做完题一定要多试几个情况,确保都对:
    • 测试大月: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

快去试试拓展题吧!编写好程序并测试成功后,请在评论区分享你的代码,和大家一起交流学习~~


最新文章

随机文章