Skip to content

第 8 课:单分支结构 ​

选择结构是编程中的一种基本逻辑结构,根据不同条件执行不同内容。

比如现在蛙蛙想知道今天上学需要带什么课本,已知周一有语文、英语和历史,周二有科学、数学和音乐,周三有美术、语文和道德与法治……

那么蛙蛙会根据今天是周几来选择带什么课本,比如今天是周二,那么蛙蛙只需要带科学、数学和音乐课本即可。

选择结构根据条件判断,从多个可能的执行路径中选择一条来执行。例如,刚才的例子就是根据周几的不同,来决定带什么课本去上学。这种结构使得程序能根据不同的情况做出不同的反应,增加了程序的灵活性,是实现程序逻辑控制的重要手段之一。

最近,蛙蛙在编程中取得了优异的成绩,氪町博士奖励了他 100 个积分,蛙蛙可用这笔积分换取礼物。他看中了一个物品,但是不知需要花费多少个积分。如果这件物品的价格不大于 100 个积分,蛙蛙就能如愿以偿地把它带回家。判断价格不大于 100 个积分,满足条件即可获得物品,就是一个单分支结构。

所谓单分支结构,就是只有一条路可以选择,如果满足条件,就执行语句,不满足就跳过单分支结构的语句。

再来说一下单分支结构的基本框架:

cpp
if(条件表达式)
{
    语句 1;
    ……
}

解释:如果条件表达式的值为真,即条件成立,语句 1 及大括号内的其他语句将被执行。否则,大括号内的语句将被忽略(不被执行),程序将按顺序从整个选择结构之后的下一条语句继续执行。

若变量 coin 用来表示某物品所需的积分数,用单分支结构描述如下:

cpp
if(coin <= 100)
{
    cout << "success"; // success 表示成功获得此物品
}

解释:如果这件物品的价格不大于 100 个积分,则条件成立,那么程序就会执行大括号里面的输出语句;如果这件物品的价格大于 100 个积分,那么程序就会直接跳过大括号里面的语句。

8.1 条件表达式和关系运算符 ​

刚刚我们所用的 coin <= 100 就叫作条件表达式,也就是把判断条件用关系式的方式表达出来。一般来说,条件表达式由两个部分组成,通过比较它们的大小来得出判断结果。例如:

a > 0 或 a + 10 <= b。

条件表达式中的 > 和 <= 符号,称为关系运算符。

常见的关系运算符有 6 种,分别是:

  • 大于(>)、小于(<);
  • 大于或等于(>=)、小于或等于(<=);
  • 等于(==)、不等于(!=)。

上述这些符号可以比较两个数字或者表达式的大小。

关系运算符的运算结果通常是布尔(Boolean)类型。布尔类型只有两个值,取值为 true(真)或 false(假),但是在 C++ 里输出时 true 显示为 1,false 显示为 0。

  • 0:代表关系不成立(假)。
  • 1:代表关系成立(真)。

代码展示:

cpp
if(a > 0) // 判断 a 是不是正数
{         // 大括号内的语句都需要判断后才能知道是否执行
    cout << a; // 执行语句
}
cout << endl; // 不受条件判断影响

注意:如果大括号内只有一条语句,那么大括号是可以省略的。即:

cpp
if(a > 0) cout << a;
cout << endl;

上面两行代码与之前代码所表述的内容一致。

例 1:超市购物 ​

在一次超市促销中,巧克力和橡皮糖都是 30 元一包,蛙蛙妈妈发现两包的重量不一样,于是让超市阿姨帮忙称了一下两包糖果的重量,果然不一样,分别为 a(巧克力重量)和 b(橡皮糖重量)。

最后妈妈决定买重量更大的那包糖果,请问妈妈最后买的是巧克力还是橡皮糖?(1 ≤ a ≤ 10,1 ≤ b ≤ 10,a 不等于 b)

【输入格式】输入一行,两个整数 a 和 b,分别表示两包物品的重量。

【输出格式】输出一行,chocolate(用来表示巧克力)或者 candy(用来表示橡皮糖)。

【输入样例】5 3

【输出样例】chocolate

解析

  1. 声明两个变量 a 和 b,分别表示巧克力的重量和橡皮糖的重量。

  2. 使用 if 语句进行判断,用于判断条件表达式 a > b 是否为真。如果 a 的值大于 b 的值,说明巧克力更重,那么执行 cout << "chocolate"; 语句。

  3. 如果 b 的值大于 a 的值,说明橡皮糖更重,那么执行 cout << "candy"; 语句。

  4. 题目已知巧克力和橡皮糖重量不一样,所以不用考虑一样的情况。

参考代码

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

8.2 奇偶数问题 ​

要判断一个整数是不是偶数,只要判断这个数能不能被 2 整除即可。

如果一个整数 a 除以 2 没有余数,那么这个数就是偶数;如果一个整数除以 2 有余数,那么这个数就是奇数。

