函数指针数组的运用 -- 转移表

前言 : 如果我们要制作一个计算器,实现加减乘除的功能

我们会想到的思路是:

1. 首先,通过我输入的数 , 来选择实现什么功能 

2. 然后再输入对应的操作数

3. 最后得到我们所想要的结果

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 input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do {
		menu();
		printf("请选择:>  ");
		scanf("%d", &input);
		switch (input)
		{
		case 1 :
			printf("请输入两个操作数:> ");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			printf("\n");
			break;
		case 2:
			printf("请输入两个操作数:> ");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);
			printf("\n");
				break;
		case 3:
			printf("请输入两个操作数:> ");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d\n", ret);
			printf("\n");
			break;
		case 4:
			printf("请输入两个操作数:> ");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d\n", ret);
			printf("\n");
			break;
		case 0:
			printf("退出计算机!\n");
			printf("\n");
			break;
		default:
			printf("输入错误!请重新输入!\n");
			printf("\n");
			break;
		}

	} while (input);
	return 0;
}

 但是,如果按照以上的写法,如果还需要往计算器里面再加入一些操作符,代码会变得很多,我们仔细观察发现实现计算功能的函数类型相同,所以我们可以使用函数指针数组来存放

代码优化:

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 input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	//函数指针数组  --- 转移表(通过下标跳转到某一个函数)
	int(*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };
	//                           0   1  2   3   4
	//那么这样初始化,可以通过访问数组的下标找到所对应的函数
	do
	{
		menu();
		printf("请选择:>  ");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = pfArr[input](x,y);
			printf("%d\n", ret);
			printf("\n");
		}
		else if(input == 0) {
			printf("退出计算器!\n");
			printf("\n");
			break;
		}
		else
		{
			printf("输入错误!请重新输入!\n");
			printf("\n");
		}
	} while (input);
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值