失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C语言:函数指针数组和计算器(加减乘除)的实现

C语言:函数指针数组和计算器(加减乘除)的实现

时间:2021-10-06 09:17:01

相关推荐

C语言:函数指针数组和计算器(加减乘除)的实现

目录

一.概念

二.函数数组的用途:转移表

例子:计算器

法一:用switch来编写

代码

运行结果

对法一的改进(利用函数指针)

代码

法一的缺点

法二(利用函数指针数组)

代码

运行结果

一.概念

数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,比如︰

int *arr[10];

//数组每个元素是int *

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

哪一个才是正确写法呢?

答案是:parr1。parr1先和[]结合,说明parr1是数组,数组的内容是什么呢﹖是int (*)()类型的函数指针。

二.函数数组的用途:转移表

例子:计算器

法一:用switch来编写

代码

#include<stdio.h>void mean(){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,y=0;do{mean();printf("请选择:>");scanf("%d",&input);switch(input)//这里的input就对应menu函数里面的选项{case 1:printf("请输入两个操作数:>");scanf("%d %d",&x,&y);printf("%d\n",Add(x,y));break;case 2:printf("请输入两个操作数:>");scanf("%d %d",&x,&y);printf("%d\n",Sub(x,y));break;case 3:printf("请输入两个操作数:>");scanf("%d %d",&x,&y);printf("%d\n",Mul(x,y));break;case 4:printf("请输入两个操作数:>");scanf("%d %d",&x,&y);printf("%d\n",Div(x,y));break;case 0:printf("退出");break;default:printf("选择错误\n");break;}}while(input!=0);//用这个作为循环的条件}

运行结果

这里我们发现每一个case后面都有段相似的代码,那么我们可以在这一部分加以改进

对法一的改进(利用函数指针)

代码

#include<stdio.h>void mean(){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 Calc(int (*pf)(int,int))//利用函数指针去接受加减乘除四个函数{int x=0,y=0;printf("请输入两个操作数:>");scanf("%d %d",&x,&y);printf("%d\n",pf(x,y));}int main(){int input=0;int x=0,y=0;do{mean();printf("请选择:>");scanf("%d",&input);switch(input)//这里的input就对应menu函数里面的选项{case 1:Calc(Add);break;case 2:Calc(Sub);break;case 3:Calc(Mul);break;case 4:Calc(Div);break;case 0:printf("退出");break;default:printf("选择错误\n");break;}}while(input!=0);//用这个作为循环的条件}

其运行结果也是一样的

法一的缺点

上面只有加减乘除四种功能,如果我们想继续增加功能的话,那我们就需要继续增加case的数目,一旦过多就很容易导致代码复杂,所以当功能比较多时我们就需要另一种更高效的方法。

法二(利用函数指针数组)

代码

#include<stdio.h>void mean(){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,y=0;int (*pfarr[5])(int,int)={0,Add,Sub,Mul,Div};//这里要用5,且第一个为0是为了跟选项匹配do{mean();printf("请选择:>");scanf("%d",&input);if(input>=1&&input<=4){printf("请输入两个操作数:>");scanf("%d %d",&x,&y);int ret=pfarr[input](x,y);printf("%d\n",ret);}else if(input==0){printf("退出\n");}else{printf("选择错误\n");}}while(input!=0);//用这个作为循环的条件}

运行结果

用函数指针数组去存函数,让函数成为数组中的元素,然后就像调用数组中的元素那样调用函数就可以了,这要那个就解决了当需要添加功能而增加case的问题,当我们需要增加功能时可以:如果需要增加就只需要再写一个函数,然后main函数再稍微改动一下就可以了

如图

如果觉得《C语言:函数指针数组和计算器(加减乘除)的实现》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。