學習程式語言時,「印星星」幾乎是繞不開的經典練習。透過巢狀迴圈控制行數與每行星號數量,可以印出正三角形、倒三角形、菱形、楊輝三角等圖案。這不僅能熟悉 for 迴圈、條件判斷、字元輸出等基礎語法,更能訓練「由抽象邏輯推導具體輸出」的思維。本文整理六種常見星星圖案的 C 語言實作,附上完整代碼與邏輯解析。
所有圖案的共同骨架:
for (int row = 起始; row 條件; row 遞增/遞減) {
for (int col = 起始; col 條件; col 遞增/遞減) {
printf("* "); // 或印空格、數字
}
printf("\n"); // 換行
}
關鍵在於根據行號 row 動態決定內層迴圈的範圍(印幾顆星、印幾個空格)。
第 i 行印 i 顆星(i 從 1 到 9)。
void star_1() {
for (int outer = 1; outer < 10; outer++) {
for (int inner = 1; inner <= outer; inner++) {
printf("* ");
}
printf("\n");
}
}
第 i 行印 10 - i 顆星(i 從 9 遞減到 1)。
void star_2() {
for (int outer = 9; outer >= 1; outer--) {
for (int inner = 1; inner <= outer; inner++) {
printf("* ");
}
printf("\n");
}
}
利用 abs() 讓行號對稱分佈(-4 到 4),星號數 = 5 - abs(row),剩餘寬度補空格。
void star_3() {
for (int outer = -4; outer <= 4; outer++) {
for (int inner = 1; inner <= 5 - abs(outer); inner++) {
printf("*");
}
for (; inner <= 5; inner++) {
printf(" ");
}
printf("\n");
}
}
前面印 abs(row) 個空格,再印 5 - abs(row) 顆星。
void star_4() {
for (int outer = -4; outer <= 4; outer++) {
for (int inner = 1; inner <= abs(outer); inner++) {
printf(" ");
}
for (; inner <= 5; inner++) {
printf("*");
}
printf("\n");
}
}
結合左右空格與星號:每行先印前導空格,再印星號。空格數 = abs(row) - 5(負值時不印),星號數 = 5 - abs(row)。
void star_5() {
for (int outer = -4; outer <= 4; outer++) {
for (int inner = -4; inner <= abs(outer) - 5; inner++) {
printf(" ");
}
for (; inner <= 5 - abs(outer); inner++) {
printf("*");
}
printf("\n");
}
}
外層 outer 從 -9 到 0,內層先印 -outer 個空格,再印 9 - outer + 1 顆星。
void star_6() {
for (int outer = -9; outer <= 0; outer++) {
for (int inner = outer; inner < 0; inner++) {
printf(" ");
}
for (; inner <= 9; inner++) {
printf("*");
}
printf("\n");
}
}
原碼中為 outer * inner,實際楊輝三角需用組合數 C(n,k) 計算。此處保留原碼邏輯供參考。
void star_7() {
for (int outer = 1; outer < 10; outer++) {
for (int inner = 1; inner <= outer; inner++) {
printf("%3d ", outer * inner);
}
printf("\n");
}
}
「印星星」看似簡單,實則蘊含迴圈邊界控制、對稱性利用、狀態管理等核心程式設計能力。熟練掌握這些模式,對後續學習演算法、圖形處理、遊戲開發都大有裨益。願每位初學者都能在星星間找到編程的樂趣與節奏。