列印菱形是迴圈控制、空格與星號數量計算的經典練習。本文以 13 行菱形(上半 7 行、下半 6 行)為例,詳細推導每行空格數與星號數的數學關係,提供通用化參數化實作,並分析常見邊界錯誤。
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
#include <stdio.h>
int main() {
int i, j;
const int N = 7; // 上半部行數(含中線),總行數 = 2*N - 1 = 13
// 上半部:第 1 行到第 N 行
for (i = 1; i <= N; i++) {
// 空格數:N - i
for (j = 1; j <= N - i; j++) {
printf(" ");
}
// 星號數:2*i - 1
for (j = 1; j <= 2 * i - 1; j++) {
printf("*");
}
printf("\n");
}
// 下半部:第 N+1 行到第 2N-1 行(共 N-1 行)
for (i = 1; i <= N - 1; i++) {
// 空格數:i
for (j = 1; j <= i; j++) {
printf(" ");
}
// 星號數:2*(N-i) - 1 = 2*N - 2*i - 1
for (j = 1; j <= 2 * (N - i) - 1; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
| 行號 (i) | 空格數 | 星號數 | 公式驗證 |
|---|---|---|---|
| 1 | 6 | 1 | 空格=N-i=6, 星號=2i-1=1 |
| 2 | 5 | 3 | 空格=5, 星號=3 |
| 3 | 4 | 5 | 空格=4, 星號=5 |
| 4 | 3 | 7 | 空格=3, 星號=7 |
| 5 | 2 | 9 | 空格=2, 星號=9 |
| 6 | 1 | 11 | 空格=1, 星號=11 |
| 7 (中線) | 0 | 13 | 空格=0, 星號=13 |
| 8 (下半第1行) | 1 | 11 | 空格=i=1, 星號=2(N-i)-1=11 |
| 9 | 2 | 9 | 空格=2, 星號=9 |
| 10 | 3 | 7 | 空格=3, 星號=7 |
| 11 | 4 | 5 | 空格=4, 星號=5 |
| 12 | 5 | 3 | 空格=5, 星號=3 |
| 13 | 6 | 1 | 空格=6, 星號=1 |
void printDiamond(int totalRows) {
// 總行數必須為奇數,上半部行數 N = (totalRows + 1) / 2
if (totalRows % 2 == 0) totalRows++; // 自動調整為奇數
int N = (totalRows + 1) / 2;
// 統一迴圈:行號 1 到 totalRows
for (int row = 1; row <= totalRows; row++) {
int spaces, stars;
if (row <= N) {
// 上半部
spaces = N - row;
stars = 2 * row - 1;
} else {
// 下半部:對稱映射
int mirrorRow = totalRows - row + 1; // 對應上半部行號
spaces = N - mirrorRow;
stars = 2 * mirrorRow - 1;
}
// 列印空格
for (int s = 0; s < spaces; s++) putchar(' ');
// 列印星號
for (int s = 0; s < stars; s++) putchar('*');
putchar('\n');
}
}
if (starPos == 1 || starPos == stars) putchar('*');
else putchar(' ');
printDiamondEx(rows, '*', ' ')。sleep()、system("clear") 逐行顯示。N 控制,提高復用性。13 - 2*i 僅適用特定 N,通用公式為 2*(N-i)-1。j、k 或直接在 for 宣告區域變數。printf("\n") 或 putchar('\n')。掌握菱形列印的數學建模能力,能舉一反三解決各類幾何圖案列印問題(三角形、平行四邊形、六邊形、數字金字塔等),是鍛鍊迴圈邏輯與數學直覺的最佳練習。