5 多层分支结构
正在加载视频播放器…
GESP C++ 二级:多层分支结构精讲
核心目标:掌握多层分支的嵌套写法、
if-else if-else多分支链、switch多路选择及嵌套,理解执行流程、条件顺序、悬空else、break穿透等关键点,能解决复杂条件判断问题。
多层分支就是“分支里面再套分支”;判断从上到下,一真即停;嵌套时else配对最近未匹配的if,switch靠break跳出。
一、什么是多层分支
当一个问题需要根据多个条件、多个层次做判断时,单层 if 不够用,就需要多层分支。
二级常见多层分支形式:
| 形式 | 说明 | 示例 |
|---|---|---|
if-else if-else 多分支链 |
多个条件依次判断,一真即停 | 成绩等级 A/B/C/D/E |
嵌套 if |
if 里面再写 if |
先判断是否正数,再判断是否偶数 |
嵌套 if-else |
每个分支内部再分情况 | 三角形类型判断 |
switch 多路选择 |
根据固定取值选择分支 | 简单计算器、月份天数 |
switch 嵌套 |
switch 里再写 switch |
复杂菜单 |
| 分支与循环嵌套 | 循环里写 if,if 里写循环 |
筛选、统计 |
核心思想:
外层判断大范围,内层判断小范围;
条件从上到下,一真即停;
嵌套时注意配对和花括号。
二、if-else if-else 多分支链
1. 基本语法
if (条件1) {
语句块1;
} else if (条件2) {
语句块2;
} else if (条件3) {
语句块3;
} else {
语句块4;
}
2. 执行流程
- 判断条件1,成立则执行语句块1,整个多分支结束。
- 条件1不成立,判断条件2。
- 条件2成立,执行语句块2,结束。
- 依次往下。
- 所有条件都不成立,执行
else。
口诀:
从上到下,逐个判断;
一真即停,其余跳过;
全假才走 else。
3. 条件顺序很重要
错误示例:
if (score >= 60) {
cout << "D";
} else if (score >= 90) {
cout << "A";
}
95 分先满足 score >= 60,输出 D,后面的 score >= 90 永远轮不到。
正确写法:从高到低或从小到大,保证条件互斥。
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";
}
4. 示例:成绩等级
int score;
cin >> score;
if (score >= 90 && score <= 100) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 70) {
cout << "C";
} else if (score >= 60) {
cout << "D";
} else if (score >= 0) {
cout << "E";
} else {
cout << "输入错误";
}
三、嵌套 if
1. 基本形式
if (条件1) {
if (条件2) {
语句块;
} else {
语句块;
}
} else {
if (条件3) {
语句块;
}
}
2. 悬空 else
else 总是和最近的、未匹配的 if 配对。
危险示例:
if (a > 0)
if (b > 0)
cout << "都正";
else
cout << "a 不正"; // 实际与 if (b > 0) 配对
解决方法:每个 if、else 都加花括号。
if (a > 0) {
if (b > 0) {
cout << "都正";
}
} else {
cout << "a 不正";
}
3. 嵌套层次建议
- 一级/二级代码嵌套不超过 3 层。
- 层次过深时,考虑用逻辑运算符合并条件,或使用
switch。 - 每个分支都加
{},提高可读性,避免悬空else。
4. 示例:判断三角形类型
int a, b, c;
cin >> a >> b >> c;
if (a + b > c && a + c > b && b + c > a) {
if (a == b && b == c) {
cout << "等边三角形";
} else if (a == b || b == c || a == c) {
cout << "等腰三角形";
} else {
cout << "普通三角形";
}
} else {
cout << "不能构成三角形";
}
5. 示例:分段函数
$f(x) = \begin{cases} x^2 + 1 & x > 0 \\ 0 & x = 0 \\ -x^2 - 1 & x < 0 \end{cases}$
int x;
cin >> x;
if (x > 0) {
cout << x * x + 1;
} else if (x == 0) {
cout << 0;
} else {
cout << -x * x - 1;
}
四、多层分支与逻辑运算符结合
1. 逻辑运算符
| 运算符 | 含义 | 说明 |
|---|---|---|
&& |
逻辑与 | 两边都真才真 |
|| |
逻辑或 | 一边真就真 |
! |
逻辑非 | 真变假,假变真 |
2. 合并条件,减少嵌套
嵌套写法:
if (a > 0) {
if (b > 0) {
cout << "都正";
}
}
合并写法:
if (a > 0 && b > 0) {
cout << "都正";
}
3. 范围判断不能连写
错误:
if (0 < a < 10) // 逻辑错误
正确:
if (a > 0 && a < 10)
4. 逻辑优先级
! 高于 && 高于 ||
不确定时加括号:
if ((a > 0 || b > 0) && c > 0) { }
5. 短路求值
if (a != 0 && b / a > 1) {
// a == 0 时,右边不会计算,避免除零
}
五、switch 多路选择
1. 基本语法
switch (表达式) {
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
default:
语句块3;
}
2. 执行流程
- 计算
switch表达式的值。 - 与各个
case常量比较。 - 匹配成功,从该
case开始执行。 - 遇到
break,跳出整个switch。 - 没有匹配,执行
default。
3. break 与穿透
忘记 break:
int x = 2;
switch (x) {
case 1: cout << "一";
case 2: cout << "二";
case 3: cout << "三";
default: cout << "其他";
}
输出:
二三其他
发生“穿透”,继续执行后面的 case。
4. switch 嵌套
switch (a) {
case 1:
switch (b) {
case 1:
cout << "11";
break;
default:
cout << "1x";
}
break;
default:
cout << "x";
}
5. switch 适用场景
| 场景 | 推荐 |
|---|---|
| 范围判断,如成绩等级 | if-else if |
| 固定取值,如运算符、月份 | switch |
| 复杂逻辑组合 | if |
| 多层分支嵌套 | 可结合 if 和 switch |
6. switch 注意事项
case后必须是常量,不能是变量。case常量不能重复。- 每个
case一般都要写break。 default处理其他情况,可选。switch表达式不能是浮点数。switch不能直接判断范围。
六、多层分支的流程图表示
1. 多分支链流程图
多个菱形判断框串联,每个分支有独立的处理框,最后汇聚到同一出口。
flowchart TD
Start(["开始"])
C1{"条件1?"}
B1["语句块1"]
C2{"条件2?"}
B2["语句块2"]
B3["语句块3"]
EndNode(["结束"])
Start --> C1
C1 -- 是 --> B1
C1 -- 否 --> C2
C2 -- 是 --> B2
C2 -- 否 --> B3
B1 --> EndNode
B2 --> EndNode
B3 --> EndNode
对应 C++ 代码:
if(条件1) {
语句块1;
} else if(条件2) {
语句块2;
} else {
语句块3;
}
2. 嵌套 if 流程图
外层判断框的一个分支内,再嵌入内层判断框。
flowchart TD
Start(["开始"])
C1{"条件1?"}
C2{"条件2?"}
B1["语句1"]
B2["语句2"]
B3["语句块3"]
EndNode(["结束"])
Start --> C1
C1 -- 是 --> C2
C1 -- 否 --> B3
C2 -- 是 --> B1
C2 -- 否 --> B2
B1 --> EndNode
B2 --> EndNode
B3 --> EndNode
对应 C++ 代码:
if(条件1) {
if(条件2) {
语句1;
} else {
语句2;
}
} else {
语句块3;
}
3. switch 流程图
switch 可表示为多路选择结构,每个 case 是一个分支,break 表示跳出。
flowchart TD
Start(["开始"])
Input[/读取switch表达式值/]
Switch{"匹配表达式值?"}
Case1["case 1:执行语句1<br>break;"]
Case2["case 2:执行语句2<br>break;"]
Case3["case 3:执行语句3<br>break;"]
Default["default:默认语句"]
EndNode(["结束"])
Start --> Input
Input --> Switch
Switch -- 值=1 --> Case1
Switch -- 值=2 --> Case2
Switch -- 值=3 --> Case3
Switch -- 其他值 --> Default
Case1 --> EndNode
Case2 --> EndNode
Case3 --> EndNode
Default --> EndNode
逻辑说明(对应 switch 语法)
- 先读取 switch 括号里的变量 / 表达式
- 菱形判断匹配值:
- 匹配 case1 → 执行 case1 语句,break 直接跳到结束,不再走其他分支
- 匹配 case2 → 执行 case2 语句,break 跳出
- 匹配 case3 → 执行 case3 语句,break 跳出
- 全都不匹配 → 执行 default 默认分支
- 所有 case、default 执行完后统一汇合到结束
C++ 示例代码
int num;
cin >> num;
switch(num)
{
case 1:
cout << "分支1";
break;
case 2:
cout << "分支2";
break;
case 3:
cout << "分支3";
break;
default:
cout << "默认分支";
}
4. switch 无 break case(重点,无 break 会顺次执行后续 case)
flowchart TD
Start(["开始"])
Input[/输入num/]
Judge{"匹配num值?"}
C1["case1:输出分支1<br>(无break)"]
C2["case2:输出分支2<br>(无break)"]
C3["case3:输出分支3<br>break;"]
Def["default:输出默认"]
End(["结束"])
Start --> Input --> Judge
Judge -- num=1 --> C1
Judge -- num=2 --> C2
Judge -- num=3 --> C3
Judge -- 其他 --> Def
C1 --> C2
C2 --> C3
C3 & Def --> End
穿透逻辑说明
- 如果
num=1:执行 case1 → 无 break,自动往下走 case2 → 再到 case3,遇到 break 才跳出 - 如果
num=2:直接执行 case2 → 往下走到 case3 再跳出 - 如果
num=3:只执行 case3 然后跳出 - 其他数字:只执行 default
C++ 穿透示例代码
int num;
cin >> num;
switch(num)
{
case 1:
cout << "分支1";
// 无break,穿透
case 2:
cout << "分支2";
// 无break,穿透
case 3:
cout << "分支3";
break; // 此处终止
default:
cout << "默认分支";
}
七、常见模型
1. 成绩等级
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";
2. 闰年判断
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
cout << "闰年";
else
cout << "平年";
3. 月份天数
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 << "月份错误";
4. 简单计算器
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 << "错误";
5. 字符分类
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 << "其他字符";
}
八、易错点
-
=与==混淆if (a = 1) // 赋值,条件恒为真 if (a == 1) // 正确 -
if后多写分号if (a > 0); // 空执行 -
花括号漏写
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忘记break
会穿透到下一个case。 -
case后使用变量case x: // 错误,必须是常量 -
switch判断范围switch (score) { case score >= 90: // 错误 } -
浮点数直接用
==比较
可能不成立。 -
输出格式错误
注意空格、换行,按题目要求输出。
九、阅读程序写结果
题目 1
int x = 15;
if (x > 10) {
if (x % 2 == 0) {
cout << "A";
} else {
cout << "B";
}
} else {
cout << "C";
}
输出:
B
题目 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 a = 3, b = 5, c = 4;
if (a > b) {
if (a > c) cout << "A";
else cout << "B";
} else {
if (b > c) cout << "C";
else cout << "D";
}
输出:
C
题目 4
int x = 2;
switch (x) {
case 1: cout << "一"; break;
case 2: cout << "二"; break;
case 3: cout << "三"; break;
default: cout << "其他";
}
输出:
二
题目 5
int x = 2;
switch (x) {
case 1: cout << "一";
case 2: cout << "二";
case 3: cout << "三";
default: cout << "其他";
}
输出:
二三其他
题目 6
char c = 'A';
if (c >= '0' && c <= '9') {
cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
cout << "大写";
} else if (c >= 'a' && c <= 'z') {
cout << "小写";
} else {
cout << "其他";
}
输出:
大写
题目 7
int y = 1900;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
cout << "闰年";
else
cout << "平年";
输出:
平年
十、编程题示例
1. 分段函数
输入 x,输出:
$f(x) = \begin{cases} 2x + 1 & x > 0 \\ 0 & x = 0 \\ -x & x < 0 \end{cases}$
#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
if (x > 0) {
cout << 2 * x + 1 << endl;
} else if (x == 0) {
cout << 0 << endl;
} else {
cout << -x << endl;
}
return 0;
}
2. 三角形判断
输入三条边,判断能否构成三角形,并输出类型。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a + b > c && a + c > b && b + c > a) {
if (a == b && b == c) {
cout << "等边三角形" << endl;
} else if (a == b || b == c || a == c) {
cout << "等腰三角形" << endl;
} else {
cout << "普通三角形" << endl;
}
} else {
cout << "不能构成三角形" << endl;
}
return 0;
}
3. 简单计算器
#include <iostream>
using namespace std;
int main() {
int a, b;
char op;
cin >> a >> op >> b;
switch (op) {
case '+': cout << a + b; break;
case '-': cout << a - b; break;
case '*': cout << a * b; break;
case '/':
if (b != 0) cout << a / b;
else cout << "除数不能为0";
break;
default: cout << "运算符错误";
}
return 0;
}
十一、速查表
| 需求 | 写法 |
|---|---|
| 多分支链 | if (条件1) { } else if (条件2) { } else { } |
嵌套 if |
if (条件1) { if (条件2) { ... } } |
避免悬空 else |
每个 if、else 加 {} |
| 合并条件 | if (a > 0 && b > 0) |
| 范围判断 | if (a > 0 && a < 10) |
switch 基本结构 |
switch (表达式) { case 常量: ... break; default: ... } |
跳出 switch |
break |
| 默认分支 | default |
| 固定取值 | 用 switch |
| 范围判断 | 用 if |
| 逻辑与 | && |
| 逻辑或 | || |
| 逻辑非 | ! |
十二、总结
多层分支是 GESP 二级分支结构的核心。
- 多层分支包括多分支链、嵌套
if、switch及嵌套。 if-else if-else从上到下判断,一真即停。- 条件顺序很重要,范围判断保证互斥。
- 嵌套
if中else配对最近未匹配的if,建议加花括号。 - 逻辑运算符可以合并条件,减少嵌套。
- 范围判断不能连写,要用
&&连接。 switch适合固定取值,case后必须是常量。switch中break不能忘,否则穿透。default处理其他情况。- 复杂逻辑优先用
if,固定取值用switch。
复习建议:多练“阅读程序写结果”和“根据条件写多分支”两类题,重点注意条件顺序、花括号、==、逻辑优先级、switch 的 break 和 default。考试中先理清题目有几种情况,再确定分支顺序,最后逐条检查条件是否互斥、是否覆盖全部情况。