「打印星星」是無數程式設計初學者的第一個迴圈練習。透過控制列(行)與欄(列)的巢狀迴圈,配合空格與星號的輸出邏輯,能訓練對索引邊界、幾何規律、條件判斷的直覺理解。本文整理六大經典圖案與一個數字圖案,附帶通用思維框架。
rows。r = 0 .. rows-1(或 1..rows)。c,根據圖案幾何特徵決定輸出 '*' 或 ' '。關鍵在於推導「第 r 行,第 c 列是否印星星」的布林條件或區間範圍。
void triangle_up(void) {
for (int r = 1; r <= 9; ++r) {
for (int c = 1; c <= r; ++c) putchar('*');
putchar('\n');
}
}
規律:第 r 行印 r 顆星。
void triangle_down(void) {
for (int r = 9; r >= 1; --r) {
for (int c = 1; c <= r; ++c) putchar('*');
putchar('\n');
}
}
規律:行號遞減,星數同步遞減。
void triangle_left(void) {
const int MID = 5; // 總寬度 9,中線索引 4(0-based)或 5(1-based)
for (int r = -4; r <= 4; ++r) {
int stars = 5 - abs(r); // 1,2,3,4,5,4,3,2,1
for (int c = 1; c <= stars; ++c) putchar('*');
for (int c = stars + 1; c <= 5; ++c) putchar(' ');
putchar('\n');
}
}
技巧:用 abs(r) 將上半部與下半部統一公式。
void triangle_right(void) {
for (int r = -4; r <= 4; ++r) {
int spaces = abs(r); // 4,3,2,1,0,1,2,3,4
int stars = 5 - spaces;
for (int c = 1; c <= spaces; ++c) putchar(' ');
for (int c = 1; c <= stars; ++c) putchar('*');
putchar('\n');
}
}
void diamond_vertical(void) {
for (int r = -4; r <= 4; ++r) {
int spaces = abs(r); // 左側空格
int stars = 5 - spaces; // 星數
for (int c = 1; c <= spaces; ++c) putchar(' ');
for (int c = 1; c <= stars; ++c) putchar('*');
putchar('\n');
}
}
實際上與右對齊三角同碼,只差視覺置中與否。
void diamond_horizontal(void) {
for (int r = -9; r <= 0; ++r) { // 共 10 行
int spaces = -r; // 9..0
int stars = 10 - spaces; // 1..10
for (int c = 1; c <= spaces; ++c) putchar(' ');
for (int c = 1; c <= stars; ++c) putchar('*');
putchar('\n');
}
}
void multiplication_triangle(void) {
for (int r = 1; r <= 9; ++r) {
for (int c = 1; c <= r; ++c) {
printf("%3d ", r * c);
}
putchar('\n');
}
}
註:原文標題「楊輝三角」實為乘法表三角。真正的楊輝三角需用組合數 C(n,k) 計算,見下文延伸。
void pascal_triangle(int rows) {
for (int r = 0; r < rows; ++r) {
long long val = 1; // C(r,0)
// 置中空格(選擇性)
for (int s = 0; s < rows - r - 1; ++s) printf(" ");
for (int c = 0; c <= r; ++c) {
printf("%3lld ", val);
val = val * (r - c) / (c + 1); // C(r,c+1) = C(r,c) * (r-c)/(c+1)
}
putchar('\n');
}
}
rows,支援任意大小。snprintf 建構整行字串再 puts,減少 I/O 呼叫,便於重導向、單元測試。'*' 參數化,支援 Unicode 方塊字元 "█"、表情符號 "🟢" 等。星星圖案看似簡單,實則蘊含「離散幾何 → 代數條件 → 巢狀迴圈」的完整建模過程。熟練掌握 abs()、對稱軸、區間長度公式,能將 2D 圖案問題轉化為 1D 索引運算,這正是演算法思維「降維打擊」的入門練習。建議初學者嘗試:只用一個雙層迴圈,透過條件判斷同時畫出正三角、倒三角、菱形——這將強化對座標系統的掌控力。