嵌套

我们已经学习完简单的分支结构,但是我们发现,生活中的事情并不是非黑即白的,只通过简单的 ifelse 似乎无法完成复杂的条件判断。接下来我们将学习如何实现这些较为复杂的条件判断。

洛谷 P5714

本题需要计算 BMI 指数,直接按照给出的公式计算即可,关键是如何根据不同的区间来分类。

我们仍然可以使用 if 语句。注意到,这里需要针对三个情况进行判断,而非两种情况。因此,我们引出 else if 结构。

通过 else if 可以同时对多个条件进行判断,组成更复杂的条件分支,基本结构如下:

if (条件 1) {
    条件 1 成立时执行语句;
} else if (条件 2) {
    条件 2 成立时执行语句;
} ...
else {
    条件 1 与条件 2 均不成立时执行语句;
}

值得注意的是,else if 可以写无限多个(即上面代码中省略号的含义),也就是说,有了 else if,我们就可以同时判断许多并列的条件了。

于是上面的问题就可以写出代码了:

#include <iostream>
using namespace std;
int main() {
    double m, h, BMI;
    cin >> m >> h;
    BMI = m / h / h;
    if (BMI < 18.5) cout << "Underweight" << endl;
    else if (BMI < 24) cout << "Normal" << endl;
    else {
        cout << BMI << endl << "Overweight" <<endl;
    } return 0;
}
现在我们还想知道,对于 BMI 低于 $18.5$ 的同学,他的身高 $h$ 是否超过 $1.6$ 米,如果是则输出 $\texttt{Tall}$,否则输出 $\texttt{Short}$。

对于这个问题,我们需要先判断 BMI 是否符合条件,再判断身高,这并非我们刚才提到的并列关系。此时与使用 else if 的情况又不同了。

可以发现,上文提到的 else if 实际上是判断 else 以后进入了一个新的 if,所以当我们为它加上大括号,这一处分支的结构就变成了这样。

if (条件 1) {
    条件 1 成立时执行语句;
} else {
    if (条件 2) {
        条件 2 成立时执行语句;
    }
}

这样在 ifelse 中套了一个新的 ifelse 的行为被称为嵌套。当然,我们仍然可以在嵌套中继续添加嵌套。

对于上面的问题,我们使用嵌套的分支结构,首先判断 BMI 是否低于 $18.5$,然后再判断身高即可。

if (BMI < 18.5) {
    cout << "Underweight" << endl;
    if (h > 1.6) cout << "Tall" << endl;
    else cout << "Short" << endl;
}

while 循环

洛谷 P5720

可以发现,我们前面学过的顺序结构与分支结构都无法解决这道题(除非写好几十个 if)。这时应该怎么办呢?

很好想,解决这道题的中心思想,其实就是一直给这个数除以 $2$。这里的「一直」,就是这道题的关键。

当我们想要重复执行某个语句时,就需要用到循环结构。循环,顾名思义,它可以反复执行同样的语句,这样就可以大大减少代码的长度。以下是循环结构的流程图:

我们先来介绍第一种循环:while 循环

while 循环的结构为:

while (循环条件) {
    循环体
}

与我们之前学过的 if 相同,while 循环同样是在小括号 ( ) 里写下循环需要进行的条件,C++ 将会在每次循环开始时判断条件是否成立;在大括号 { } 里写下条件成立时需要执行的代码块,这个代码块被称为循环体。当然,如果循环体只有一个语句,这里的大括号同样可以省略。

注意到,小括号里只有循环成立的条件,而没有指定循环的次数,是通过条件是否成立判断循环是否继续的。因此,while 循环常用于不知道循环次数的循环。

题目中让我们求「第几天的时候木棍长度变为 $1$」,这就告诉我们循环的条件是「木棍长度大于 $1$」(或是「木棍长度不等于 $1$」)。我们在每一轮循环都对木棍的长度除以 $2$,并且给天数加上 $1$ 即可。代码如下:

while (a > 1) {
    a /= 2;  // 等价于 a = a / 2;
    ++ans;   // 等价于 ans++; 或 ans += 1; 或 ans = ans + 1;
}

在上面的代码中,我们使用 $a$ 存储木棍的长度,使用 $ans$ 存储答案(即天数)。从现在开始,为了提升同学们独立编写代码的能力,我们将只给出核心代码,剩下的部分请自主完成。


分支结构与循环结构是 OI 中非常重要的知识点,若不熟练掌握将寸步难行,请各位尽力学习并理解循环结构。

最后修改:2025 年 03 月 12 日
如果觉得我的文章对你有用,请随意赞赏