#P5716. 【深基3.例9】月份天数

【深基3.例9】月份天数

【深基3.例9】月份天数

题目来源

洛谷 P5716

题目描述

输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。

输入格式

输入两个正整数,分别表示年份 yy 和月数 mm,以空格隔开。

输出格式

输出一行一个正整数,表示这个月有多少天。

样例输入 1

1926 8

样例输出 1

31

样例输入 2

2000 2

样例输出 2

29

提示

一、switch:按「值」选一条路

当你要根据一个整数的具体取值分支,switch 比一长串 if-else 更清楚:

int m = 3;
switch (m) {
    case 1:
        printf("Mon\n");
        break;
    case 2:
        printf("Tue\n");
        break;
    case 3:
        printf("Wed\n");
        break;
    default:
        printf("other\n");
}

执行过程:算出 m 的值 → 跳到对应的 case → 往下执行,直到遇到 break。

二、break 不能漏

break 的作用是「跳出 switch」。漏写会发生贯穿(fall through):执行完当前 case,继续执行下一个 case 的语句。

switch (m) {
    case 1: printf("A\n");     // 漏了 break
    case 2: printf("B\n"); break;
}

m = 1 时会连着输出 A 和 B。有时这是刻意利用的特性(多个值共用一段代码),但初学阶段每个 case 都要写 break。

三、语法规则

  • switch 括号里只能是整数或字符(不能是 double、不能是字符串);
  • case 后面必须是常量,不能写变量;
  • case 1: 后面是冒号,不是分号;
  • default 处理所有没列出的值,可以省略,但建议写。

四、什么时候用 switch,什么时候用 if

  • 按「具体等于几」分支(1、2、3……)→ switch;
  • 按「范围」分支(大于 60、在 10 到 20 之间)→ if。

五、常见错误

  • 漏 break;

  • case 1; 写成分号;

  • switch (x) 里的 x 是 double。

  • 把月份分成三类:31 天的、30 天的、2 月的。

  • 2 月的天数取决于是否闰年——上一题刚写过,可以复用那段判断。

自查:用 1926 8 → 31 和 2000 2 → 29 验证,再用 1900 2 测一次(应为 28)。