题目
从标准输入读入年份与月份,使用 <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 天