分支结构教学讲义

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,判断它是否为闰年。闰年的判断规则:

  1. 能被4整除但不能被100整除的年份是闰年;
  2. 能被400整除的年份也是闰年。

输入:一个整数 y(1≤y≤99991 \le y \le 9999) 输出:如果是闰年输出 "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,将它们按从小到大顺序输出,中间用空格隔开。

输入:一行三个整数,范围在 −106-10^6 到 10610^6 之间。 输出:一行三个整数,升序排列。

思路解析

本题有多种解法。使用分支结构,可以通过比较和交换来实现。这里提供一种“穷举所有大小关系”的方法:分别找出最小值、中间值和最大值。

  • 先比较 a 和 b,再比较 a 和 c,以及 b 和 c,确定三者顺序。或者:
  • 用三个变量 min_val、mid_val、max_val,通过嵌套 if 判断六种可能的大小顺序。

另一种更简洁的思路(利用分支交换):

  1. 如果 a > b,交换 a 和 b(保证 a <= b)
  2. 如果 a > c,交换 a 和 c(此时 a 成为最小值)
  3. 如果 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. 练习题目

参考资料