备战大晨7月 GESP C++ 1级(30):for 里再套 for,大晨的星星三角终于立起来了

上篇留的话头,今天兑现

上一篇咱们把单层 for 循环刷得差不多了,文末我留了句话:循环还能套着循环用,威力翻倍。今天《一本通·编程启蒙》正好翻到循环嵌套这一节,来兑现承诺。

先给他看题:从键盘读入一个 n,打印 n 行星星,第一行 1 颗,第二行 2 颗……第 n 行 n 颗。大晨扫了一眼说”这不简单?”,第一版代码交上来一跑——n 颗星星全挤在一横排里。

单层循环管不了”行”和”列”两个方向的事,这时候就得请出嵌套循环:外层管行,内层管列。

代码上桌

完整代码,直接可以编译运行:

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
*
**
***
****
*****

跟大晨磨了半天的是两个点:

  • 外层 i 管行数,内层 j 的终点是 i,也就是”第几行就打几颗星”,j <= i 这个条件是整道题的灵魂。
  • cout << endl; 必须放在内层循环外面、外层循环里面,一行星星打完才换行。

他踩的坑:endl 放错了地方

第二版代码编译通过,一运行全乱套——每颗星星自己独占一行,竖着排成一长溜。他盯着屏幕半天,喊我:”爸爸,星星怎么排队下楼了?”

一检查,他把 cout << endl; 塞进了内层循环里。endl 放错一层循环,整个图形就散架——这个坑不亲自踩一次,我讲十遍都白讲。他自己改完再跑,看到三角形立起来的那一秒,蹦起来喊”成了成了”,比我发工资还激动。

后来他总结了一句让我印象很深的话:”这不就是套娃嘛,大循环肚子里装了个小循环,小循环跑完一圈,大循环才走一步。”

娃自己悟出来的比方,比我讲的管用十倍。

老父亲陪跑心得:先画图,再写码

这次我吸取了教训,先拿草稿纸画格子:5 行 5 列,第 i 行涂 i 个格子,让他自己数着填星星,数完再对着代码看 j 从 1 走到 i。手比脑快的孩子,先让手动起来,脑子才肯跟上。

顺势留了两道变形题:倒三角(第 1 行 n 颗往下递减)、每行打行号再打星星(1: *)。倒三角他磨了大概 20 分钟才把 j 的起点想明白,数字三角第一次就过了。

今日小结 & 下篇预告

  • 嵌套循环 = 外层管行、内层管列,动手前先想清楚谁控制谁
  • endl 的位置 = 换行的时机,放进哪层循环,就在哪层”刹车”。
  • 娃卡住别急着讲,让他先踩坑,踩过的坑才是他自己的

嵌套循环的第一次亲密接触算是顺利拿下。但光打星星还不够过瘾——下篇就用这两层 for 打印九九乘法表,还要认识一个新朋友 ‘\t’ 制表符,那个对齐问题能把强迫症娃逼疯。大晨能不能一口气打对?下篇见分晓。

免责声明:本系列仅为我家娃的学习记录和老父亲的陪跑笔记,不构成任何教学或报考建议,每个孩子节奏不同,仅供参考。