5 多分支
正在加载视频播放器…
GESP C++ 一级讲义:多分支结构精讲
核心目标:掌握
if-else if-else多分支链、嵌套if实现多分支、switch基本用法,理解“从上到下判断,一真即停”的执行流程。
多分支就是多个条件选一个执行;条件按顺序判断,一旦成立,后面的分支全部跳过。
一、什么是多分支
多分支,就是程序面临三种或三种以上的情况,需要根据条件选择其中一条路执行。
例如:
- 成绩等级:A、B、C、D、E
- 数的分类:正数、负数、零
- 字符分类:数字、大写字母、小写字母、其他字符
- 月份天数:1、3、5、7、8、10、12 月 31 天;4、6、9、11 月 30 天;2 月特殊
一级中实现多分支主要有三种方式:
| 方式 | 语法 | 一级重要程度 |
|---|---|---|
if-else if-else 链 |
多个 if 串起来 |
重点掌握 |
嵌套 if |
if 里面再写 if |
掌握 |
switch |
多路选择 | 了解,会读会写简单题 |
二、if-else if-else 多分支
1. 基本语法
if (条件1) {
语句块1;
} else if (条件2) {
语句块2;
} else if (条件3) {
语句块3;
} else {
语句块4;
}
说明:
条件1成立,执行语句块1,后面全部跳过。条件1不成立,判断条件2。条件2成立,执行语句块2,后面全部跳过。- 依次往下。
- 如果所有条件都不成立,执行
else。 else可以省略,但建议写,用来处理“其他情况”。
2. 执行流程
判断条件1 → 真 → 执行语句块1 → 结束整个多分支
→ 假 → 判断条件2
→ 真 → 执行语句块2 → 结束
→ 假 → 判断条件3
→ 真 → 执行语句块3 → 结束
→ 假 → 执行 else
核心口诀:
从上到下,逐个判断;
一真即停,其余跳过;
全假才走 else。
3. 示例:正数、负数、零
int n;
cin >> n;
if (n > 0) {
cout << "正数" << endl;
} else if (n < 0) {
cout << "负数" << endl;
} else {
cout << "零" << endl;
}
输入 5 → 正数
输入 -3 → 负数
输入 0 → 零
4. 示例:成绩等级
int score;
cin >> score;
if (score >= 90) {
cout << "A" << endl;
} else if (score >= 80) {
cout << "B" << endl;
} else if (score >= 70) {
cout << "C" << endl;
} else if (score >= 60) {
cout << "D" << endl;
} else {
cout << "E" << endl;
}
注意:这里必须从高分到低分判断。
如果先判断 score >= 60,那 95 分也会先满足,输出 D,逻辑就错了。
三、多分支的条件顺序
多分支的条件顺序非常重要,特别是区间判断。
1. 区间从大到小
成绩等级推荐:
if (score >= 90) { }
else if (score >= 80) { }
else if (score >= 70) { }
else if (score >= 60) { }
else { }
因为 score >= 90 已经排除了 90 以上,后面 score >= 80 实际表示 80 <= score < 90。
2. 区间从小到大
也可以从小到大写,但条件要写完整:
if (score < 60) {
cout << "E";
} else if (score < 70) {
cout << "D";
} else if (score < 80) {
cout << "C";
} else if (score < 90) {
cout << "B";
} else {
cout << "A";
}
3. 条件互斥
多分支的条件最好互斥,也就是不能同时成立。
if (n > 0) {
// 正数
} else if (n < 0) {
// 负数
} else {
// 零
}
这三个条件互斥且覆盖所有情况。
4. 条件重叠的后果
if (score >= 60) {
cout << "D";
} else if (score >= 90) {
cout << "A";
}
95 分先满足 score >= 60,输出 D,后面的 score >= 90 永远轮不到。
所以顺序错误会导致结果错误。
四、嵌套 if 实现多分支
if 里面还可以写 if,形成嵌套分支。
1. 示例:判断三个数最大值
int a, b, c;
cin >> a >> b >> c;
int maxv;
if (a > b) {
if (a > c) {
maxv = a;
} else {
maxv = c;
}
} else {
if (b > c) {
maxv = b;
} else {
maxv = c;
}
}
cout << maxv << endl;
更简单的写法:
int maxv = a;
if (b > maxv) maxv = b;
if (c > maxv) maxv = c;
cout << maxv << endl;
2. 悬空 else
else 总是和最近的、未匹配的 if 配对。
if (a > 0)
if (b > 0)
cout << "都正";
else
cout << "a 不正";
这里的 else 实际和 if (b > 0) 配对,不是和 if (a > 0) 配对。
解决方法:加花括号。
if (a > 0) {
if (b > 0) {
cout << "都正";
}
} else {
cout << "a 不正";
}
五、switch 多分支(了解,下个章节会有拓展)
switch 适合判断一个表达式的多个固定取值。
1. 基本语法
switch (表达式) {
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
default:
语句块3;
}
2. 示例:根据运算符计算
char op;
int a, b;
cin >> a >> op >> b;
switch (op) {
case '+':
cout << a + b << endl;
break;
case '-':
cout << a - b << endl;
break;
case '*':
cout << a * b << endl;
break;
case '/':
cout << a / b << endl;
break;
default:
cout << "错误" << endl;
}
3. 注意事项
case后面必须是常量,不能是变量。break用来跳出switch。- 如果不写
break,会继续执行下一个case,称为“穿透”。 default处理其他情况,可选。switch的判断值通常是整数或字符。
4. switch 与 if 的选择
| 场景 | 推荐 |
|---|---|
| 范围判断,如成绩等级 | if-else if |
大小比较,如 a > b |
if |
固定取值,如运算符 + - * / |
switch |
| 复杂逻辑组合 | if |
一级建议:优先掌握 if-else if-else,switch 会读会写简单题即可。
六、常见多分支模型
1. 正数、负数、零
if (n > 0) {
cout << "正数";
} else if (n < 0) {
cout << "负数";
} else {
cout << "零";
}
2. 成绩等级
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 70) {
cout << "C";
} else if (score >= 60) {
cout << "D";
} else {
cout << "E";
}
3. 字符分类
char c;
cin >> c;
if (c >= '0' && c <= '9') {
cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
cout << "大写字母";
} else if (c >= 'a' && c <= 'z') {
cout << "小写字母";
} else {
cout << "其他字符";
}
4. 判断闰年
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
cout << "闰年";
} else {
cout << "平年";
}
这是双分支,不是多分支,但常和多分支结合。
5. 月份天数
int m;
cin >> m;
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
cout << 31;
} else if (m == 4 || m == 6 || m == 9 || m == 11) {
cout << 30;
} else if (m == 2) {
cout << 28;
} else {
cout << "月份错误";
}
6. 简单计算器
char op;
int a, b;
cin >> a >> op >> b;
if (op == '+') {
cout << a + b;
} else if (op == '-') {
cout << a - b;
} else if (op == '*') {
cout << a * b;
} else if (op == '/') {
cout << a / b;
} else {
cout << "错误";
}
七、多分支易错点
-
条件顺序错误
if (score >= 60) { cout << "D"; } else if (score >= 90) { cout << "A"; }95 分也会输出 D。应从高到低判断。
-
=与==混淆if (a = 1) // 赋值,条件恒为真 if (a == 1) // 正确 -
if后多写分号if (a > 0); // 错误,if 空执行 -
花括号漏写
if (a > 0) cout << "正"; cout << "数"; // 不受 if 控制 -
悬空
else
建议每个if、else都加花括号。 -
范围判断连写
if (0 < a < 10) // 错误逻辑 if (a > 0 && a < 10) // 正确 -
逻辑运算符优先级
if (a > 0 || b > 0 && c > 0) // && 高于 ||建议加括号:
if ((a > 0 || b > 0) && c > 0) -
switch忘记breakcase '+': cout << a + b; // 缺少 break,会继续执行后面的 case -
switch的case用变量case x: // 错误,case 后必须是常量 -
输出多余提示语
考试时不要输出“请输入”等提示。
八、阅读程序写结果
题目 1
int n = 0;
if (n > 0) {
cout << "正";
} else if (n < 0) {
cout << "负";
} else {
cout << "零";
}
输出:
零
题目 2
int score = 85;
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 70) {
cout << "C";
} else {
cout << "D";
}
输出:
B
题目 3
int score = 95;
if (score >= 60) {
cout << "D";
} else if (score >= 90) {
cout << "A";
}
输出:
D
解释:条件顺序错误,95 先满足 score >= 60。
题目 4
char c = '7';
if (c >= '0' && c <= '9') {
cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
cout << "大写";
} else if (c >= 'a' && c <= 'z') {
cout << "小写";
} else {
cout << "其他";
}
输出:
数字
题目 5
int a = 3, b = 5, c = 4;
if (a > b) {
cout << "A";
} else if (b > c) {
cout << "B";
} else {
cout << "C";
}
输出:
B
解释:a > b 假,b > c 真,输出 B。
题目 6
int x = 2;
switch (x) {
case 1:
cout << "一";
break;
case 2:
cout << "二";
break;
case 3:
cout << "三";
break;
default:
cout << "其他";
}
输出:
二
题目 7
int x = 2;
switch (x) {
case 1:
cout << "一";
case 2:
cout << "二";
case 3:
cout << "三";
default:
cout << "其他";
}
输出:
二三其他
解释:没有 break,发生穿透。
九、速查表
| 需求 | 写法 |
|---|---|
| 多分支基本结构 | if (条件1) { } else if (条件2) { } else { } |
| 判断正负零 | if (n > 0) ... else if (n < 0) ... else ... |
| 成绩等级 | 从高到低判断 |
| 字符分类 | if (c >= '0' && c <= '9') ... |
嵌套 if |
if 里面再写 if |
避免悬空 else |
每个分支加花括号 |
switch 基本结构 |
switch (表达式) { case 常量: ... break; default: ... } |
switch 跳出 |
break |
switch 默认分支 |
default |
| 范围判断 | 用 && 连接,如 a > 0 && a < 10 |
十、总结
多分支是一级分支结构中的重点。
- 多分支用于三种或更多情况的选择。
if-else if-else从上到下判断,一真即停。- 条件顺序很重要,区间判断通常从大到小或从小到大。
- 所有条件都不成立时,才执行最后的
else。 - 嵌套
if中,else和最近的未匹配if配对,建议加花括号。 switch适合固定取值判断,case后必须是常量,break不能忘。- 多分支常与关系运算符、逻辑运算符结合,注意
==、&&、||和括号。
复习时多练“阅读程序写结果”和“根据条件写多分支”两类题,重点注意条件顺序、边界值、花括号、break 和输出格式。考试中先读清题目有几种情况,再确定分支顺序,最后逐条检查条件是否互斥、是否覆盖全部情况。