Skip to content

第 10 课:选择嵌套结构 ​

目前所学的单分支结构和双分支结构只能解决单个选择或两个选择的情况,若遇到多个选择,我们可以使用多分支结构和选择嵌套结构。

现在我们先来学习选择嵌套结构。所谓选择嵌套,其实就是多个 if 结构嵌套在一起,主要用于一件事情有多个选择的时候。

例如,在一个十字路口选择往哪儿走这个问题,就有四种选择,而单独的 if ... else 语句只能二选一,不能对应四选一的情况,但是我们可以通过选择嵌套来解决这个问题。

10.1 选择嵌套框架 ​

常见的选择嵌套框架有三种,如下所示。

1) 框架一

cpp
if(条件 1)
{
    if(条件 2)
        语句 11; // 条件 1 和条件 2 都满足,执行语句 11
    else
        语句 12; // 满足条件 1,不满足条件 2,执行语句 12
}
else
    语句 2; // 不满足条件 1,执行语句 2

2) 框架二

cpp
if(条件 1)
    语句 1; // 满足条件 1,执行语句 1
else // 表示括号内的语句都否定了条件 1
{
    if(条件 2)
        语句 21; // 不满足条件 1,满足条件 2,执行语句 21
    else
        语句 22; // 不满足条件 1,也不满足条件 2,执行语句 22
}

3) 框架三

cpp
if(条件 1)
{
    if(条件 2)
        语句 11; // 满足条件 1,也满足条件 2,执行语句 11
    else
        语句 12; // 满足条件 1,不满足条件 2,执行语句 12
}
else
{
    if(条件 3)
        语句 21; // 不满足条件 1,满足条件 3,执行语句 21
    else
        语句 22; // 不满足条件 1,也不满足条件 3,执行语句 22
}

注意:无论是哪种选择嵌套结构,都要求把多条路先分成两条大路,然后根据要求把每条大路再分成很多小路,很像是树枝。

10.2 实例讲解一 ​

例 1:极速逃亡 ​

蛙蛙最近开发了一款名叫"极速逃亡"的游戏,请你帮助蛙蛙完善一个模拟登录的程序。

用户的登录名和密码都是六位数,如果用户名和密码都输入正确,则输出欢迎语句 welcome;如果用户名错误,则输出 wrong name;如果在用户名正确的情况下密码错误,则输出 wrong password。

蛙蛙的用户名:123456 密码:654321

【输入格式】输入一行,两个六位正整数,分别表示用户名和密码。

【输出格式】输出一行。如果用户名和密码全部匹配,输出 welcome;如果用户名错误,直接输出 wrong name;如果用户名正确但密码错误,输出 wrong password。

【输入样例】123456 654321

【输出样例】welcome

解析

  1. 若登录成功,即输入的用户名为 123456、输入的密码为 654321 全部匹配成功,输出 welcome。

  2. 若登录失败,则分两种情况:一是用户名不正确,即输入的用户名不是 123456,则直接输出 wrong name;二是用户名正确,但密码不正确,输出 wrong password。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int A = 123456,B = 654321;
    int a,b;
    cin >> a >> b;
    if(a == A)
    {
        if(b == B) cout << "welcome";
        else cout << "wrong password";
    }
    else cout << "wrong name";
    return 0;
}

例 2:成绩公布 ​

为避免公布成绩让学生产生较大的心理压力,从而影响到学习积极性和生活状态,蛙蛙所在的学校决定不按照分数来公布成绩,而是按照不及格和及格(及格又分为良好和优秀)的方式来公布成绩。

决定如下:得分在 60(含)和 100(含)之间的同学,首先会被判定为 Yes,若有些同学是在 80(含)和 100(含)之间还会被评为优秀,判定为 A,若没有达到 80,则评为合格,被判定为 B;如果分数没有达到 60,则直接被判定为 No。

已知蛙蛙这次考试得分为 a,现在请问他能不能通过测试,如果通过了是优秀还是合格呢?

【输入格式】输入一行,一个正整数 a(0 ≤ a ≤ 100)。

【输出格式】输出一行。若蛙蛙及格了,输出 Yes A 或者 Yes B,用空格隔开;若蛙蛙没有及格,则直接输出 No。

【输入样例】80

【输出样例】Yes A

