CC++ & Algorithm

循环嵌套与图形打印

中等3
语言版本:C++Python
概述:学习如何用循环套循环的方法打印出各种有趣的图形,比如正方形、直角三角形。

循环嵌套:用代码画出有趣的图形

同学们,你们有没有想过,用代码也能像画画一样,在屏幕上打印出各种图形?比如一个由星星组成的正方形、三角形,甚至还能画出菱形和数字图案。这就需要用到一个神奇的方法——循环嵌套

循环嵌套就像是一个“套娃”:外面有一个大循环(比如控制行数),里面还有一个小循环(比如控制每行打印几个符号)。你可以想象成排队做操:外层循环控制你站在第几排,内层循环控制这一排里有多少个同学。通过调整内层循环的次数,我们就能画出不同形状的图案。


什么是循环嵌套?

循环嵌套就是一个循环里面再放一个循环。执行时,外层循环每执行一次,内层循环就要完整地执行一遍(从开头跑到结尾)。比如:

for 外层变量 in range(行数):       # 外层:控制行
    for 内层变量 in range(每行个数): # 内层:控制这一行的元素
        打印某个符号(不换行)
    换行                           # 内层循环结束后,换到下一行

生活中也有类似例子:你每周有5天上学(外层循环),每天有6节课(内层循环)。每过一天,就要上完6节课;上完一节课,接着上下一节,直到这天结束。


1. 用循环嵌套打印一个正方形

正方形的特点是:行数和每行的星号数量相等。比如4行4列,每行4个星号。

rows = 4                     # 正方形边长
for i in range(rows):        # 外层循环,控制行数,共4行
    for j in range(rows):    # 内层循环,每行打印 rows 个星号
        print('*', end='')   # 打印星号,不换行(end=''表示不自动换行)
    print()                  # 一行结束后换行

运行结果:

****
****
****
****

为什么用 end=''
默认 print() 打印完后会自动换行。如果连用 print('*') 就会变成一列竖着的星星。加上 end='' 后,星号会紧挨着打印,等到一整行打印完,再单独用一个 print() 换行。


2. 用循环嵌套打印直角三角形

直角三角形的特点是:第1行1个星号,第2行2个星号……第n行n个星号。所以内层循环的次数取决于外层变量 i

rows = 5                     # 三角形的高度
for i in range(1, rows + 1): # 外层循环,i从1到5(第1行、第2行……)
    for j in range(i):       # 内层循环,打印 i 个星号(第i行打印i个)
        print('*', end='')
    print()                  # 换行

结果:

*
**
***
****
*****

思考:如果把 range(1, rows + 1) 改成 range(rows),i 会从0开始,那第0行就会打印0个星号(空行),第1行1个……这样也能得到同样的图形,但要注意i的含义。


3. 调整内层循环条件,画出更多图形

掌握了外层控制行、内层控制列的基本思路,你只需改变内层循环的范围,就能画出各种图案。

倒三角形:第1行5个星号,第2行4个……最后1行1个。可以利用 rows - i 来计算出每行星号的个数。

rows = 5
for i in range(rows):        # i从0到4
    for j in range(rows - i): # 第i行打印 rows-i 个星号
        print('*', end='')
    print()

结果:

*****
****
***
**
*

数字直角三角形:每行打印递增的数字,而不是星号。

rows = 4
for i in range(1, rows + 1):   # 外层行数
    for j in range(1, i + 1):  # 内层打印1到i的数字
        print(j, end='')
    print()

结果:

1
12
123
1234

你也可以用 print(chr(65 + j - 1), end='') 打印字母三角形(A、AB、ABC……)。发挥想象力,循环嵌套能做出很多有趣的图案。


常见错误(新手容易踩的坑)

  1. 忘记换行
    内层循环结束后没有加 print(),所有星号会直接连成一行。
    ❌ 错误代码:

    for i in range(4):
        for j in range(4):
            print('*', end='')
    # 没有 print() 换行,结果:****************(16个星号排成一行)
    
  2. 内层循环的 range 写成了固定值
    比如打印直角三角形时,内层循环写成 for j in range(5),结果每行都是5个星号,变成正方形。
    ✅ 正确做法:内层循环次数依赖外层变量,如 range(i)range(rows - i)

  3. 混淆行和列的变量
    外层变量通常控制行数,内层变量控制列数。如果用反了(比如把行数当作内层循环次数),图形就会变形。

  4. 忘记缩进
    Python 中缩进表示代码的归属。内层循环必须比外层循环多一层缩进(通常是4个空格或一个Tab),不然会报错或逻辑错误。


完整示例:用循环嵌套打印一个菱形

菱形可以看成两个三角形(上半部分 + 下半部分),但中间一行共用。下面是一个由星号组成的菱形(行数取奇数,例如7行)。

rows = 7                      # 总行数(奇数)
mid = rows // 2               # 中间行的索引(0开始,7行中间是第3行)

# 上半部分(包含中间行)
for i in range(mid + 1):     # i从0到3
    # 先打印空格,让星号居中
    for j in range(mid - i): # 空格数 = 中间行数 - 当前行数
        print(' ', end='')
    # 再打印星号,每行星号数 = 2*i + 1
    for j in range(2 * i + 1):
        print('*', end='')
    print()                  # 换行

# 下半部分(不包含中间行)
for i in range(mid - 1, -1, -1): # i从2到0倒序
    for j in range(mid - i):
        print(' ', end='')
    for j in range(2 * i + 1):
        print('*', end='')
    print()

运行结果(7行菱形):

   *
  ***
 *****
*******
 *****
  ***
   *

这段代码中,外层循环控制行,内层循环先打空格(让图案居中),再打星号。你可以调整 rows 为其他奇数(如5、9),观察图形变化。


相关指引

学会循环嵌套后,你可以尝试:

  • 打印九九乘法表:经典的嵌套循环应用,内层循环上限 = 外层变量。
  • 处理二维数据:比如用嵌套循环遍历一个 Excel 表格的行和列,或处理图像像素。
  • 嵌套条件语句:在循环内部结合 if 判断,比如只打印偶数行星号,或打印棋盘格。
  • 结合列表:用嵌套循环创建二维列表(如游戏地图、矩阵)。

循环嵌套是编程中非常重要的基本功,它让代码拥有了“重复中的重复”的能力。多动手画几个图案,你会越来越熟练,以后遇到更复杂的问题也能轻松拆解。现在,打开你的 Python 编辑器,试试画出自己的图案吧!

例题精讲

1单选题

使用循环嵌套打印一个4行4列的正方形(每个星号之间有一个空格),以下哪段代码是正确的?

Afor i in range(4): for j in range(4): print('*', end=' ') print()
Bfor i in range(4): for j in range(i+1): print('*', end=' ') print()
Cfor i in range(4): for j in range(4): print('*', end='') print()
Dfor i in range(4): for j in range(5): print('*', end=' ') print()
2判断题

在使用嵌套循环打印图形时,外层循环通常控制行数,内层循环通常控制每行的具体内容。

3填空题
以下代码用于打印一个5行的直角三角形(直角在左下角),请补充完整。
for i in range(5):
    for j in range(___):
        print('*', end='')
    print()
4单选题

给定以下代码,输出的图形是? for i in range(3): for j in range(3): print('*', end='') print()

A3行3列的星号矩阵
B1行9个星号
C3行,每行1个星号
D3行,每行3个星号,星号之间有空格
5判断题

打印一个直角三角形(直角在右上角)时,内层循环的次数应随着行号增加而减少。