首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

程式入門經典:用迴圈打印星星圖案(三角形、菱形、楊輝三角)

     編輯:關於C

前言

「打印星星」是無數程式設計初學者的第一個迴圈練習。透過控制列(行)與欄(列)的巢狀迴圈,配合空格與星號的輸出邏輯,能訓練對索引邊界、幾何規律、條件判斷的直覺理解。本文整理六大經典圖案與一個數字圖案,附帶通用思維框架。

通用分析框架

  1. 確定總行數 rows。
  2. 外層迴圈 遍歷行號 r = 0 .. rows-1(或 1..rows)。
  3. 內層迴圈 遍歷列號 c,根據圖案幾何特徵決定輸出 '*' 或 ' '。
  4. 行末換行。

關鍵在於推導「第 r 行,第 c 列是否印星星」的布林條件或區間範圍。

經典圖案實作(以 9 列為例)

1. 正三角形


void triangle_up(void) {
    for (int r = 1; r <= 9; ++r) {
        for (int c = 1; c <= r; ++c) putchar('*');
        putchar('\n');
    }
}

規律:第 r 行印 r 顆星。

2. 倒三角形


void triangle_down(void) {
    for (int r = 9; r >= 1; --r) {
        for (int c = 1; c <= r; ++c) putchar('*');
        putchar('\n');
    }
}

規律:行號遞減,星數同步遞減。

3. 左對齊等腰三角(含空格補齊)


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) 將上半部與下半部統一公式。

4. 右對齊等腰三角


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');
    }
}

5. 垂直菱形(上下對稱)


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');
    }
}

實際上與右對齊三角同碼,只差視覺置中與否。

6. 水平菱形(左右對稱)


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');
    }
}

7. 數字圖案:乘法表三角(非楊輝三角)


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');
    }
}

進階技巧總結

  • 參數化:將固定常數(9、5)提煉為函數參數 rows,支援任意大小。
  • 字串建構:先用 snprintf 建構整行字串再 puts,減少 I/O 呼叫,便於重導向、單元測試。
  • 字元自訂:將 '*' 參數化,支援 Unicode 方塊字元 "█"、表情符號 "🟢" 等。
  • 單元測試:捕獲標準輸出與預期多行字串比對,驗證邊界(rows=0,1,負數)。

總結

星星圖案看似簡單,實則蘊含「離散幾何 → 代數條件 → 巢狀迴圈」的完整建模過程。熟練掌握 abs()、對稱軸、區間長度公式,能將 2D 圖案問題轉化為 1D 索引運算,這正是演算法思維「降維打擊」的入門練習。建議初學者嘗試:只用一個雙層迴圈,透過條件判斷同時畫出正三角、倒三角、菱形——這將強化對座標系統的掌控力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved