【C/C++】用回撥函式實現計算器
阿新 • • 發佈:2018-12-26
一、問題概述
用C語言實現一個簡易計算器,可以用來實現加減乘除的功能
名詞解釋:
函式指標:一個指標,用於指向一個函式
函式指標陣列:是一個數組,裡面存放多個函式指標
回撥函式:一個函式,若引數中有函式指標,那麼這個函式便是回撥函式
二、問題分析
這個問題大可用switch,case語句實現
但是這裡我們用一種比較高大上的方法
利用函式指標陣列
以及回撥函式
思路:
(1)先把加減乘數各寫成一個函式
注意:型別與返回值必須相同
(2)用函式指標陣列,將四個運算函式存到該數組裡
通過呼叫該陣列,根據函式地址來呼叫了該函式
三、程式碼實現
(1)函式指標陣列
程式碼塊:
#include<stdio.h> //將運算的四個函式寫出來void Add(int x,int y) { printf("%d\n",x+y); } void Sub(int x,int y) { printf("%d\n",x-y); } void Mul(int x,int y) { printf("%d\n",x*y); } void Div(int x,int y) { printf("%d\n",x/y); } void calculate(int option) { void (*pfun[5])(int ,int) = {0,Add,Sub,Mul,Div};//定義了一個函式指標陣列pfun,指向了Add,Sub,Mul,Div函式 int x = 0; int y = 0; printf("請輸入兩個運算元:>");//進入運算元的選擇 scanf("%d%d",&x,&y); if((option==4)&&(y==0))//當選項是除法,並且第二個運算元為0的時候報錯 { printf("引數有誤!\n"); return ;//直接返回 } pfun[option](x,y);//通過 函式指標陣列 進行 函式的呼叫 } void menu()//選單函式 { printf(" 1.add 2.sub\n"); printf(" 3.mul 4.div\n"); printf(" 0.exit\n"); } int main() { int option = 0; while(1) { menu(); printf("請輸入:>"); scanf("%d",&option); if(option>=1&&option<=4) { calculate(option); } else if(option==0) { break; } else { continue; } } return 0; }
(2)回撥函式
程式碼塊:
#include<stdio.h> void Add(int x,int y) { printf("%d\n",x+y); } void Sub(int x,int y) { printf("%d\n",x-y); } void Mul(int x,int y) { printf("%d\n",x*y); } void Div(int x,int y) { printf("%d\n",x/y); } void calculate(void (*pfun)(int,int))//由於引數中是一個函式指標,因此這是一個回撥函式 { int x = 0; int y = 0; printf("請輸入兩個運算元:>"); scanf("%d%d",&x,&y); if((pfun==Div)&&(y==0)) { printf("引數有誤!\n"); return ; } pfun(x,y);//通過函式指標來回調 指向的函式 } void menu()//選單函式 { printf(" 1.add 2.sub\n"); printf(" 3.mul 4.div\n"); printf(" 0.exit\n"); } int main() { void (*pfun[5])(int ,int) = {0,Add,Sub,Mul,Div}; int option = 0; while(1) { menu(); printf("請輸入:>"); scanf("%d",&option); if(option>=1&&option<=4) { calculate(pfun[option]); } else if(option==0) { break; } else { continue; } } return 0; }