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

C 語言自訂函式實作教學:從基礎語法到進階應用

     編輯:關於C語言

C 語言自訂函式實作教學:從基礎語法到進階應用

函式是 C 語言模組化程式設計的核心單元。本文透過五個實用範例,循序漸進示範函式宣告、定義、參數傳遞、回傳值、遞迴與實際應用場景,助你掌握自訂函式的精髓。

範例一:問候函式 (無參數、無回傳)

// 宣告
void sayHi(void);

// 定義
void sayHi(void) {
    printf("大家好!!\n");
}

// 呼叫
sayHi();

範例二:直角三角形星號列印 (單參數、無回傳)

void printTriangle(int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++)
            printf("*");
        printf("\n");
    }
}

// 呼叫
int n;
printf("請輸入層數: ");
scanf("%d", &n);
printTriangle(n);

範例三:平行四邊形星號列印 (單參數、巢狀迴圈控制空格與星號)

void printParallelogram(int n) {
    for (int i = 0; i <= n; i++) {
        // 印製前導空格:隨行數遞增
        for (int j = 0; j <= i; j++)
            printf(" ");
        // 印製星號:固定寬度
        for (int k = 0; k <= n; k++)
            printf("*");
        printf("\n");
    }
}

輸出樣貌 (n=4):

*****
 *****
  *****
   *****
    *****

範例四:整數冪次運算 (雙參數、整數回傳)

int myPower(int base, int exp) {
    int result = 1;
    for (int i = 1; i <= exp; i++)
        result *= base;
    return result;
}

// 呼叫
int base, exp;
printf("請輸入底數: "); scanf("%d", &base);
printf("請輸入指數: "); scanf("%d", &exp);
printf("%d^%d = %d\n", base, exp, myPower(base, exp));

範例五:整數絕對值 (單參數、整數回傳)

int myAbs(int n) {
    return (n >= 0) ? n : -n;
}

完整整合程式碼 (含選單驅動)

#include 
#include 

// 函式宣告
void sayHi(void);
void printTriangle(int n);
void printParallelogram(int n);
int myPower(int base, int exp);
int myAbs(int n);

int main(void) {
    int choice, n, base, exp;

    while (1) {
        printf("\n=== 自訂函式示範選單 ===\n");
        printf("1. 問候函式\n");
        printf("2. 直角三角形\n");
        printf("3. 平行四邊形\n");
        printf("4. 冪次運算\n");
        printf("5. 絕對值\n");
        printf("0. 結束\n");
        printf("請選擇: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1: sayHi(); break;
            case 2:
                printf("層數: "); scanf("%d", &n);
                printTriangle(n); break;
            case 3:
                printf("邊長: "); scanf("%d", &n);
                printParallelogram(n); break;
            case 4:
                printf("底數: "); scanf("%d", &base);
                printf("指數: "); scanf("%d", &exp);
                printf("結果: %d\n", myPower(base, exp)); break;
            case 5:
                printf("整數: "); scanf("%d", &n);
                printf("絕對值: %d\n", myAbs(n)); break;
            case 0: return 0;
            default: printf("無效選項\n");
        }
    }
}

// 函式定義 (同上)

進階概念延伸

函式指標與回呼

// 定義函式指標類型
typedef int (*MathFunc)(int, int);

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

void calculate(MathFunc func, int x, int y) {
    printf("結果: %d\n", func(x, y));
}

// 使用
calculate(add, 3, 4);  // 7
calculate(mul, 3, 4);  // 12

遞迴函式:階乘與費氏數列

int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

內聯函式優化

// 建議編譯器內聯展開,減少呼叫開銷
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

函式設計最佳實踐

原則說明
單一職責每個函式只做一件事,功能內聚
參數驗證檢查指標非 NULL、範圍合法、除數非零
const 正確性輸入指標加 const、不修改參數傳值
錯誤處理回傳錯誤碼、設定 errno、或輸出參數回傳狀態
命名規範動詞開頭、語意清晰 (如 calculateSum, parseConfig)
文件註解Doxygen 格式說明用途、參數、回傳、副作用

常見錯誤避坑

  • ❌ 函式定義在 main() 之後未前向宣告 → 隱式宣告警告
  • ❌ 陣列參數退化為指標,sizeof 失效 → 傳遞長度參數
  • ❌ 回傳區域變數指標/參考 → 懸空指標,未定義行為
  • ❌ 遞迴無基底案例/基底條件錯誤 → 堆疊溢位
  • ✅ 善用靜態分析工具 (Cppcheck, Clang-Tidy) 捕捉問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved