c语言(1.函数指针数组、2.回调函数)实现简易计算器

一级标题:简易计算器的实现。

二级标题:代码中运用的知识

在这里我会使用函数指针数组与回调函数分别写一份简易计算器的代码;那么函数指针数组与回调函数是什么呢?
1、函数指针数组,形如int ( * p[5])(int ,int )的代码就是函数指针数组,p就是函数名,函数类型为int(*[])(int ,int),其返值为int,参数类型也为int;
2、回调函数是什么?回调函数是一个被作为参数传递的函数,它不是由调用者直接调用,而是在特定的事件或条件发生时由其他代码调用。

三级标题:代码实现

一、函数指针数组:首先计算器我们知道计算器实现的就是加减乘除的四册简单运算;那我们可以先写四个简单计算的函数

int sub(int x,int y)
{
	return x+y;
}

int jian(int x,int y)
{
	return x-y;
 } 
 
 int cheng(int x,int y)
 {
 	return x*y;
 }
 
 int chu(int x,int y)
 {
 	return x/y;
 }

然后我们得明白怎么使用,我们可以先制作一个菜单函数,在里面用数字来定义执行什么;例如1、加,2、减,3、乘,4、除,0、退出。

void menu()
{
	printf("*******************\n");
	printf("***1.加 2.减*******\n");
	printf("***3.乘 4.除*******\n");
	printf("***  0.退出********\n");
}

然后我们就要思考如何让我们输入定义的数字就进入对应的函数;这个就需要函数数组指针的帮助了,我们可以定义一个int (*p[5])(int ,int )来分别指向这四个函数,就像int (*p[5])(int ,int)={0,sub,jian,cheng,chu};为什么要定义一个0;这是因为数组下标是原数顺序-1,为了使更好对应,所以多写一个0;那么我们如何使用呢?我们可以定义一个input作为选择函数的数,x,y作为我们需要计算的数,那就只需要n=pinput;就可以将计算的结果返回到n里。
总的代码:

#include<stdio.h>

void menu()
{
	printf("*******************\n");
	printf("***1.加 2.减*******\n");
	printf("***3.乘 4.除*******\n");
	printf("***  0.退出********\n");
}
int sub(int x,int y)
{
	return x+y;
}

int jian(int x,int y)
{
	return x-y;
 } 
 
 int cheng(int x,int y)
 {
 	return x*y;
 }
 
 int chu(int x,int y)
 {
 	return x/y;
 }
 
int main()
{
	int input;
	int ret=0;
	int x=0,y=0;
	int n=0;
	do{
		menu();
		printf("请选择:\n");
		scanf("%d",&input);
		int (*p[5])(int ,int)={0,sub,jian,cheng,chu};
		printf("请输入x,y->");
		scanf("%d %d",&x,&y);
		n=p[input](x,y);
		printf("%d\n",n);
	}while(input);
	return 0;
 } 

二、回调函数:
在使用回调函数时,也需要定义四个函数来计算加减乘除,这里我就不重复写了,这个代码我们需要使用switch语句,我们一般想的是例如1、加函数case 1:printf(“请输入两个数”);再定义x,y然后再调用加函数,这样的话四个函数就需要重复四次,为了简便代码我们使用了回调函数,也就是定义一个单独的函数,在这个函数里实现相同的代码,而在case语句中我们给它传入对应的运算函数的首地址;然后在这个回调函数里再使用对应运算函数来计算。
代码:

#include<stdio.h>

void menu()
{
	printf("*********************\n");
	printf("*****1.jia 2.jian****\n");
	printf("*****3.cheng 4.chu***\n");
	printf("*****0.exit**********\n");
	printf("*********************\n");
}


int jia(int x,int y)
{
	return x+y;
}
int jian(int x,int y)
{
	return x-y;
}
int cheng(int x,int y)
{
	return x*y;
}
int chu(int x,int y)
{
	return x/y;
}


void jisuan(int(*p)(int,int))
{
	printf("请输入两个数字:");
	int x=0;
	int y=0;
	int n=0;
	scanf("%d %d",&x,&y);
	n=(*p)(x,y);
	printf("--%d-- \n",n);
}

int main()
{
	int input=0;
	do
	{
		menu();
		printf("请输入你的选择->");
		scanf("%d",&input);
		switch(input)
		{
			case 1:
				jisuan(jia);
				break;
			case 2:
				jisuan(jian);
				break;
			case 3:
				jisuan(cheng);
				break;
			case 4:
				jisuan(chu);
				break;
			case 0:
				printf("退出");
				break;
			default:
				printf("输入错误,重新输入:");
				break; 
		}
	}while(input);
	return 0;
 } 
  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值