C 語言列印菱形圖案:從固定大小到動態行數輸入的演算法演進
版本一:固定 13 行 (上 7 下 6)
#include <stdio.h>
int main() {
// 上半部 (含中線)
for (int i = 0; i < 7; ++i) {
for (int s = 0; s < 6-i; ++s) putchar(' ');
for (int k = 0; k < 2*i+1; ++k) putchar('*');
putchar('\n');
}
// 下半部
for (int i = 7; i < 13; ++i) {
for (int s = 0; s < i-6; ++s) putchar(' ');
for (int k = 0; k < 2*(13-i)-1; ++k) putchar('*');
putchar('\n');
}
return 0;
}
版本二:動態行數 (使用者輸入)
#include <stdio.h>
int main() {
int n;
printf("輸入菱形行數 (奇數): ");
scanf("%d", &n);
if (n % 2 == 0) ++n; // 確保奇數
int mid = n / 2;
// 上半部 (含中線)
for (int i = 0; i <= mid; ++i) {
for (int s = 0; s < mid-i; ++s) putchar(' ');
for (int k = 0; k < 2*i+1; ++k) putchar('*');
putchar('\n');
}
// 下半部
for (int i = mid+1; i < n; ++i) {
for (int s = 0; s < i-mid; ++s) putchar(' ');
for (int k = 0; k < 2*(n-i)-1; ++k) putchar('*');
putchar('\n');
}
return 0;
}
規律總結
| 部分 | 行索引 i | 空格數 | 星號數 |
| 上半 | 0 ~ mid | mid - i | 2*i + 1 |
| 下半 | mid+1 ~ n-1 | i - mid | 2*(n-i) - 1 |
教學建議
- 先在紙上畫網格,推導公式。
- 固定版本理解邏輯後,泛化為變數
n。
- 可擴展為空心菱形、帶顏色 (ANSI 轉義碼) 等變體。