解析

  1. 如果蛙蛙的分数大于或者等于 60,那么需要先输出 Yes 和空格。

  2. 然后判断蛙蛙的分数是否大于或者等于 80,如果条件成立,则输出 A,否则输出 B。

  3. 如果蛙蛙的分数小于 60,那就是第一个条件的反面,也就是在 else 语句内直接输出 No 就可以了。

  4. 注意输出的格式,Yes 和 No 都是首字母大写、其他字母小写的。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    double a;
    cin >> a;
    if (a >= 60)
    {
        cout << "Yes" << " ";
        if (a >= 80) cout << "A";
        else cout << "B";
    }
    else cout << "No";
    return 0;
}

10.3 三角形的成立条件 ​

如何依靠给定的三条线段的长度来判断这三条线段是否能组成一个三角形呢?三角形成立要求任意两边之和大于第三边。

例如三边长度分别为 a、b、c,那么 a + b > c、a + c > b、b + c > a 都需要同时满足,a、b、c 才能组成一个三角形。

10.4 实例讲解二 ​

例 3:等腰三角形 ​

输入三角形的三条边的长度,判断它是不是等腰三角形。如果是等腰三角形,则输出 YES,否则输出 NO,若根本形成不了三角形,则输出 N。(三边长度均在 1 和 10 之间。)

【输入格式】输入一行,三个正整数 a、b、c,分别表示三边的长度。

【输出格式】输出一行,YES 或者 NO 或者 N。

【输入样例】3 4 5

【输出样例】NO

解析

  1. 判断是不是三角形:首先要判断这三条边是否能构成三角形,即是否满足任意两边之和大于第三边的条件。

  2. 判断是不是等腰三角形:除了满足任意两边之和大于第三边外,还需要判断是否有两边相等。如果条件全部满足,则是等腰三角形。

参考代码

cpp
#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 || a == c || b == c) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    else cout << "N" << endl;
    return 0;
}

例 4:字符判断 ​

输入一个字符。如果是小写英文字母,将其转换为大写字母输出;如果是大写英文字母,将其转换为小写字母输出;如果不是英文字母,则原样输出。

【输入格式】输入一行,仅一个字符。

【输出格式】输出一行,为被转换之后的字符。

【输入样例】a

【输出样例】A

解析

  1. 小写字母:如果这个字符是小写字母,即在 a 和 z 之间,则将这个字母减去 32 以转换成大写字母。

  2. 不是小写字母:如果这个字符在 A 和 Z 之间,则将其转换成小写字母,否则直接输出这个字符。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a;
    cin >> a;
    if(a >= 'a' && a <= 'z') cout << char(a - 32);
    else
    {
        if(a >= 'A' && a <= 'Z') cout << char(a + 32);
        else cout << a;
    }
    return 0;
}

例 5:导航系统 ​

随着道路导航系统越来越完善,蛙蛙已经感受到了它的神奇,于是想学习导航系统的原理。氪町博士准备先教他一些基础知识。

假设现在在一个十字路口处,车子可以向四个方向行驶,会收到 1、2、3、4 这四个方向信息。如果接收到的是 1,就向右走,2 就是向前走,3 就是向左走,4 就是向后走。

氪町博士要求蛙蛙能够判断下一个信息要求向什么方向走。

【输入格式】输入一行,一个正整数 a(1 ≤ a ≤ 4)。

【输出格式】输出一行,为对应的方向,qian(前)/hou(后)/zuo(左)/you(右)。

【输入样例】1

【输出样例】you

解析

  1. 判断左右:a 对 2 取余,若余数为 1,则可能是向右走或者向左走,如果 a 是 1 则向右,否则向左。

  2. 判断前后:a 对 2 取余,若余数为 0,则可能是向前走或者向后走,如果 a 是 2 则向前,否则向后。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if (a % 2 == 1)
    {
        if (a == 1)
            cout << "you";
        else
            cout << "zuo";
    }
    else
    {
        if (a == 2)
            cout << "qian";
        else
            cout << "hou";
    }
    return 0;
}

注意:上述这种写法主要是氪町博士为了让大家更好地了解选择嵌套结构而写的,实际上也可以直接使用 4 个 if 语句来判断,或者如果你有其他想法,也可以大胆告诉氪町博士。

基于 MIT 协议发布