首页 > 其他分享 >函数指针数组(转移表)

函数指针数组(转移表)

时间:2024-03-16 15:59:31浏览次数:23  
标签:arr int 转移 Add 数组 函数指针 Div

函数指针数组,首先是一个数组,其次其中存储的数据类型是函数指针,所以我们可以通过使用函数指针数组来调用不同的函数。

接下来为大家展示他的基本使用方法(模拟计算器)

函数指针数组结构

    int (*arr[])(int x, int y) = {NULL, Add,Sub,Mul,Div };

其中NULL, Add,Sub,Mul,Div,分别是四个函数的函数名,我们可以通过函数名调用函数,但是需要注意的是NULL是一个空指针不能直接调用,而添加他的目的是因为我们的菜单,和最外层的do while循环当输入的数为0是则退出循环,所以写了一个空指针用来占位,此时Add对应的下标为1,其他亦是如此符合我们的菜单。

int x,int y 则是需要计算和传入的两个整形的数据用来计算加减乘除。

*arr[] 则是指针数组其中arr为数组名,

函数指针数组类型

    int (*[])(int x, int y) = {NULL, Add,Sub,Mul,Div };

我们可以看到函数指针数组的类型就是去掉函数名arr

函数指针数组模拟计算器

实现思路

我们首先定义四个函数用来计算加减乘除,然后分别将这四个函数的函数指针传入arr函数指针数组中通过下标来调用。输入1则调用Add函数以此类推。

最外层用了do while 循环来实现菜单的展示以及if判断通过输入的结果判断是否进行计算还是退出,亦或是输入错误如果输入0则退出。(如果不了解do while循环可以参考主页C语言分支循环)

代码展示

#include<stdio.h>
//函数指针数组,转移表
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 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;
	//定义函数指针数组用来存储四种算法
	int (*arr[])(int x, int y) = {NULL, Add,Sub,Mul,Div };
	do
	{ 
	menu();
	printf("请选择-->");
	scanf("%d", &input);
	if (input >= 1 && input <= 4)
	{
		printf("请输入两个操作数:");
		scanf("%d %d", &x, &y);
		ret = arr[input](x, y);
		printf("计算结果为:%d\n", ret);
	}
	else if (input == 0)
	{
		system("cls");
		break;
	}
	else
	{
		system("cls");
		printf("输入错误请重新输入\n");
	}

	} while (input);
		

	return 0;
}

标签:arr,int,转移,Add,数组,函数指针,Div
From: https://blog.csdn.net/weixin_74837455/article/details/136763803

相关文章

  • P3374 【模板】树状数组 动态求连续区间和 刷题笔记
    我们创建如下的树状数组来辅助操作该数组每个s[i]处于第几层取决于其二进制最后低位的1处于从右往左数第几列显然所有奇数的最右边一位都是1即其最低位的1处于右边第一列所以所有的奇数处于第一层而2,6,10,14的最低位1处于右边第二列 所以这些数处于第二层 8的最......
  • 2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意
    2024-03-16:用go语言,给你一个正整数数组nums,每一次操作中,你可以从nums中选择任意一个数并将它减小到恰好一半。(注意,在后续操作中你可以对减半过的数继续执行操作)请你返回将nums数组和至少减少一半的最少操作数。输入:nums=[5,19,8,1]。输出:3。答案2024-03-16:......
  • 数组
    一,为什么需要数组由于变量只能存放一个值,当一回存放多个值会很麻烦,所以C++的创造者增加了数组这个概念,能够同时存放多个值。二,一维数组1.一维数组的定义//数组定义//格式:数据类型数组名[数组长度]={元素1,元素2,元素3};inta1[5];floata2[15];doublea3[100];chara4......
  • 【C语言初阶(五)】数组
    ❣博主主页:33的博客❣▶文章专栏分类:C语言从入门到精通◀......
  • 20240315,逻辑类型,条件和逗号,函数,数组
    刚好看到逻辑类型,今天早上有个很好玩的事情,一早上醒来圆圆的小狗跑到了床下,然后她说“你是不是打我的小狗了”我;”我没有,我什么都不知道””他的屁股都扁了“我:“我怎么知道,他的屁股扁了关我什么事"“你怎么知道他的屁股扁了”我“不是你说的嘛”“我诈你的”,然后走了......
  • Java中二维数组全部赋成同一个值
    有以下几种方法可以将二维数组全部赋成同一个值:1. 使用双重循环遍历二维数组,逐个元素赋值。int[][]arr=newint[3][3];intvalue=5;for(inti=0;i<arr.length;i++){for(intj=0;j<arr[i].length;j++){arr[i][j]=value;}}2. 使用Arrays.......
  • 树状数组
    模板题:https://www.luogu.com.cn/problem/P3374题解:#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+5;intm,n;intc[N];intlowbit(intx){ returnx&-x;}intquery(intx){ intres=0; while(x){ res+=c[x]; x=x......
  • 4.数组
    一、为什么需要数组由于变量只能存放一个值,当要一回存放多个值时会很麻烦,所以C++的创造者增加了数组这个概念,能够同时存放多个值。二、一维数组一维数组的定义//数组定义//格式:数据类型数组名[数组长度]={元素1,元素2,元素3};inta1[5];floata2[15];doublea3[100];......
  • 数组扩容golang
    packagemainimport( "fmt" "unsafe")funcmain(){ which:=make([]byte,0) which=append(which,[]byte("123")...) which1:=which fmt.Printf("which:%s varpointer:%p arrpointer%p cap:%d len:%d, w......
  • 第一课——树状数组
    前缀和算法可以计算某一个区间的累记和,但是出现修改的时候,前缀和的效率便得不到保障。于是数状数组出现了。出现原因总结——需求从单纯的区间查询变为了单点修改+区间查询。树状数组本文不探讨树状数组的开发过程,这里先给出树状数组的结构:树状数组的设计非常巧妙,它让下标为......