备战大晨7月 GESP C++ 1级(23):while循环让大晨直呼电脑是个死脑筋

上篇结尾咱们说到,大晨被 if-else 的多重分支绕晕,我让他休息了两天缓了缓神。今天咱们继续该系列下一篇,正式杀入信奥里的重头戏——循环结构。

按《一本通•编程启蒙C++版》的进度,前阵子大晨刚把顺序结构和分支结构啃完。说实话,_branch_那块他做得还算溜,但一碰到要重复做的事,这小子就开始嫌烦了。

为什么需要循环?

昨天晚上做练习题,遇到一道题:计算 1 到 5 的和。

大晨啪啪啪在键盘上敲:cout << 1+2+3+4+5;,然后回头得意地冲我挑眉:“爸,这题太简单了,我口算都能算出来是 15。”

我没说话,翻到下一页:“那你算算 1 到 100 的和。”

这小子瞬间石化了,手指在键盘上悬了半天,转头看着我:“爸,这要是真敲完,我手不得废了?”

我憋着笑,心想火候到了,这就是引入循环的最佳时机。我告诉他,计算机最大的优势就是不怕麻烦,同一个动作让它做一万遍它也不会喊累。这就是咱们今天要学的 while 循环。

while 循环的三要素

在白板上,我给大晨画了个圈,跟他讲 while 的语法。其实就一句话:while (条件) { 做事情; }。只要条件为真,它就会一直做花括号里的事。

我特意强调了三个关键点,这也是信奥初学者最容易翻车的地方:

  1. 初始值:你得有个起始状态。
  2. 条件判断:什么时候停。
  3. 步进更新千万别忘了在循环体里改变条件里的变量,不然电脑就死循环给你看!

大晨听得似懂非懂,我直接让他上手写那道 1 加到 100 的题。这可是经典的 GESP 一级考点。

代码如下,亲测可编译运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main() {
int i = 1; // 1. 初始值,从1开始
int sum = 0; // 用来存总和

// 2. 条件判断,只要i小于等于100就继续
while (i <= 100) {
sum = sum + i; // 累加
i = i + 1; // 3. 步进更新,这点漏了电脑就卡死!
}

cout << "1到100的和是: " << sum << endl;
return 0;
}

大晨照着敲完,按下运行键。屏幕上瞬间跳出一行字:1到100的和是: 5050

高斯求和 VS 计算机暴力美学

看到 5050 这个数字,大晨突然转过头,一脸认真地问我:“爸,高斯老师小时候不是用首尾相加的方法算的吗?1加100是101,2加99也是101,一共50个101,所以是5050。电脑怎么这么笨,非要一个一个加?”

听到大晨问出这话,老父亲心里一阵暗喜。这说明他不仅学了编程,还记得数学课上的逻辑,这绝对是好现象!

我摸了摸他的头,跟他解释:“高斯的方法很聪明,但在计算机里,如果数据量特别大,比如算 1 到 1 亿的和,写算法去算首尾相加反而容易出错。计算机的特点就是算力强,这就叫暴力美学,它不怕笨办法,就怕你没教它规矩。

大晨似懂非懂地点点头,然后嘀咕了一句:“反正它就是个死脑筋,只要我不喊停,它就一直加。”

老父亲陪跑感悟

今天这节课,大晨最大的收获不是记住了 while 的拼写,而是明白了“累加器”的概念。sum = sum + i 这句代码,他一开始死活理解不了为什么 sum 能等于 sum 加别的数。

我拿纸盒子给他比划了半天:左边是存钱的罐子,右边是手里的钱,把手里的钱塞进罐子里,罐子里的新余额,就是原来的加上新放进去的。这招对小学三四年级的孩子特别管用,有时候讲编程逻辑,不如直接上物理道具。

不过,这小子眼高手低的毛病还是没改。刚才那段代码里,他写的时候把 i = i + 1 给漏了,直接点运行,黑框框里的数字嗖嗖往上涨,风扇狂转,把他吓得赶紧合上笔记本。我告诉他,这就是“死循环”,编程里最忌讳的就是没有出口的胡同。

下一篇,咱们就要教这辆没有刹车的跑车怎么停下来了。break 和 continue 马上安排上,大晨要是再搞出乱子,我这个老父亲可真要顶不住了。咱们下篇见。

免责声明:本文仅记录大晨学习 C++ 的日常,涉及代码与讲解为个人陪跑理解,非专业教学指导。孩子学习进度因人而异,请勿盲目照搬。