嵌套
我们已经学习完简单的分支结构,但是我们发现,生活中的事情并不是非黑即白的,只通过简单的 if
与 else
似乎无法完成复杂的条件判断。接下来我们将学习如何实现这些较为复杂的条件判断。
洛谷 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 成立时执行语句;
}
}
这样在 if
或 else
中套了一个新的 if
或 else
的行为被称为嵌套。当然,我们仍然可以在嵌套中继续添加嵌套。
对于上面的问题,我们使用嵌套的分支结构,首先判断 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 中非常重要的知识点,若不熟练掌握将寸步难行,请各位尽力学习并理解循环结构。