- juxq 的博客
分支结构教学讲义
- @ 2026-4-3 22:40:51
分支结构教学讲义
1. 分支结构简介
1.1 分支结构定义
分支结构(Selection Structure):一种程序控制结构,根据条件表达式的真假,选择执行不同的代码路径。它使得程序能够应对多种输入情况,实现“判断-决策”的逻辑。
分支结构是程序设计三大基本结构(顺序、分支、循环)之一。没有分支结构的程序只能线性执行,无法处理复杂的现实问题。
图示:基本分支流程
┌─────────────┐
│ 开始执行 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 判断条件 │
└──────┬──────┘
│
┌────────┴────────┐
│ 真(True) │ 假(False)
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 分支A代码 │ │ 分支B代码 │
└──────┬──────┘ └──────┬──────┘
└────────┬────────┘
▼
┌─────────────┐
│ 继续执行 │
└─────────────┘
1.2 条件表达式
条件表达式:计算结果为布尔值(
true或false)的表达式。分支语句根据该值决定程序流向。
C++ 中的条件表达式通常使用关系运算符和逻辑运算符构成。
关系运算符(用于比较两个值):
| 运算符 | 含义 | 示例 |
|---|---|---|
== |
等于 | a == b |
!= |
不等于 | a != b |
> |
大于 | a > b |
< |
小于 | a < b |
>= |
大于等于 | a >= b |
<= |
小于等于 | a <= b |
逻辑运算符(用于组合多个条件):
| 运算符 | 含义 | 示例 |
|---|---|---|
&& |
逻辑与 | a > 0 && a < 10 |
|| |
逻辑或 | a < 0 || a > 100 |
! |
逻辑非 | !(a == b) |
注意:C++ 中任何非零值都会被隐式转换为
true,零值转换为false。
2. 分支结构的基本形式
2.1 if 语句
if语句:最简单的分支结构。如果条件为真,则执行其后代码块;否则跳过该代码块。
图示:
条件成立?
│
┌───┴───┐
是 否
│ │
▼ │
执行代码 │
│ │
└───┬───┘
▼
代码模型:
#include <bits/stdc++.h>
using namespace std;
int main() {
if (条件表达式) {
// 条件为真时执行的语句
}
return 0;
}
示例:
#include <bits/stdc++.h>
using namespace std;
int main() {
int score = 85;
if (score >= 60) {
cout << "及格了!" << endl;
}
// 无论是否及格,程序都会继续
cout << "考试结束" << endl;
return 0;
}
2.2 if-else 语句
if-else语句:二分支结构。条件为真时执行if块,否则执行else块。
图示:
条件成立?
│
┌───┴───┐
是 否
│ │
▼ ▼
执行if块 执行else块
│ │
└───┬───┘
▼
代码模型:
#include <bits/stdc++.h>
using namespace std;
int main() {
if (条件表达式) {
// 条件为真时执行
} else {
// 条件为假时执行
}
return 0;
}
示例:
#include <bits/stdc++.h>
using namespace std;
int main() {
int age;
cout << "请输入年龄:";
cin >> age;
if (age >= 18) {
cout << "已成年,可以进入。" << endl;
} else {
cout << "未成年,禁止进入。" << endl;
}
return 0;
}
2.3 else-if 阶梯(多分支)
else-if结构:用于处理多个互斥的条件。从上到下依次判断,一旦某个条件满足,执行对应代码块并跳出整个结构。
图示:
条件1? ──是──→ 执行代码块1
│否
▼
条件2? ──是──→ 执行代码块2
│否
▼
条件3? ──是──→ 执行代码块3
│否
▼
否则 ──────→ 执行else块
代码模型:
#include <bits/stdc++.h>
using namespace std;
int main() {
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件1为假且条件2为真时执行
} else if (条件3) {
// 条件1、2为假且条件3为真时执行
} else {
// 所有条件均为假时执行
}
return 0;
}
示例:成绩等级评定
#include <bits/stdc++.h>
using namespace std;
int main() {
int score;
cout << "请输入成绩(0-100):";
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 << "等级:F" << endl;
}
return 0;
}
2.4 switch 语句
switch语句:用于基于单个整型(或可隐式转换为整型的类型)表达式的多分支选择。当分支条件较多且基于等值判断时,switch比else-if更清晰。
图示:
switch(表达式)
│
┌────────┼────────┬────────┐
▼ ▼ ▼ ▼
case值1 case值2 case值3 default
│ │ │ │
▼ ▼ ▼ ▼
代码块1 代码块2 代码块3 默认代码
│ │ │ │
└────┬───┴────┬───┴────┬───┘
▼ ▼ ▼
break break break
└────────┴────────┘
▼
代码模型:
#include <bits/stdc++.h>
using namespace std;
int main() {
switch (表达式) {
case 常量1:
// 代码块1
break;
case 常量2:
// 代码块2
break;
// ... 可以有多个 case
default:
// 默认代码块
break;
}
return 0;
}
示例:根据数字输出星期几
#include <bits/stdc++.h>
using namespace std;
int main() {
int day;
cout << "请输入数字(1-7):";
cin >> day;
switch (day) {
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
case 3:
cout << "星期三" << endl;
break;
case 4:
cout << "星期四" << endl;
break;
case 5:
cout << "星期五" << endl;
break;
case 6:
cout << "星期六" << endl;
break;
case 7:
cout << "星期日" << endl;
break;
default:
cout << "输入无效,请输入1~7的数字。" << endl;
break;
}
return 0;
}
注意:每个
case结尾的break不能省略,否则会发生“穿透”(fall-through),继续执行下一个case的代码。
2.5 嵌套分支
嵌套分支:在分支结构的代码块内部再使用另一个分支结构。用于处理多层逻辑判断。
代码模型:
#include <bits/stdc++.h>
using namespace std;
int main() {
if (外层条件) {
if (内层条件) {
// 外层和内层都满足时执行
} else {
// 外层满足,内层不满足时执行
}
} else {
// 外层不满足时执行
}
return 0;
}
示例:判断闰年(嵌套版本)
#include <bits/stdc++.h>
using namespace std;
int main() {
int year;
cout << "请输入年份:";
cin >> year;
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0) {
cout << year << " 是闰年。" << endl;
} else {
cout << year << " 不是闰年。" << endl;
}
} else {
cout << year << " 是闰年。" << endl;
}
} else {
cout << year << " 不是闰年。" << endl;
}
return 0;
}
3. 典型例题
例题1:闰年判断
题目描述
给定一个年份
y,判断它是否为闰年。闰年的判断规则:
- 能被4整除但不能被100整除的年份是闰年;
- 能被400整除的年份也是闰年。
输入:一个整数
y() 输出:如果是闰年输出"YES",否则输出"NO"。
思路解析
这道题考察复合条件的逻辑组合。将题目中的两条规则用逻辑表达式描述:
- 条件1:
(y % 4 == 0 && y % 100 != 0) - 条件2:
(y % 400 == 0)
只要满足其中任意一条即为闰年,因此用 || 连接:(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)。
注意运算符优先级:算术运算符 % 高于关系运算符 ==、!=,关系运算符高于逻辑运算符 &&、||。当前表达式已足够清晰,也可以加括号明确。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
int y;
cin >> y; // 读取年份
// 判断闰年条件
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
cout << "YES" << endl; // 是闰年
} else {
cout << "NO" << endl; // 不是闰年
}
return 0;
}
例题2:三个数排序(输出升序)
题目描述
输入三个互不相等的整数
a、b、c,将它们按从小到大顺序输出,中间用空格隔开。输入:一行三个整数,范围在 到 之间。 输出:一行三个整数,升序排列。
思路解析
本题有多种解法。使用分支结构,可以通过比较和交换来实现。这里提供一种“穷举所有大小关系”的方法:分别找出最小值、中间值和最大值。
- 先比较
a和b,再比较a和c,以及b和c,确定三者顺序。或者: - 用三个变量
min_val、mid_val、max_val,通过嵌套if判断六种可能的大小顺序。
另一种更简洁的思路(利用分支交换):
- 如果
a > b,交换a和b(保证a <= b) - 如果
a > c,交换a和c(此时a成为最小值) - 如果
b > c,交换b和c(此时b <= c)
最终 a <= b <= c。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
// 第一轮:让 a 成为 a,b 中较小的
if (a > b) {
swap(a, b); // swap 是标准库函数,交换两数
}
// 第二轮:让 a 成为 a,c 中较小的(此时 a 是最小值)
if (a > c) {
swap(a, c);
}
// 第三轮:此时 a 已最小,只需保证 b <= c
if (b > c) {
swap(b, c);
}
// 输出升序结果
cout << a << " " << b << " " << c << endl;
return 0;
}
注意:
swap(a, b)包含在<bits/stdc++.h>中,可以直接使用。
例题3:计算器(四则运算)
题目描述
编写一个简易计算器,输入两个整数
x和y,以及一个运算符op(+、-、*、/)。根据运算符输出运算结果。除法运算要求结果为浮点数,保留两位小数。若除数为0,输出"Divisor cannot be zero.";若运算符非法,输出"Invalid operator."。输入:第一行两个整数
x和y,第二行一个字符op。 输出:运算结果或错误信息。
思路解析
本题考察多分支(switch 或 else-if)的使用,以及浮点数处理和边界情况判断。
- 使用
switch根据op的值执行不同分支。 - 注意除法:需要将其中一个操作数转为浮点数(如
1.0 * x / y),否则整数除法会截断小数。 - 除法还需判断除数
y是否为0。 - 默认分支处理非法运算符。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y;
char op;
cin >> x >> y;
cin >> op; // 读取运算符
switch (op) {
case '+':
cout << x + y << endl;
break;
case '-':
cout << x - y << endl;
break;
case '*':
cout << x * y << endl;
break;
case '/':
if (y == 0) {
cout << "Divisor cannot be zero." << endl;
} else {
// 保留两位小数输出
cout << fixed << setprecision(2) << 1.0 * x / y << endl;
}
break;
default:
cout << "Invalid operator." << endl;
break;
}
return 0;
}
知识点:
fixed和setprecision(2)配合使用可固定小数位数为2。这两个函数在<bits/stdc++.h>中已包含。
4. 总结
分支结构是赋予程序“智能”的关键。通过本讲学习,应掌握:
| 分支类型 | 适用场景 | 时间复杂度 |
|---|---|---|
if |
单一条件,可选执行 | O(1) |
if-else |
二选一 | |
else-if |
多个互斥条件,基于范围或复杂逻辑 | |
switch |
多个等值分支,且条件为整型/枚举 | |
| 嵌套分支 | 多层级逻辑判断 |
核心技巧:
- 条件表达式要写完整,注意边界情况(如
>=还是>)。switch中不要忘记break,除非刻意穿透。- 复杂逻辑用括号明确优先级,提高可读性。
- 浮点数比较请避免直接用
==,改用差值绝对值小于精度阈值的方法。
5. 练习题目
- P5715 【深基3.例8】三位数排序 —— 三个数排序
- P5711 【深基3.例3】闰年判断 —— 闰年判断
- P5714 【深基3.例7】肥胖问题 —— BMI 计算与分支
- P2433 【深基1-2】小学数学 N 合一 —— 多种分支判断
- P1909 [NOIP2016 普及组] 买铅笔 —— 简单多分支决策
参考资料
- 【文章】C++ 条件语句 - 菜鸟教程
- 【文章】分支结构 - OI Wiki
- 【书籍】《C++ Primer Plus》(第6版)第6章:分支语句和逻辑运算符
- 【书籍】《信息学奥赛一本通》第2章:顺序结构与分支结构