利用函数指针数组或回调函数写一个简易的计算器

首先认识什么是函数指针数组

指针:每个变量一创建就会有一个地址,函数创建是也有地址,而保存地址的类型就是指针变量类型。

函数指针:指针指向的地址是整型的就是整型指针,指向浮点型的就是浮点型指针,那么指向函数的就是函数指针。

int Add(int x, int y){
    return x + y;
}//这是函数

int* a;//这是整型指针,int*为整型指针类型,a为整型指针名字
char* b;//这是字符型指针,char*为字符指针类型,a为字符指针名字
double* c;//这是浮点型指针,double*为浮点型指针类型,a为浮点型指针名字

//int (*) (int,int)是函数指针类型,pf为函数指针名字,
//前面的int是函数的Add函数的返回类型,后面两个int是函数的参数

int (*pf)(int,int) = Add;//这是函数指针

指针数组:显而易见,什么类型的数组也是由前面的类型决定的,指针数组就是元素全是指针的数组。

int arr[]={0};//这是整形数组,数组里的元素都是整型
char arr[]={0};//这是字符串数组,数组里的元素都是字符
double arr[]={0};//这是浮点型数组,数组里的元素都是浮点数

int* arr[];//这是指针数组,数组里的元素都是指针

函数指针数组就是建一个数组,这个数组的所有元素都是函数指针。

需要用到的函数

菜单

void menu() {
	printf("*******************************\n");
	printf("*******1.Add 2.Sub*************\n");
	printf("*******3.Mul 4.Div*************\n");
	printf("***********0.exit**************\n");
	printf("*******************************\n");
}

这是加减乘除四个函数

//加
int Add(int x, int y) {
	printf("加法操作\n");
	return x + y;
}
//减
int Sub(int x, int y) {
	printf("减法操作\n");
	return x - y;
}
//乘
int Mul(int x, int y) {
	printf("乘法操作\n");
	return x * y;
}
//除
int Div(int x, int y) {
	printf("除以操作\n");
	return x / y;
}
函数指针数组实现计算器

main函数

int main() {
	int input;
	int x, y;
	int ret;

//这是函数指针数组,元素是加减乘除四个函数的地址,为了能够对应下面的input,0下标写个NULL
	int (*cal[])(int, int) = { NULL, Add, Sub, Mul, Div };

	do {
		menu();
		scanf("%d", &input);
		printf("请输入两个数\n");
		scanf("%d %d", &x, &y);
		
		switch (input)
		{
		case 0:
			break;
//input输入哪个值,就会实现对应函数的功能
		case 1:
			ret = cal[input](x, y);
			printf("加法操作,得数为:%d\n", ret);
			break;
		case 2:
			ret = cal[input](x, y);
			printf("减法操作,得数为:%d\n", ret);
			break;
		case 3:
			ret = cal[input](x, y);
			printf("乘法操作,得数为:%d\n", ret);
			break;
		case 4:
			ret = cal[input](x, y);
			printf("除法操作,得数为:%d\n", ret);
			break;
		default:
			printf("无此操作,请重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

但用函数指针数组有一个缺陷,就是在switch语句中有许多相似的代码,代码重复冗余,十分影响观感。现在函数只有四个,如果以后有十多二十多个函数,那代码量就大了,所以我们需要回调函数。

什么是回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

回调函数实现计算器
//为防止代码冗余,写一个回调函数
//回调函数,参数是函数指针
void Cal(int(*pf)(int, int)) {
	int x, y;
	int ret;
	printf("请输入两个数\n");
	scanf("%d,%d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n",ret);
	
}
//利用回调函数来实现简单的整数计算功能
int main() {
	int input;
	
	do {
		menu();
		scanf("%d", &input);
		int ret;

		switch (input)
		{

		case 0:
			printf("退出");
			break;

		case 1:
	//写一个函数,参数为函数指针,把要用的函数作为参数转过去,回调函数会根据参数实现不同的功能
	//回调函数相当于中转站
			Cal(Add);
			break;

		case 2:
			Cal(Sub);
			break;

		case 3:
			Cal(Mul);
			break;

		case 4:
			Cal(Div);
			break;

		default:
			printf("无此操作,请重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值