1. 程式人生 > >【C/C++】用回撥函式實現計算器

【C/C++】用回撥函式實現計算器

一、問題概述

用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;
}