备战大晨7月 GESP C++ 1级(27):for 套 for,循环也会"套娃"

上一篇结尾我说过,单层循环大晨已经基本拿下了,接下来该上点”硬菜”。这不,本周陪跑,《一本通·编程启蒙 C++版》正好推进到循环章节的”打印图形”小节——for 套 for,嵌套循环,来了。

说实话,这个知识点我当年自己学 C 语言的时候也卡过一下,所以我提前给大晨打好了预防针:今天可能会有点绕,绕不过来不怪你。

循环套循环,到底是什么玩意

我没急着讲代码,先拿生活里的例子打比方:外层走一步,内层跑一圈

我跟他说:你每天上学,是一层大循环;而在学校里,每节课 40 分钟,是里面的小循环。一天 8 节课都上完,外面那个”天”的循环才走完一步。

大晨听完来了句:”爸爸,这不就是套娃吗?”

行吧,这词比我的”学校循环论”形象多了。后面我俩干脆就把嵌套循环叫”套娃循环”。

第一题:打印星号矩形

书上的例题很经典:打印一个 3 行 4 列的星号矩形。

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

int main() {
for (int i = 1; i <= 3; i++) { // 外层:控制行,走 3 步
for (int j = 1; j <= 4; j++) { // 内层:控制列,每行走 4 步
cout << "*";
}
cout << endl; // 一行打完,才换行
}
return 0;
}

输出长这样:

1
2
3
****
****
****

大晨第一次敲的时候,把 cout << endl; 写进了内层循环里,结果打出来一根竖着的糖葫芦,一行一个星号。他盯着屏幕愣了三秒,自己反应过来了:”换行放错地方了,应该一整行打完再换!”

自己发现的 bug,比我讲十遍都管用。

第二题:直角三角形,内层条件跟着变

矩形会了,书上紧接着来了个直角三角形:第 1 行 1 个星,第 2 行 2 个,一路加到第 5 行 5 个。

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

int main() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) { // 关键:j 要走到 i 为止
cout << "*";
}
cout << endl;
}
return 0;
}

输出:

1
2
3
4
5
*
**
***
****
*****

这题的关键就一处:内层的终止条件是 j <= i,跟着外层变。大晨一开始照抄上一题的 j <= 4,打出来还是个矩形,他还挺委屈:”我代码没错啊?”

我让他用手指着屏幕数:第 2 行应该几个星?两个。你代码里让它打了几个?四个。他”哦——“了一声,改了一个字符,过了。

老父亲陪跑心得

今晚有效学习时间 45 分钟,两道例题加 4 道课后小题,错 1 道。总结几条给自己也给大家:

  • 外层管行,内层管列,这句话我让大晨抄在了笔记本第一页;
  • 换行的 endl 要放在两个循环之间,这是今天最容易翻车的点;
  • 让孩子用手指着输出数星号,比干讲逻辑有用十倍。

临睡前大晨还追着问:”爸爸,套娃能套三层吗?”我说能,不过那是以后的事,先把两层玩明白。

小结与下篇预告

今天拿下了嵌套循环,一句话记住:外层走一步,内层跑一圈,换行别放错地方。GESP 一级的图形打印题,基本就是这个套路。

下一篇,咱们就用今天学的”套娃循环”,去挑战一个真正的大 boss——九九乘法表。大晨看到样例输出的那一刻眼睛都亮了,至于他第一遍会打出一张什么样的”残表”,下篇见分晓。

免责声明:本文仅为自家孩子备考过程的个人记录,不构成任何教学建议。每个孩子节奏不同,参考就好,别焦虑。