Skip to content

第 9 课:双分支结构 ​

蛙蛙注意到刚刚判断商品的总价是否满 100 元,只需要一次判断即可,满足则打九折,不满足则按原价购买。但是不满足这个条件该如何用代码描述呢?

氪町博士告诉蛙蛙,可以通过双分支结构实现,即如果条件满足则打九折,否则按原价购买,代码如下:

cpp
if(a + b + c >= 100)
    cout << (a + b + c) * 0.9; // 条件满足打九折
else
    cout << a + b + c; // 不满足则输出原价

像这种结构,我们称为双分支结构,也就是有两条路可以选择。如果满足判断条件,就执行语句 1,不满足就执行语句 2,基本框架如下:

cpp
if(条件表达式) // 如果条件成立
{
    语句 1; // 条件为真时执行
}
else // 否则
{
    语句 2; // 条件为假时执行
}

9.1 实例讲解 ​

例 1:期末成绩 ​

蛙蛙期末考试结束后,心里特别没底,于是提前去问老师考试情况,老师说他的得分为 a,达到 60 分就是及格,未达到就是不及格。

蛙蛙由于本次发挥得并不好,所以只要能达到及格就很开心了,输出 happy(开心),但如果不及格还是会很难过的,输出 sad(悲伤)。

【输入格式】输入一行,一个正整数 a(0 ≤ a ≤ 100),表示蛙蛙本次期末考试的分数。

【输出格式】输出一行,如果分数达到 60 分,则输出 happy,如果没有达到则输出 sad。

【输入样例】75

【输出样例】happy

解析

  1. 达到 60 分:达到 60 分包括等于 60 分和大于 60 分,如果用 a 表示分数,达到 60 分就是 a >= 60,输出 happy。

  2. 未达到 60 分:达到 60 分的反面,即除去大于或等于 60 的情况,输出 sad,这里用 else 语句表示与之前相反的条件。

注:原书解析此处写作"输出 yes""输出 no",与题目要求的 happy、sad 及参考代码不符,疑为编写笔误,此处已按题目要求修正。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if(a >= 60) cout << "happy";
    else cout << "sad";
    return 0;
}

例 2:跳远比赛 ​

蛙蛙参加立定跳远比赛,一共有两次机会,裁判会选择最佳的成绩作为蛙蛙比赛的成绩。

【输入格式】输入一行,两个正整数 a 和 b,分别表示两次跳的成绩(取值不超过 200)。

【输出格式】输出一行,一个整数,取 a 和 b 中较高的成绩进行输出。

【输入样例】120 135

【输出样例】135

解析

  1. 判断条件:哪个远其实就是哪个数大,即判断 a 是否大于 b,如果 a > b 则输出 a,否则输出 b。

  2. 相等的情况:如果 a 和 b 相等,也需要输出一个值。如果出现 a 与 b 相等的情况,即 a == b,输出其中一个数即可,而如果判断条件是 a > b,那 a == b 这个条件其实已经包含在 else 语句内了。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a,b;
    cin >> a >> b;
    if(a > b) cout << a;
    else cout << b;
    return 0;
}

蛙蛙已经学会如何找两个数中的较大值了,他还想知道三个数中的最大值该怎么求。

氪町博士举例:假设有三个数,分别是 a、b、c,只要满足 a > b 并且 a > c,就可以证明 a 是三个数中的最大值了。

但是蛙蛙并不知道"并且"该如何表示,氪町博士告诉蛙蛙这涉及一个新知识——逻辑运算符,我们先来看看逻辑运算符是什么吧!

9.2 逻辑运算符 ​

在 C++ 中,"并且"(也就是"与")写作 &&,它是一种逻辑运算符。

逻辑运算符主要有 3 种,分别是:

  • 与(&&)
  • 或(||)
  • 非(!)

1) &&(与)

当参与运算的两个条件都为真时,结果才为真(1),否则为假(0)。

如:5 > 0 && 4 > 2

由于 5 > 0 为真,4 > 2 也为真,相"与"后的结果也为 1。

