控制台輸出圖案類題目(如三角形、菱形、金字塔)是程式設計入門經典,核心在於「雙重迴圈」與「代數表達式」的結合。本文以兩道經典題目為例,詳細拆解從觀察規律到建立數學模型、再到編寫通用代碼的完整思維過程。
##### #### ### ## #
外層迴圈控制行數(1~5),內層迴圈每行輸出 5 個 #,得到 5×5 矩形。
for (int row = 1; row <= 5; row++) {
for (int col = 1; col <= 5; col++) printf("#");
printf("\n");
}
第 1 行 5 個、第 2 行 4 個……第 5 行 1 個。內層迴圈上限需隨行號遞減:6 - row。
| row | 需要符號數 | 6-row |
|---|---|---|
| 1 | 5 | 5 |
| 2 | 4 | 4 |
| 3 | 3 | 3 |
| 4 | 2 | 2 |
| 5 | 1 | 1 |
for (int row = 1; row <= 5; row++) {
for (int col = 1; col <= 6 - row; col++) printf("#");
printf("\n");
}
# ## ### #### ### ## #
前 4 行遞增(1~4),後 3 行遞減(3~1)。總行數 7,中間行為第 4 行。
嘗試 8 - row 得到 7,6,5,4,3,2,1 —— 不符合。
引入中間值 4:4 - row 得到 3,2,1,0,-1,-2,-3。
取絕對值 |4 - row| 得到 3,2,1,0,1,2,3 —— 這正是每行的**空格數**!
若每行固定寬度 4 格,則 #數 = 4 - |4 - row|。
| row | |4-row| | #數 |
|---|---|---|
| 1 | 3 | 1 |
| 2 | 2 | 2 |
| 3 | 1 | 3 |
| 4 | 0 | 4 |
| 5 | 1 | 3 |
| 6 | 2 | 2 |
| 7 | 3 | 1 |
#include // for abs
for (int row = 1; row <= 7; row++) {
int spaces = abs(4 - row);
int hashes = 4 - spaces;
for (int s = 0; s < spaces; s++) printf(" ");
for (int h = 0; h < hashes; h++) printf("#");
printf("\n");
}
row 表示每行符號/空格數,常用技巧:row、N-row、|mid-row|、mid-|mid-row|。掌握這套方法,面對各種幾何圖案輸出題目都能條理清晰、快速落筆。