备战大晨7月 GESP C++ 1级(20):for循环,终于把"重复"说明白了

上篇聊完if-else分支结构,大晨基本啃下来了。我说咱们翻开《一本通》下一章看看,好家伙——循环结构,来了。

大晨瞅了一眼标题问我:”爸,循环是不是跟圆圈一样,转来转去转不完?”

我笑了,说差不多,但今天爸爸教你一个特别实在的东西:for循环

为啥需要循环

我先给大晨出了道题:屏幕上打印5个”hello”。

他啪啪啪打了5行cout,还挺得意,歪着头看我。

我又说:那打印100个呢?

他愣了两秒,掰着手指头算了算,说”那我手不得打废了?”

这就对了——当一件事情要重复做很多遍,循环就是干这个的。

我在键盘上敲了一段代码:

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main(){
for(int i = 1; i <= 5; i++){
cout << "hello" << endl;
}
return 0;
}

运行完屏幕蹦出5个hello,大晨眼睛一亮:”就这一行就能打100个?那1000个也行?”

我说你把5改成1000试试。

他一改、一运行,屏幕刷了好几秒,这小子乐得直拍桌子。

for循环的”三段式”

但是for后面括号里那一坨东西,大晨看了一脸懵。

for(int i = 1; i <= 5; i++)

我跟他说,你就把它拆成三句话来理解:

  • 第一段:从哪儿开始 —— int i = 1,计数器i从1出发
  • 第二段:到哪儿停 —— i <= 5,只要i不超过5就接着转
  • 第三段:每次怎么变 —— i++,每转一圈i就加1

大晨歪着脑袋想了想,突然冒出一句:”爸爸,这就像我爬楼梯,从1楼开始,爬到5楼停,每次爬一层。”

我当时真想给他鼓个掌。这比喻太到位了。

赶紧趁热打铁,把代码改成爬楼梯版:

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main(){
for(int i = 1; i <= 5; i++){
cout << "到了第" << i << "层" << endl;
}
cout << "到5楼了,不爬了!" << endl;
return 0;
}

输出:

1
2
3
4
5
6
到了第1层
到了第2层
到了第3层
到了第4层
到了第5层
到5楼了,不爬了!

大晨看到”到5楼了,不爬了”笑得不行,非要把5改成20,说要看看爬到20楼累不累。

i++到底是啥意思

for循环里最让大晨犯晕的是i++这玩意儿。

我跟他解释,i++就是i = i + 1的简写,意思是把i的值往上加1。比如i现在是3,执行完i++就变成4了。

大晨问:”那i–是不是减1?”

我说对,你悟性不错。

他紧接着又问:”那i++++是不是加2?”

我……差点被噎住。跟孩子学编程最大的挑战就是他们永远会问你边界问题。

老老实实跟他说:i++++不合法,加2应该写i += 2,这个后面细讲,你现在先记住i++就是加1就够了。

经典题:1加到100

光打印hello大晨觉得没意思。我给他出了道真题:计算1+2+3+…+100的和。

这道题在信奥里太经典了,GESP一级几乎必考。

我先让他自己想思路,大晨嘀咕了一阵说:”就是把1到100每个数都加起来嘛,用循环一个个往里加。”

我说对,那你得有个”篮子”来装这些数,一开始篮子是空的,每循环一次就往里扔一个数。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main(){
int sum = 0; // 篮子,一开始是空的
for(int i = 1; i <= 100; i++){
sum = sum + i; // 每次把i扔进篮子
}
cout << "1到100的和是:" << sum << endl;
return 0;
}

大晨看着屏幕上输出5050,抬头问我:”爸爸你怎么知道答案是5050?”

我说这不是我算的,是数学家高斯小时候算出来的,有个故事回头讲给你听。

大晨立刻来了精神,说高斯比爸爸厉害多了。我心想,你连1加到100都让我写代码,人家可是心算的……

不过话说回来,编程的意义不在跟高斯比心算,而是你掌握了循环,100万也能算。

老父亲陪跑小结

今天这篇大概是这个系列以来大晨学得最开心的一节。for循环的概念比if-else好理解,因为有”爬楼梯”这种特别直观的比喻。

记几点陪跑体会:

  1. 比喻太重要了。干巴巴说”初始化-条件-更新”孩子根本听不进去,换成”从几楼开始-到几楼停-每次爬几层”秒懂。
  2. 让孩子自己改数字。代码写完后让大晨自己改5为其他数字,他改了20、1000、10000,这个过程中他对”循环次数”有了直觉。
  3. 经典题要早接触。1到100求和这种题GESP一级出现概率极高,越早练越熟练。

下一篇打算讲for循环的进阶——循环嵌套,也就是for里面再套一个for。大晨第一次看到两个for套在一起的时候,问我的那句话,说实话把我逗乐了。

下篇预告:大晨盯着屏幕上for里面套着for的代码,沉默了三秒,然后问我——“爸爸,这是不是俄罗斯套娃?”

免责声明:本文仅记录大晨备考GESP C++一级的学习过程,代码和讲解基于个人理解,不保证完全准确,如有错误欢迎指正。每个孩子学习进度不同,本文仅供参考。