备战大晨7月 GESP C++ 1级(28):双重 for 循环,大晨用"排和座位"搞懂了

上一篇咱们把一重循环收了尾,大晨用 for 算 1+2+…+100,一次跑通,尾巴都要翘上天了。我当时就跟他说:别嘚瑟,一重循环只是热身,真正的坎是“循环里再套一个循环”

这不,这周《一本通·编程启蒙》正好翻到循环嵌套。大晨第一次看到两个 for 叠在一起,表情从“这有啥”秒变“这是啥”。

第一次见面,卡了 15 分钟

书上的例题是打印星星三角形:输入 5,输出五行,第一行 1 个星、第二行 2 个……大晨看题时嘴硬:“不就是 cout 五次嘛。”

结果一上手就露馅。他先用一个 for 打了 5 个星,发现全挤在一行;加个 endl,又变成每行只有一个。来回折腾 15 分钟,屏幕上就是出不来那个三角形

我在旁边忍着不提示。最后他自己嘟囔了一句:“这东西是每行不一样多的……”——这句话说到点子上了:一个循环管不了“每行不同”,得套两层。

外循环管行,内循环管列

我把他拉过来,草稿纸上画了个框:外层循环 i 管第几行,内层循环 j 管这一行打几个。记住一句话:外循环管行,内循环管列,endl 要放在两个循环中间。

代码长这样:

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

int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}

输入 5,输出:

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

大晨盯着 j <= i 看了半天,突然一拍桌子:“我懂了!i 是第几排,j 是这一排的座位号,排数越多座位越多!”用教室的排和座来理解,比我讲十分钟都管用。

顺便记一个他踩的坑:他一开始把 cout << endl; 写进了内循环,结果每打一个星就换行,星星变成一竖条。**endl 是内循环的“收工线”——一整行干完活才换行。**这个坑他自己爬出来的,比我说十遍都管用。

九九乘法表,40 分钟独立敲完

书上留的练习是九九乘法表。这题妙就妙在结构跟星星三角形一模一样,只是把 * 换成了算式

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

int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "*" << i << "=" << i * j << "\t";
}
cout << endl;
}
return 0;
}

大晨没要提示,独立敲了 40 分钟,中间编译错了两次:一次把 << 敲成 <,一次大括号少配了一个。跑出三角形乘法表那一刻,喊得整个客厅都听得见。

他还有个发现很逗:内层写的是 j <= i 不是 j <= 9,“不然表就成方的了,跟爸爸手机里那个不一样。”——**能自己看出上三角和全表的区别,说明他真的在脑子里“跑”循环了。**这是这 40 分钟里我最欣慰的一下。

老父亲陪跑小结

这一篇的收获三条:

  1. 双重 for 的心智模型:外循环管行,内循环管列
  2. endl 的位置决定换行时机,新手第一大坑;
  3. GESP 一级考纲对嵌套要求不深,但书里讲到这了,提前啃了不亏,二级直接无缝衔接

按进度,循环嵌套还剩最后一块硬骨头:打印菱形和空心图形。我提前瞄了一眼例题,中间还得数空格个数。大晨瞄了一眼那个图,来了句:“这个三角形怎么是倒着长在天上的?”

下篇就看他自己能不能把空格数出来。**循环这关一过,就要正式碰“数组”了,那才是真正的分水岭。**咱们下篇见。

免责声明:本文仅为我家娃的备考陪跑记录,学习进度与方法仅供参考,不构成任何培训建议;每个孩子节奏不一,切勿照搬攀比。