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. 条件1不成立,判断条件2。
  3. 条件2成立,执行语句块2,结束。
  4. 依次往下。
  5. 所有条件都不成立,执行 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. 执行流程

  1. 计算 switch 表达式的值。
  2. 与各个 case 常量比较。
  3. 匹配成功,从该 case 开始执行。
  4. 遇到 break,跳出整个 switch。
  5. 没有匹配,执行 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 语法)

  1. 先读取 switch 括号里的变量 / 表达式
  2. 菱形判断匹配值:
    • 匹配 case1 → 执行 case1 语句,break 直接跳到结束,不再走其他分支
    • 匹配 case2 → 执行 case2 语句,break 跳出
    • 匹配 case3 → 执行 case3 语句,break 跳出
    • 全都不匹配 → 执行 default 默认分支
  3. 所有 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

穿透逻辑说明

  1. 如果num=1:执行 case1 → 无 break,自动往下走 case2 → 再到 case3,遇到 break 才跳出
  2. 如果num=2:直接执行 case2 → 往下走到 case3 再跳出
  3. 如果num=3:只执行 case3 然后跳出
  4. 其他数字:只执行 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 << "其他字符";
}

八、易错点

  1. = 与 == 混淆

    if (a = 1)    // 赋值,条件恒为真
    if (a == 1)   // 正确
    
  2. if 后多写分号

    if (a > 0);   // 空执行
    
  3. 花括号漏写

    if (a > 0)
        cout << "正";
        cout << "数";   // 不受 if 控制
    
  4. 悬空 else
    建议每个 if、else 都加 {}。

  5. 条件顺序错误
    范围判断从大到小或从小到大,保证互斥。

  6. 范围判断连写

    if (0 < a < 10)        // 错误
    if (a > 0 && a < 10)   // 正确
    
  7. 逻辑优先级错误

    if (a > 0 || b > 0 && c > 0)   // && 高于 ||
    

    加括号:

    if ((a > 0 || b > 0) && c > 0)
    
  8. switch 忘记 break
    会穿透到下一个 case。

  9. case 后使用变量

    case x:   // 错误,必须是常量
    
  10. switch 判断范围

    switch (score) {
        case score >= 90:   // 错误
    }
    
  11. 浮点数直接用 == 比较
    可能不成立。

  12. 输出格式错误
    注意空格、换行,按题目要求输出。

九、阅读程序写结果

题目 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 二级分支结构的核心。

  1. 多层分支包括多分支链、嵌套 if、switch 及嵌套。
  2. if-else if-else 从上到下判断,一真即停。
  3. 条件顺序很重要,范围判断保证互斥。
  4. 嵌套 if 中 else 配对最近未匹配的 if,建议加花括号。
  5. 逻辑运算符可以合并条件,减少嵌套。
  6. 范围判断不能连写,要用 && 连接。
  7. switch 适合固定取值,case 后必须是常量。
  8. switch 中 break 不能忘,否则穿透。
  9. default 处理其他情况。
  10. 复杂逻辑优先用 if,固定取值用 switch。

复习建议:多练“阅读程序写结果”和“根据条件写多分支”两类题,重点注意条件顺序、花括号、==、逻辑优先级、switch 的 break 和 default。考试中先理清题目有几种情况,再确定分支顺序,最后逐条检查条件是否互斥、是否覆盖全部情况。