用C语言完成一个简单的计算器(函数指针数组与回调函数)

本篇主要分别使用函数指针数组的方法和回调函数的方法编写一个简单的计算器。

函数指针方法

#include <stdio.h>
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)                 //加法函数
{
	return x + y;
}
int SUB(int x, int y)                 //减法函数 
{
	return x - y;
}
int MUL(int x, int y)                 //乘法函数
{
	return x * y;
}
int DIV(int x, int y)                 //除法函数
{
	return x / y;
}
int main()
{
	int a, b, ret,input;
	int(*p[5])(int, int) = { 0,ADD,SUB,MUL,DIV };//定义一个函数指针数组,把四个函数的地址传进去,
	do                                           //为了使调用函数的下标与输入的值匹配,我们再前面多开辟一块空间。
	{
		menu();
		printf("请输入选项:\n");
		scanf("%d", &input);
		if (input == 0)
			printf("退出计算器\n");
		else if (input > 0 && input < 5)
		{
			printf("请输入两个操作数:\n");
			scanf("%d%d", &a, &b);
			ret = p[input](a, b);               //通过函数指针数组里的指针调用函数。
			printf("计算结果为:%d\n", ret);
		}
		else
			printf("输入错误,请重新输入!\n");

	} while (input);
	return 0;
}

 

 

在编写这个代码时,我们首先要思考怎么实现这个程序,首先我们要打印这个计算器的菜单,然后根据输入的数来确定我们进行什么运算,计算完成后我们需要再次回回来重新选择,然后计算,重复,所以我们可以先写一个do……while循环,然后输入选择项,根据输入的内容写程序执行什么内容,就可以用if语句来实现,而当我们选择进行计算时,首先我们要输入被计算的两个操作数,然后再进行计算,我们发现,这四个函数的参数类型和返回类型都一样,那么我们就可以创建一个函数指针数组,把四个函数的地址放进去,然后可以解引用来使用这些函数,之后我们再写一些如果输入错误的措施,就完成了这样一个函数。

回调函数方法

#include <stdio.h>
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)                 //加法函数
{
	return x + y;
}
int SUB(int x, int y)                 //减法函数 
{
	return x - y;
}
int MUL(int x, int y)                 //乘法函数
{
	return x * y;
}
int DIV(int x, int y)                 //除法函数
{
	return x / y;
}
void calat(int(*pa)(int, int))          //calat的函数参数为函数的地址,
{                                       //不同的函数地址,调用不同的函数
	int ret,x,y;
	printf("请输入两个操作数:");
	scanf("%d%d", &x, &y);
	ret = pa(x, y);
	printf("计算结果为:%d\n", ret);
}
int main()
{
	int a, b, ret, input;
	do                                           
	{
		menu();
		printf("请输入选项:\n");
		scanf("%d", &input);
		switch (input)                     
		{
		case 0:
			printf("退出计算!\n");
			break;
		case 1:
			calat(ADD);               //不同的输入值,给calat函数传不同的函数地址。
			break;
		case 2:
			calat(SUB);
			break;
		case 3:
			calat(MUL);
			break;
		case 4:
			calat(DIV);
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

 

在刚进入函数时,步骤与上面的代码相同,但是这里我们是用switch case语句实现对计算项目的选择,而我们可以写一个函数,用来实现计算,这个函数的参数就可以用函数地址,当我们输入的选项不同时,给计算函数不同的函数地址,然后计算函数在根据传来的函数地址来进行调用某一个函数进行计算,这就是一个简单的回调函数。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值