当前位置:首页 » 《随便一记》 » 正文

c语言:转移表的实现

18 人参与  2024年03月05日 19:16  分类 : 《随便一记》  评论

点击全文阅读


Hello,宝子们!今天我们来模拟实现一下我们生活中的应用最频繁的工具:计算器,实现计算器有三种方式。
废话不多说,直接上代码,计算器的一般实现:

#include <stdio.h>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;}int main(){int x, y;int input = 1;int ret = 0;do{    //首先一上来就打印菜单,下面进行选择,所以要用到do while 循环结构printf("*************************\n");printf("     1:Add       2:Sub     \n");printf("     3:Mul       4:Div      \n");printf("     0:Exit                     \n");printf("*************************\n");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;}

像这样的代码看完之后有什么问题?虽然也不影响最后计算的结果,但是这样的代码是不是太冗余了,case里面重复的代码太多了,这还只有加减乘除四个选项,要是再多扩张几个选项呢,比如:&&,||,>>,<<等运算呢?所以这样的代码效率太低下,不推荐使用。
那有没有比较高效,不这么冗余的方法呢?当然了,这里就要用到我们前面所讲的函数指针数组了,如果还不知道函数指针数组是什么的话,可以看看我前面讲的这篇文章https://blog.csdn.net/weixin_66058866/article/details/136136008
相信聪明的你看完这篇文章,心里应该已经有答案了吧?
函数指针数组代码实现如下:

#include <stdio.h>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;}int main(){int x, y;int input = 1;int ret = 0;int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //为了跟菜单里的选项对应起来,需要在数组元素中的最前面加了一个元素,//这样就不至于出现当我们输入下标为1的元素时,访问的是sub这类问题了。do{printf("*************************\n");printf("     1:Add      2:Sub      \n");printf("     3:Mul      4:Div       \n");printf("     0:Exit                     \n");printf("*************************\n");printf( "请选择:" );scanf("%d", &input);if ((input <= 4 && input >= 1))//判断输入的值是否在选项当中{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;}

上面我们创建了函数指针数组,并且把加减乘除函数的地址都存放进去,然后想实现什么运算,直接通过下标的方式去调用对应的函数,这种方式就很好的解决了代码冗余的问题,而且如果你还想再扩张选项的时候,也不需要再像第一种方法那样麻烦了。
根据input下标,找到对应的函数,然后再调用对应的函数,这种方法有没有发现它像一个跳板一样,在做一个转移的动作,所以这种方法也被称为转移表
那么是否还有其他的方式呢?这时候我们就涉及到一种高级的玩法了。
首先来看代码:

#include <stdio.h>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 calc(int(*fp)(int x,int y))//使用函数指针来接收函数的地址{int x=0;int y=0;int ret=0;printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = fp(x, y);printf("ret = %d\n", ret);}int main(){int x, y;int input = 1;int ret = 0;do{    //首先一上来就打印菜单,下面进行选择,所以要用到do while 循环结构printf("*************************\n");printf("     1:Add       2:Sub     \n");printf("     3:Mul       4:Div      \n");printf("     0:Exit                     \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(Add);//把相对应的函数的地址传过去break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

像这种实现方式,你会发现并没有在主函数里直接调用AddSubMulDiv等函数,而是把这些函数的地址传给了clac函数,然后再calc函数内部通过指针变量来调用calc指向的函数,这也是一种回调函数的机制,当然这种机制现在理解不了也没关系,在之后的深入理解指针(4)里面我会详细讲到哟!


创作不易,看完别忘了给博主一键三连哟!谢谢大家呀?


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/74332.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 温欣妍江言澈:结局+番外精品选集(缥缈梦碎无人处)番外+续集
  • 爱似霜雪化无痕附加(爱似霜雪化无痕)(靳绍言虞芮)全本浏览阅读连载中
  • 此生恩怨皆已了,愿来世两不相逢最新试读_何井野丁蓉妹妹最新目录_小说后续在线阅读_无删减免费完结_
  • 春风也醉我痴心超长版_夏廉陆芸顾知知好评_小说后续在线阅读_无删减免费完结_
  • 前传一别经年何如故续集:全文+番外周瑾年陈柚一:结局+番外新上热文
  • 坐了一次副驾老婆的小助理就让我跪下道歉(宋云澜孟岚)_坐了一次副驾老婆的小助理就让我跪下道歉
  • 全书浏览他的怀孕女秘书上门逼宫后,我闪婚偏执小狼狗免费(陆枫)_他的怀孕女秘书上门逼宫后,我闪婚偏执小狼狗免费(陆枫)全书结局
  • 网恋被甩后他成了全网初恋小说(裴知穗季延琛)(网恋被甩后他成了全网初恋)在线畅读阅读连载中
  • 靳绍言虞芮小说完本+外篇(爱似霜雪化无痕)畅享阅读
  • 温媛傅寒燚是什么小说(认错白月光后,我惨死,他哭疯)(温媛傅寒燚)全本完整清爽版在线+无广告结局
  • 为哄白月光开心老婆亲手砍断九尾狐的八尾,我离开后她悔疯了章节目录_沈清九尾狐陆景最新目录_小说后续在线阅读_无删减免费完结_
  • 为我拍下遗照后,他却后悔分手了一口气完结_阎王江城老白故事会_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1