第 07 课:循环结构(一)——从 if 到 while,再到 for

本课定位:前六课写的程序都有一个共同点:每句话只执行一次。可现实里很多任务天生就是重复的——把 1 到 100 打印出来、把 1 到 n 加起来、数一数 1 到 n 里有几个是 3 的倍数。这些活交给计算机,几行就能办完,靠的就是循环。本课先想清楚“为什么要循环”,再一步步把已经学过的 if 改造成 while,最后升级成更紧凑的 for;然后用循环做三件最常见的事:输出、求和、求个数。

建议时长:90 分钟(含课堂练习)。

前置条件:会写完整的 if / else;会用关系运算符 >、<、>=、<=、== 和 % 判断整除;能用 cin / cout 完成输入输出。

0. 本节知识地图

前六课:一句一句往下走,每句只做一次

    读入 n ──► 判断 ──► 输出 ──► 结束

这节课:让某一段话自己重复

        ┌───────────────┐
        │    循环体      │◄─────┐
        └───────┬───────┘      │
                │              │ 条件还成立?
                ▼              │
            检查条件 ──────────┘
                │
             不成立
                ▼
             接着往下走

    if  ──►  while  ──►  for

    if    :条件成立,做一次
    while :条件成立就做一次,做完回来再问一次……
    for   :把“起点、条件、每轮怎么变”三件事收进一行

学完本课,学员要能用一句话说清楚:循环就是“条件成立就做一遍,做完回到条件再问一次,直到条件不成立为止”。

1. 先看一个问题:让计算机重复做事

要求:把 1 打印出来。我们已经会写了:

#include<iostream>
using namespace std;

int main() {
    int i = 1;
    if (i <= 5) {          // 1 <= 5 成立
        cout << i << endl; // 输出 1
    }
    return 0;
}

运行结果:

1

现在把要求改成:把 1、2、3、4、5 都打印出来。用 if 只能打印一个数——因为 if 是“问一次,做一次”,做完就继续往下走了,不会回头再问。

想输出 5 个数,一个笨办法是写五遍:

int i = 1;
if (i <= 5) { cout << i << endl; }
i = i + 1;
if (i <= 5) { cout << i << endl; }
i = i + 1;
// ……一直写到 i = 5

五遍还行,可如果题目要打印到 100、到 1000 呢?这样写显然行不通。计算机最擅长的就是重复做同一件事,我们需要一种能让一段话自己转圈的写法。

2 从 if 到 while:让“做一次”变成“反复做”

盯着刚才的笨办法,会发现它反复在做两件事:

  1. 问一句“i <= 5 还成立吗?”;
  2. 成立就输出 i,然后让 i 往前走一步。

既然这两步要重复,就干脆把它们圈成一个圈。把 if 换成 while,把“往前走一步”也写进圈里,就得到:

#include<iostream>
using namespace std;

int main() {
    int i = 1;
    while (i <= 5) {     // 条件成立,就进圈做一遍
        cout << i << endl;
        i = i + 1;       // 关键:让 i 往前走
    }
    return 0;
}