题目

从标准输入读入年份与月份,使用 <code>switch-case</code> 结构匹配该月份的天数(大月31天,小月30天,2月结合闰年规则输出28或29天)。

输入格式:一行输入两个正整数,分别表示年份与月份(1~12)。

输出格式:输出该月份的天数。

数据范围与约定:年份 ≥ 1,1 ≤ 月份 ≤ 12。

思路与算法

1. Octave 的 switch 穿透与集合匹配
C 语言中 switch 需要写 `break` 且不支持集合合并;而在 Octave / MATLAB 中,case 天然不会向下穿透,且允许把多个匹配值直接放在花括号元胞数组中:case {1, 3, 5, 7, 8, 10, 12},语法表达力极高。

2. 2 月联动判定
当 month 匹配到 2 时,内嵌闰年条件判断返回 29 或 28。

3. otherwise 兜底
使用 otherwise 捕获非法月份(如 13 月)。

完整程序

% Octave / MATLAB 第43题:switch-case 月份天数匹配
[vals, count] = scanf("%d %d", 2);

if count < 2
    fprintf("错误:请输入年份与月份。\n");
    return;
end

year = vals(1);
month = vals(2);

switch month
    case {1, 3, 5, 7, 8, 10, 12}
        days = 31;
    case {4, 6, 9, 11}
        days = 30;
    case 2
        % 闰年判断
        if (mod(year, 400) == 0) || (mod(year, 4) == 0 && mod(year, 100) ~= 0)
            days = 29;
        else
            days = 28;
        end
    otherwise
        fprintf("错误:月份 %d 非法,必须在 1~12 之间。\n", month);
        return;
end

fprintf("%d 年 %d 月共有 %d 天\n", year, month, days);

运行示例

示例 1:

输入:

2024 2

输出:

2024 年 2 月共有 29 天

示例 2:

输入:

2023 2

输出:

2023 年 2 月共有 28 天

示例 3:

输入:

2024 10

输出:

2024 年 10 月共有 31 天