再来看一个例子:5 > 6 && 4 > 2

由于 5 > 6 为假,则不管后面为不为真,相"与"后的结果都为 0。

2) ||(或)

参与运算的两个条件中只要有一个为真,结果就为真(1);当两个量都为假时,结果为假(0)。

如:5 > 0 || 4 > 8

由于 5 > 0 已经为真,不管后面是否为真,相"或"后的结果都为 1。

再来看一个例子:5 < 0 || 4 > 8

由于 5 < 0 为假,4 > 8 也为假,相"或"后的结果为 0。

3) && 和 || 的区别

cpp
if(a > b && a > c) cout << a;

如果 a 比 b 大,a 又比 c 大,那么 a 就是最大的,也就是说,如果 a 是最大值,就输出 a。

cpp
if(a > b || a > c) cout << a;

如果 a 比 b 大,或者 a 比 c 大,只能说明 a 不是最小的。

通过对比得知,我们可利用 && 运算符来求三个数中的最大值。

4) !(非)

当参与运算的量为真时,结果为假(0);当参与运算的量为假时,结果为真(1)。

如:!(5 > 0)

由于 5 > 0 的结果为真,"非"的结果为假。

再比如:!(4 > 8)

由于 4 > 8 的结果为假,"非"的结果为真。

9.3 字母大小写判断 ​

要判断一个字母是不是大写字母,需要做的是看看这个字母是不是介于 26 个大写字母之间,即比较当前字母是不是比最小的大写字母大(含等于),并且比最大的大写字母小(含等于)。

同理,要判断一个字母是不是小写字母,也是看当前字母是不是比最小的小写字母大(含等于),并且比最大的小写字母小(含等于)。

例 3:网名 ​

克克在网购的时候想使用一个新的网名,网名只能用小写字母组成。蛙蛙帮忙找来一个字母,请你帮克克判断这个字母是不是小写字母。

是的话在控制台输出 yes,否则输出 no(输入的字母可能是大写字母也可能是小写字母)。

【输入格式】输入一行,为一个字母,这个字母可能是大写字母也可能是小写字母。

【输出格式】输出一行,yes 或者 no。

【输入样例】a

【输出样例】yes

解析

字母判断:判断是不是小写字母,需要看看这个字母是不是比最小的小写字母(a)大(包含 a),并且(&&)比最大的小写字母(z)小(包含 z)。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    char a;
    cin >> a;
    if(a >= 'a' && a <= 'z') cout << "yes";
    else cout << "no";
    return 0;
}

例 4:三人比赛 ​

蛙蛙和克克希望跟氪町博士比赛跑步,他们准备在操场上跑三圈,对三人的跑步时间分别进行记录。

已知蛙蛙跑步花费的总时间为 a,克克跑步花费的总时间为 b,氪町博士跑步花费的总时间为 c。现三人约定,只要蛙蛙和克克中有一个人能赢博士就算都赢了,请问他俩是否能赢得比赛?

【输入格式】输入一行,三个正整数 a、b、c(a ≤ 100,b ≤ 100,c ≤ 100),分别表示三人的跑步时间。

【输出格式】输出一行,yes 或者 no。

【输入样例】10 15 12

【输出样例】yes

解析

  1. 比赛规则是只要蛙蛙和克克中有一人跑步花费的时间比氪町博士少,就算蛙蛙和克克都赢了。

  2. 通过 if 语句判断 a < c || b < c 这个条件是否成立,其中 || 是逻辑或运算符,只要 a < c 和 b < c 这两个条件中有一个为真,整个表达式就为真。也就是说,只要蛙蛙或者克克的跑步时间比氪町博士短,就满足赢得比赛的条件。

  3. 如果条件为真,程序会执行 cout << "yes"; 语句,将字符串 yes 输出到控制台。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a,b,c;
    cin >> a >> b >> c;
    if(a < c || b < c) cout << "yes";
    else cout << "no";
    return 0;
}

基于 MIT 协议发布