输出字符菱形 - 小白也能懂的图解笔记
🌟 题目简单说
我们要用 *
画一个"倾斜的菱形",形状像这样:
****
*********
一共5行,中间一行有5个星星,其他行对称减少。
🎯 核心思路:像折纸一样对称
把菱形想象成一张上下对称的折纸(中间一行是对折线)。我们只需要学会画一半,另一半就能"复制"出来!
🛠️ 分步拆解(附图解)
步骤1:确定总行数
菱形对角线长5 → 总行数=5(中间1行+上下各2行)
步骤2:给每行编号(关键!)
想象把中间行标记为 第0行,其他行向上为负、向下为正:
行号 | 图形-2 | * ← 最上面-1 | ***0 | ***** ← 中间+1 | ***+2 | * ← 最下面
步骤3:找规律(重点!)
观察每行的两个要素:
- 空格数 = 行号的绝对值(比如行号-2 → 绝对值2 → 2个空格)
- 星号数 = 5 - 2×空格数
行号 | 绝对值 | 空格数 | 星号数计算 | 结果 |
---|---|---|---|---|
-2 | 2 | 2 | 5-2×2=1 | * |
-1 | 1 | 1 | 5-2×1=3 | *** |
0 | 0 | 0 | 5-2×0=5 | ***** |
+1 | 1 | 1 | 5-2×1=3 | *** |
+2 | 2 | 2 | 5-2×2=1 | * |
步骤4:通用公式
设中间行号为0,总层数的一半为n
(这里n=2):
- 空格数 =
|行号|
- 星号数 =
5 - 2×空格数
(更通用:星号数 = 2×(n - 空格数) + 1
)
🖥️ 代码逐行解析
#include <iostream>
using namespace std;int main() {int n = 2; // 控制一半的层数(总层数=2n+1)for (int row = -n; row <= n; ++row) { // 行号从-2到+2int spaces = abs(row); // 计算空格数int stars = 2*(n - spaces) + 1; // 计算星号数cout << string(spaces, ' ') // 打印空格<< string(stars, '*') // 打印星星<< endl;}return 0;
}
代码图解
假设当前行号 row = -1
:
spaces = abs(-1) = 1
→ 打印1个空格stars = 2*(2-1)+1 = 3
→ 打印3个星星- 组合结果:
" ***"
💡 常见问题
为什么行号要从负数开始?
为了让计算对称,避免单独处理上半部分和下半部分。绝对值函数帮我们统一处理。
如何改变菱形大小?
修改n
的值:
- 当
n=2
时 → 总行数5(题目要求) - 当
n=3
时 → 总行数7(更大的菱形)
🎓 总结口诀
一行二空三星号,
绝对行号算空格,
总数减倍得星星。
对称循环真巧妙!