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

C語言模擬計算器:switch 與函數指標陣列兩種實作

     編輯:關於C語言

需求

實現簡易整數計算器,支援加減乘除,選單驅動,輸入 0 退出。

實作一:switch-case 版本

#include <stdio.h>
#include <stdlib.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) {
    if (b == 0) { printf("除數不能為 0\n"); return 0; }
    return a / b;
}

void menu() {
    puts("*************************");
    puts("**** 1.add  2.sub ****");
    puts("**** 3.mul  4.div ****");
    puts("******** 0.exit ********");
    puts("*************************");
}

int main() {
    int input, num1, num2, ret;
    while (1) {
        menu();
        printf("請選擇 >: ");
        scanf("%d", &input);
        if (input == 0) break;
        printf("請輸入兩個整數 >: ");
        scanf("%d%d", &num1, &num2);

        switch (input) {
            case 1: ret = add(num1, num2); break;
            case 2: ret = sub(num1, num2); break;
            case 3: ret = mul(num1, num2); break;
            case 4: ret = div(num1, num2); break;
            default: printf("選項錯誤\n"); continue;
        }
        printf("結果 = %d\n", ret);
    }
    return 0;
}

實作二:函數指標陣列版 (更具擴展性)

#include <stdio.h>
#include <stdlib.h>

enum Op { EXIT, ADD, SUB, MUL, DIV };

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) {
    if (b == 0) { printf("除數不能為 0\n"); return 0; }
    return a / b;
}

// 函數指標陣列,索引對應 enum
int (*calc[5])(int, int) = { NULL, add, sub, mul, div };

int main() {
    int input, num1, num2;
    while (1) {
        menu();
        printf("請選擇 >: ");
        scanf("%d", &input);
        if (input == EXIT) break;
        printf("請輸入兩個整數 >: ");
        scanf("%d%d", &num1, &num2);

        if (input >= ADD && input <= DIV) {
            printf("結果 = %d\n", calc[input](num1, num2));
        } else {
            printf("選項錯誤\n");
        }
    }
    return 0;
}

兩種設計對比

維度switch-case函數指標陣列
新增運算修改 switch、增函數增函數、擴展陣列、增 enum
程式碼結構集中式分派資料驅動、表驅動
擴展性一般優 (符合開閉原則)
適用場景固定少量操作插件架構、動態載入、狀態機

核心觀念

  • 函數指標陣列實現「索引→行為」映射,消除巨大 switch。
  • 搭配 enum 讓索引有語意,維護性更佳。
  • 這是 C 語言實現多態、策略模式的基礎技巧。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved