信奥竞赛

系列

剑指信奥 | C++ 之流程控制

剑指信奥 | C++ 之流程控制

流程控制

程序的运行有三种主要的结构,在我们之前写的程序里,代码都是从上到下依次执行的,这就是最为简单的 顺序结构

然而,在更多的情况下,程序的执行并不都是平平顺顺的。

就像人们走路一样,有的时候会有岔路口,需要做一下判断,我们应该走那条路,这就是程序运行的 选择结构

有的时候又像逛商场,需要绕上好几圈来挑选商品,这就是程序运行的 循环结构

选择结构和循环结构,我们在 C 语言中都讲过,C++ 的选择和循环与 C 语言是完全一致的,可以参见这两篇文章:

选择结构:

剑指信奥 | C 语言之新年快乐

循环结构:

剑指信奥 | C 语言之不知疲倦的小机器

今天,我们学习 C++ 的流程控制,会补充介绍一些之前没有涉及到的内容。

多分枝选择结构

我们看一份简单的含有选择结构的代码:

#include <iostream>

using namespace std;

int main() {

int x, y;
char o;

cin >> x >> y >> o;

if (o == '+') {
cout << "x + y = " << x + y << endl;
}

return 0;
}

/*
input:
123 456 +
output:
x + y = 579
*/

这份代码的含义很简单,接收用户输入的两个数和一个运算符,如果运算符是 +,就输出两个数的和。

如果我们进一步要求,对于加减乘除和模运算都可以进行计算并输出结果,应该怎么做?

当然,我们都知道,这个用 if...else if...else 结构也可以实现,判断五种情况就可以了。

但在这种情况下,更加推荐使用 C++ 的另外一种选择结构,就是 多分枝选择结构 switch...case,它通常比 if 执行的快,并且代码更加清晰易读。

以下是使用 switch...case 实现的过程:

#include <iostream>

using namespace std;

int main() {

int x, y;
char o;

cin >> x >> y >> o;

switch (o) {
case '+':
cout << "x + y = " << x + y << endl;
break;
case '-':
cout << "x - y = " << x - y << endl;
break;
case '*':
cout << "x * y = " << x * y << endl;
break;
case '/':
cout << "x / y = " << x / y << endl;
break;
case '%':
cout << "x % y = " << x % y << endl;
break;
default:
cout << "operator is error." << endl;
break;
}

return 0;
}

/*
input:
99 79 %
output:
x % y = 20
*/

这样,我们就实现了关于 x 和 y 的五种运算。

或许你已经注意到了,在每一个 case 的后面,都有一个 break,它的含义是终止或中断。

一旦当前 case 内部的代码执行完成,遇到了 break 就会退出这个 switch...case 结构,这个关键字我们一会还会提到。

另外一个地方就是在最后,我们使用了一个关键字 -default,它表示以上 case 都不匹配时,我们的所做的处理。

良好的编程风格建议在 switch...case 的最后都要写上这个 default

特别的 do...while 循环

我们先来看一份 while 循环的代码:

#include <iostream>

using namespace std;

int main() {

int n = 0;

while (n < 10) {
cout << n << endl;
n++;
}

return 0;
}

/*
output:
0
1
2
3
4
5
6
7
8
9
*/

啊,这份程序很简单,输出了 0~9 十个数字。

我们用另外一种特殊的 do...while 循环来实现同样的代码:

#include <iostream>

using namespace std;

int main() {

int n = 0;

// do...while 循环
do {
cout << n << endl;
n++;
} while (n < 10);

return 0;
}

/*
output:
0
1
2
3
4
5
6
7
8
9
*/

结果虽然还是完全一样的,但循环的结构变了,do...while 循环的逻辑是,先执行 do 后语句块的内容,在最后的 while 内进行判断,根据判断的结果看是否进行下一次循环。

这个 do...whilewhile 有什么不一样吗,两次的结果不都是相同的吗?

当然有不同,不然 do...while 没有必要出现了。

现在,我们把n的初值改为 10,对 while 循环,第一次条件就不满足,直接退出循环,没有任何输出。

而对于 do...while 而言,因为是后做判断,所以先输出了一个 0,之后退出了循环。

所以,do...while 的特点就是:无论条件是否满足,循环体至少执行一次

这种结构用的不多,但在特定的场景下有用武之地。

breakcontinue

最后,我们学习两个在循环中会用到的两个关键字。

首先是 break,我们刚刚在多分枝选择结构 switch...case 中说到了,它的含义是中断或终止。

break 用在循环中,就是直接退出循环的作用:

#include <iostream>

using namespace std;

int main() {

int n = 0;

while (n < 10) {
n++;
if (n == 5) {
break;
}
cout << n << endl;
}

return 0;
}

/*
output:
1
2
3
4
*/

当 n 为 5 时,进入 if 执行了 break,它的作用是终止这一个循环,直接退出。

至于 continue 的作用是什么,我们再来看:

#include <iostream>

using namespace std;

int main() {

int n = 0;

while (n < 10) {
n++;
if (n == 5) {
continue;
}
cout << n << endl;
}

return 0;
}

/*
output:
1
2
3
4
6
7
8
9
10
*/

我们仅仅把 break 替换为 continue,输出的结果发生了很大的变化:只有 5 没有输出。

所以 continue 的作用就是终止这一次循环,从下一次继续开始。

只要理解并记住了 这一次这一个 的含义和区别,breakcontinue 就不难理解了。