cpp
if(a % 2 == 0) // a 是偶数
if(a % 2 == 1) // a 是奇数

例 2:抽奖活动 ​

蛙蛙准备参加一场抽奖活动,已知抽到偶数号才能进入下一轮继续抽奖,他想知道自己是否晋级,是的话在屏幕上输出 yes,否则输出 no。

【输入格式】输入一行,一个整数 a,表示抽奖的数(1 ≤ a ≤ 100)。

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

【输入样例】15

【输出样例】no

解析

  1. 输入一个整数,判断该整数是否为偶数。如果是偶数,意味着蛙蛙可以晋级下一轮抽奖,程序将在屏幕上输出 yes;如果是奇数,则蛙蛙不能晋级,程序将输出 no。

  2. 使用 if 语句来判断条件表达式 a % 2 == 0 是否为真。如果余数为 0,说明 a 是偶数,满足晋级条件,那么执行 cout << "yes"; 语句,将字符串 yes 输出到标准输出。

  3. 再使用一个 if 条件判断语句,判断 a 除以 2 的余数是否为 1。如果余数为 1,说明 a 是奇数,不满足晋级条件,那么执行 cout << "no"; 语句,将字符串 no 输出到标准输出。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if(a%2 == 0) cout << "yes";
    if(a%2 == 1) cout << "no";
    return 0;
}

8.3 位数判断 ​

已知一个数是小于 100 的正整数,那么该如何判断这个数是一位数还是两位数呢?

其实只需要判断这个数是不是比最小的两位数大就可以了。

即:如果这个数比最小的两位数(10)大,说明这个数是两位数,否则这个数是一位数。

例 3:考试名次 ​

蛙蛙的期中考试成绩出来了,他想知道自己有没有拿到一位数的名次,如果是的话在控制台上输出 yes。

【输入格式】输入一行,一个正整数 a(0 < a < 100),表示考试名次。

【输出格式】输出一行(yes),或者不输出。

【输入样例】5

【输出样例】yes

解析

  1. 输入蛙蛙期中考试的名次,判断该名次是否为一位数。如果是一位数(即小于 10),则在控制台输出 yes,如果不是一位数,则不进行任何输出。

  2. 通过 if 条件判断语句,判断 a < 10 这个条件是否成立。若 a 的值小于 10,说明蛙蛙的名次是一位数,此时执行 cout << "yes"; 语句,将字符串 yes 输出到控制台。

  3. 无须判断 a 大于或等于 10 的情况。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if(a < 10) cout << "yes";
    return 0;
}

8.4 打折问题 ​

蛙蛙去超市买东西,恰巧碰到超市促销,全场商品均打九折,蛙蛙大喜!

于是他买了 100 元的东西。结账的时候蛙蛙准备付 10 块,你觉得他给对了吗?

解答:不对,打折是在原来售价的基础上降价销售,几折则表示实际售价占原来售价的几成。如九折,就是原先价格的基础上乘 0.9。

所以 100 元的商品应该付的正确的价钱是:100 × 0.9 = 90 元。

例 4:超市打折 ​

蛙蛙去超市买东西,恰好赶上超市特价优惠,总价满 100 元打九折。蛙蛙一共买了三样物品,价格分别是 a、b、c,请问他最终应该付多少钱呢?(a、b、c 均在 1 和 100 之间。)

【输入格式】输入一行,三个整数 a、b、c,分别表示三样物品的价格。

【输出格式】输出一行,一个数,表示最终支付的总价。

【输入样例】50 40 20

【输出样例】99

解析

  1. 若购买物品的总价满 100 元,则总价打九折;若不满 100 元,则按原价支付。

  2. 声明三个整型变量 a、b 和 c,用于存储蛙蛙购买的三样物品的价格,再分别输入这三个变量。

  3. 通过 if 语句进行判断,判断 a + b + c >= 100 这个条件是否成立。如果成立,说明蛙蛙购买物品的总价满 100 元,满足超市的打折条件。此时,程序会计算 (a + b + c) * 0.9,即总价打九折后的金额,并使用 cout 将结果输出。

  4. 继续使用 if 语句进行判断,判断 a + b + c < 100 是否成立,若条件成立,说明蛙蛙购买物品的总价没有达到 100 元,则不会打折,直接输出结果即可。

参考代码

cpp
#include <iostream>
using namespace std;
int main()
{
    int a,b,c;
    cin >> a >> b >> c;
    if(a + b + c >= 100) cout << (a + b + c) * 0.9;
    if(a + b + c < 100) cout << a + b + c;
    return 0;
}

思考:通过上述例子,蛙蛙发现,如果商品总价是 99 元,他需要付 99 元,而如果买了总价为 110 元的物品,也只需要付 99 元。所以蛙蛙觉得如果买了 99 元物品,还能再挑选 11 元的物品凑单,因为最终所付的金额是一样的。

基于 MIT 协议发布