架構一:switch-case 直觀版
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){return b? a/b : (puts("除數為0"),0);}
int main() {
int op, a, b;
while (1) {
puts("1:加 2:減 3:乘 4:除 0:退出");
if (scanf("%d", &op) != 1 || op == 0) break;
if (op < 1 || op > 4) continue;
scanf("%d %d", &a, &b);
int (*funcs[5])(int,int) = {0, add, sub, mul, div}; // 索引對應選項
printf("結果: %d\n", funcs[op](a, b));
}
return 0;
}
架構二:函數指針表 (查表法,擴充性強)
enum Op { EXIT, ADD, SUB, MUL, DIV };
int (*ops[5])(int,int) = {0, add, sub, mul, div}; // 全域/靜態表
int main() {
int op, a, b;
while (1) {
menu();
if (scanf("%d", &op) != 1) break;
if (op == EXIT) break;
if (op < ADD || op > DIV) { puts("錯誤選項"); continue; }
scanf("%d %d", &a, &b);
printf("結果: %d\n", ops[op](a, b));
}
return 0;
}
核心優勢對比
| 特性 | switch | 函數指針表 |
| 新增運算 | 修改 switch 增加 case | 新增函數、擴充表、枚舉,無需動主邏輯 |
| 執行效率 | 跳轉表優化後相近 | 一次間接呼叫 |
| 程式碼組織 | 集中 | 分離 (開閉原則) |
| 動態載入 | 困難 | 支援 (dlopen 註冊) |
菜單函數
void menu() {
puts("*************************");
puts("**** 1.add 2.sub *****");
puts("**** 3.mul 4.div *****");
puts("******** 0.exit ********");
puts("*************************");
}
- 上一篇文章: C語言面試題:main 參數實作整數計算器 (命令列參數解析)
- 下一篇文章: C/C++ 閏年判斷邏輯錯誤修正:1000~2000 區間重複計數問題
Copyright ©
程式碼之家 All Rights Reserved