首页 > 其他分享 >函数指针数组的应用-转移表

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

时间:2024-08-12 11:52:24浏览次数:14  
标签:return int ret 数组 printf 函数指针 转移

函数指针数组的概念

数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组, ⽐如:

数组的每个元素是int*类型。

而函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的,比如:

那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?如图:

即在函数指针的基础上加上[],[]中为元素个数。

parr1 先和 [] 结合,说明 parr1是数组,数组的内容是 int (*)(int x, int y) 类型的函数指针。

函数指针数组实现转移表

接下来我们来实现一个计算器,之后通过函数指针数组进行改进。

计算器的一般实现:

//加法
int Add(int a, int b)
{
	return a + b;
}

//减法
int Sub(int a, int b)
{
	return a - b;
}

//乘法
int Mul(int a, int b)
{
	return a * b;
}

//除法
int Div(int a, int b)
{
	return a / b;
}

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



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("ret = %d\n", ret);
			break;
		case 2:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);

	return 0;
}

从上面的代码我们可以看到,在switch语句中,除了各自使用的函数不同,其他的语句均相同,这就出现了冗余现象

那要怎么解决呢?

接下来我们使用函数指针数组对代码进行改进

如图,我们可以定义一个函数指针数组,将计算器中函数的地址放进数组中,当需要用到函数时,直接通过函数指针数组进行调用,这样就可以很好解决代码冗余问题。当然,为了方便数组中函数与用户选择使用的函数一致,下标为0的元素可以用0数字替代。

转移表的最终实现:

//加法
int Add(int a, int b)
{
	return a + b;
}

//减法
int Sub(int a, int b)
{
	return a - b;
}

//乘法
int Mul(int a, int b)
{
	return a * b;
}

//除法
int Div(int a, int b)
{
	return a / b;
}

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

//函数指针数组
int (*p[])(int x, int y) = { 0, Add, Sub, Mul, Div };

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);

		if (input >= 1 && input <= 4)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = p[input](x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出程序\n");
		}
		else
		{
			printf("选择错误\n");
		}

	} while (input);

	return 0;
}

注:在使用转移表的过程中,可以往函数指针数组添加其他函数,只要参数类型以及返回值类型相同即可。

标签:return,int,ret,数组,printf,函数指针,转移
From: https://blog.csdn.net/weixin_71853810/article/details/141126730

相关文章

  • 对象数组(JAVA)
    例:定义包含3个元素的对象数组,数据类型为Person,并用for遍历输出Person类publicclassPerson{publicintage;publicStringname;publicPerson(intage,Stringname){this.age=age;this.name=name;}}Test类publicclassTe......
  • JS那些api会改变原数组,哪些不会
    会改变数组增删1.push() 在数组最后面插入项,返回数组的长度arr.push(插入元素) 2.pop()在数组最后取出一项,返回取出项arr.pop()3.shift()取出数组中第一项,返回取出项arr.shift() 4.unshift()在数组最前面插入项,返回数组的长度arr.unshift()  5.spli......
  • Leetcode-3129 找出所有稳定的二进制数组I
    Leetcode-3129找出所有稳定的二进制数组I1.题目描述2.解题思路3.代码实现1.题目描述3129找出所有稳定的二进制数组I2.解题思路(1)定义f[i][j][k]表示i个0、j个1且当前位i+j填写值为k=0/1的所有情况;(2)对于f[i][0][0]、f[0][j][1]初始化为1,注意到:......
  • Leetcode-3132 找出与数组相加的整数II
    Leetcode-3132找出与数组相加的整数II1.题目描述2.解题思路3.代码实现1.题目描述3132找出与数组相加的整数II2.解题思路(1)排序后,注意到nums1数组比nums2数组多两个元素,可推出最小匹配元素一定在nums[0]、nums[1]、nums[2]中出现;(2)优先从nums[2]进行判......
  • JS【详解】数据类型检测(含获取任意数据的数据类型的函数封装、typeof、检测是否为 nul
    【函数封装】获取任意数据的数据类型/***获取任意数据的数据类型**@paramx变量*@returns返回变量的类型名称(小写字母)*/functiongetType(x){//获取目标数据的私有属性[[Class]]的值constoriginType=Object.prototype.toString.call(x);//......
  • Java数组小白版
    一、数组概念一、数组定义数组就是指在计算机内存中开辟的连续存储空间,用于存放程序运行中需要用到的一组相同类型数据的容器。二.数组的声明+数组的长度定义数组时需要确定数组的长度(元素的个数),确定后不能更改;获取数组长度:数组名.length1.格式1(默认初始值)数据类型[]......
  • 数组应用实例-三子棋
    目录1.文件组织2.test.c文件的架构2.1主函数2.2菜单2.3游戏2.3.1棋盘初始化:2.3.2下棋过程2.3.3判断输赢3.具体函数声明与实现3.1初始化棋盘3.2打印棋盘3.3玩家下棋3.4判断输赢3.5棋盘占满3.6电脑下棋4.最后调整1.文件组织采用多文件组......
  • 解决LocalDateTime返回前端数据为数组结构的问题
    问题现象解决办法如下1、使用@JsonFormat@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")结果2、使用SpringMVC提供的ExtendMessageConverters@Slf4j@ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurationSupport{/**......
  • 25版王道数据结构课后习题详细分析 第三章栈、队列和数组 3.2 队列 选择题部分
    一、单项选择题————————————————————————————————————————解析:栈和队列的逻辑结构都是线性结构,都可以采用顺序存储或链式存储,C显然也错误。只有D才是栈和队列的本质区别,限定表中插入和删除操作位置的不同。正确答案:D—————......
  • Java 入门探索者09(数组)
    Java的数组是一种固定大小、有序且相同类型元素的集合。它可以存储同一种数据类型的多个元素,并按照索引顺序访问这些元素。Java数组的特点包括:1.长度固定:一旦数组被创建,其长度就不能修改。可以通过数组的length属性来获取数组的长度。2.有序性:数组中的元素按照索引顺序排......