跳至正文
View Categories

1 min read

1. 什么是循环 #

在今天的课程中,我们来介绍循环。首先,我们来看一下,身边的“循环”。

在科学技术中的“循环”。



2. while #

2.1 while 基本结构 #

在 C++ 中,使用单词 while 表示循环。

while(表达式) // 循环启动的“控制开关”
{
    // 表达式为真,则执行“循环体”
}

下面来看一个例子,请分析一下,这个循环什么时候结束呢?

// 从 0 数到 …
int i(0);
while(true)
{
    cout << i << " 只羊。" << endl; // 这个程序“失眠”了。
    i = i + 1;
}

假如硬件条件允许,这个循环可以连续运行几万年!
这种情况,被称为“死循环”。

所以,循环一般都需要一个特定的退出条件。
换句话说,也就是,循环什么时候应该结束。

2.2 while 退出条件 #

请看下面的代码:

int i(0);
while(true)
{
    cout << i << " 只羊。" << endl;
    i = i + 1;
    if(i > 10) 
        break;    // 退出 语句
}

当 if 内的条件成立时,break 表示退出循环。

现在,请你用之前课程学习的知识分析一下,这个循环退出时,i 的值是多少?

2.3 while 启动条件 #

我们再来看一下 while () 括号内的条件。

  • 注意,当条件成立时,循环启动。
#include <iostream>
using namespace std;
int main()
{
    cout << "请输入一个整数:" << endl;
    int i(0);
    cin >> i;
    while(i)
    {
        cout << i << " 只羊。" << endl;
        i = i - 1;
    }
}

上面的这段程序,有两个奇怪的地方。

  • 1. while (i) 中的 i 是一个整数。整数可以作为条件吗?
  • 2. 这个 while 没有退出判断,那不是“死循环”了吗?

问题 1 :

  • 1. while (i) 中的 i 是一个整数。整数可以作为条件吗?

在 bool 变量一节中,我们提到了 true 对应数值 1,false 对应数值 0。
因为“自动类型转换(将在后续讲解)”,这个规则有如下的变化。

// 原始规则
1 对应 true;
0 对应 false;

//  受到“自动类型转换”的影响
大于等于 1 的所有整数, 对应 true;  // 但是,这并不意味上述的规则失效了。请注意。
小于等于 0 的所有整数, 对应 false;

所以,假如输入 10,则 while(i) 处于条件成立的状态。循环也就启动了。

问题 2 :

  • 2. 这个 while 没有退出判断,那不是“死循环”了吗?

在 while 循环中,每次循环前,此条件都会被检查一次。如果条件成立,则执行一次。

所以,条件既可以作为循环的启动条件,也可以作为循环的终止条件。
在这个例程中,当 i 变为 0 时,由于受到“自动类型转换”的影响,
条件不再成立。循环终止。

思考:
假如输入 10 ,上述的循环将执行多少次?

(答案是 10 次)

2. ++ 和 — 符号 #

#include <iostream>
using namespace std;
int main()
{
    int i(0);
    while(true)
    {
        cout << i << endl;
        i = i + 1;
        if(i <= 20)
            break;
    }
    return 0;                     
}

这个循环可以执行 20 次。
其中,可以这样改写:

#include <iostream>
using namespace std;
int main()
{
    int i(0);
    while(true)
    {
        cout << i << endl;
        i++;             // 新语法,表示 i = i + 1;
        if(i <= 20)
            break;
    }
    return 0;                     
}

i++ 这种写法,可以提高书写的效率,是一种很常用的写法。

除此以外,还可以这样改写:

#include <iostream>
using namespace std;
int main()
{
    int i(20);
    while(i--) // 新语法,表示 i = i - 1;
    {
        cout << i << endl;
    }
    return 0;                     
}

小结:

i++; // 等价于 i = i + 1;
i--; // 等价于 i = i - 1;

3. 循环嵌套 #

while 循环的嵌套比较容易,请看示例程序:

#include <iostream>
using namespace std;
int main()
{
    int i(0), s(0);
    while(i < 100)
    {
        int j(0);
        while(j < 100) // 在 while 内,嵌套一个 while 
        {
            j++;
            s++;
        }
        i++;
    }

    cout << "i = " << i << endl; // 请问 i 的值是多少?
    cout << "s = " << s << endl; // 请问 s 的值是多少?

    return 0;                     
}

答案:

i=100;
s=10000;

循环的嵌套,也是一种很典型的程序结构。
举一个很典型的应用场景:写作文。

作文是从左往右,一行一行写的,所以可以描述为下面的过程:

1. 写第一行
        写第 1 个格子;
        写第 2 个格子;
        写第 3 个格子;
        写第 4 个格子;
        ...
        写第 9 个格子;// 假设一行是9个格子
2. 写第二行
        写第 1 个格子;
        写第 2 个格子;
        写第 3 个格子;
        写第 4 个格子;
        ...
        写第 9 个格子;// 假设一行是9个格子
3. 写第三行
        写第 1 个格子;
        写第 2 个格子;
        写第 3 个格子;
        写第 4 个格子;
        ...
        写第 9 个格子;// 假设一行是9个格子
...

用 while 的嵌套可以这样描述:

int j(0);
while(j < 100)
{
    j++;          // 移动到下一行

    int i(0);
    while(i < 10) 
    {
        i++;      // 移动到下一个格子
        写一个字;
    }
}

4. do … while() #

现在介绍一种新的循环结构:do … while()

do
{
    …
} while (条件);

它的执行顺序为:
执行循环体;
检查条件是否成立;
成立则继续步骤1,否则退出;
注意,最后有分号!

请判断下面程序的输出:

int dashima(0);
do
{
    a++;
} while (a < 10);
cout << a;

这里的输出应该是 a = 10

绝大多数的情况下,do … while 都可以被 while 或者 for 结构,等价替换。
所以,大家只要了解有这种语法即可。

5. 课后练习 #

  1. 求100+97+……+4+1的值
  2. 编程求解1+2+3+…+n
  3. 求满足条件的整数个数
  4. 判断质数
  5. 素数的个数