一、問題概述
用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.add2.sub\n");printf("3.mul4.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.add2.sub\n");printf("3.mul4.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;}