c语言:用转移表实现加减乘除的计算。

定义: 

       转移表就是一个函数指针数组。本质上是数组,数组的内容是函数指针,也就是函数地址,通过调用函数地址就可以调用函数的功能。

特别注明:假如函数名为Add,*Add的效果完全等于Add


为了弄清楚转移表的应用,我用实现计算机加减乘除的例子来说明。

代码1: 

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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);break;case 2:printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = Div(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}

代码2(用转移表):

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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();int (*pfArr[])(int, int) = { NULL,Add,Sub,Mul,Div };//0,1,2,3,4,创建回调函数,调用其余四个函数printf("请选择:");scanf("%d", &input);if (input == 0)//根据菜单选择情况{printf("退出计算器\n");}else if (input >= 1 && input <= 4){printf("请输入两个操作数:");scanf("%d%d", &x, &y);ret = pfArr[input](x, y);//用回调函数调用函数printf("%d\n", ret);}else{printf("选择错误,请重新选择\n");}} while (input);return 0;
}

总结:

通过两段代码,我们不难看出使用转移表的计算机在主函数部分的代码量更加少,无重复性代码,且方便新函数的增加,以上就是转移表的好处和应用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​软考-高级-系统架构设计师教程(清华第2版)【第18章 安全架构设计理论与实践(P648~690)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第18章 安全架构设计理论与实践&#xff08;P648~690&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

视频剪辑技巧:简单步骤,批量剪辑并随机分割视频

随着社交媒体平台的广泛普及和视频制作需求的急剧增加&#xff0c;视频剪辑已经成为了当今社会一项不可或缺的技能。然而&#xff0c;对于许多初学者来说&#xff0c;视频剪辑可能是一项令人望而生畏的复杂任务。可能会面临各种困难&#xff0c;如如何选择合适的软件和硬件、如…

VBA技术资料MF84:判断文件夹是否存在并创建

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

【Qt-23】基于QCharts绘制曲线图

一、QChart简介 QChart是Qt中专门用于绘制图表的模块&#xff0c;支持折线图、柱状图、饼图等常见类型。其主要组成部分有&#xff1a; QChart&#xff1a;整个图表的容器&#xff0c;管理图表中的所有数据和图形属性QChartView&#xff1a;继承自QGraphicsView&#xff0c;用于…

单元测试实战(六)其它

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…

基于单片机C51全自动洗衣机仿真设计

**单片机设计介绍&#xff0c; 基于单片机C51全自动洗衣机仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机C51的全自动洗衣机仿真设计是一个复杂的项目&#xff0c;它涉及到硬件和软件的设计和实现。以下是对这…

如何进行统一异常处理

我们在项目中可以使用ControllerAdvice注解结合ExceptionHandler用于全局异常的处理&#xff0c;ControllerAdvice学名是Controller增强器&#xff0c;作用是给Controller控制器添加统一的操作或处理。此注解结合方法型注解ExceptionHandler&#xff0c;可用于捕获Controller中…

【C++11】weak_ptr智能指针使用详解

系列文章目录 【C11】智能指针与动态内存 文章目录 系列文章目录简介一、头文件二、初始化及使用1. 使用一个shared_ptr来初始化 三、循环引用3.1 循环引用3.2 循环引用 解决方法 简介 在C编程中&#xff0c;处理循环引用是一个常见的问题。循环引用可能导致内存泄漏和资源管…

镀膜与干刻中的平均自由程是什么?

在芯片制造中&#xff0c;镀膜和干刻是其中的重要环节&#xff0c;通常要用到CVD&#xff0c;RIE等技术&#xff0c;对材料表面进行纳米级的精细操作。在这些工序中&#xff0c;原子&#xff0c;分子&#xff0c;离子等&#xff0c;会在气体或真空中进行自由运动&#xff0c;直…

IDEA 高分辨率卡顿优化

VM设置优化 -Dsun.java2d.uiScale.enabledfalse 增加该条设置&#xff0c;关闭高分切换 https://intellij-support.jetbrains.com/hc/en-us/articles/115001260010-Troubleshooting-IDE-scaling-DPI-issues-on-Windows​intellij-support.jetbrains.com/hc/en-us/articles/1…

金融业务系统: Service Mesh用于安全微服务集成

随着云计算的不断演进&#xff0c;微服务架构变得日益复杂。为了有效地管理这种复杂性&#xff0c;人们开始采用服务网格。在本文中&#xff0c;我们将解释什么是Service Mesh&#xff0c;为什么它对现代云架构至关重要&#xff0c;以及它是如何解决开发人员今天面临的一些最紧…

py 字符串转INT

在Python中&#xff0c;可以使用内置的int()函数将字符串转换为整数&#xff08;INT&#xff09;。以下是一个简单的示例&#xff1a; s "123" i int(s) print(i) # 输出&#xff1a;123在上述代码中&#xff0c;我们首先定义了一个字符串s&#xff0c;它包含了一…

centos三台主机配置互信ssh登录

1. 修改hosts信息 1.1三台主机上分别修改hosts文件 vi /etc/hosts1.2 三台主机分别填入如下内容&#xff0c;ip地址需要检查正确 192.168.126.223 node1 192.168.126.224 node2 192.168.126.225 node32. 秘钥生成和分发 2.1 在三台主机上分别生成秘钥 命令输入后&#xff…

剑指JUC原理-19.线程安全集合

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

IDEA-git commit log 线

一、本地代码颜色标识 红色&#xff1a;新建的文件&#xff0c;没有add到git本地仓库蓝色&#xff1a;修改的文件&#xff0c;没有提交到git远程仓库绿色&#xff1a;已添加到git本地仓库&#xff0c;没有提交到git远程仓库灰色&#xff1a;删除的文件&#xff0c;没有提交到g…

苍穹外卖--实现公共字段自动填充

也就是在插入或者更新的时候为指定字段赋予指定的值&#xff0c;使用它的好处就是可以统一对这些字段进行处理&#xff0c;避免了重复代码。在上述的问题分析中&#xff0c;我们提到有四个公共字段&#xff0c;需要在新增/更新中进行赋值操作。 实现步骤&#xff1a;* 1). 自定…

Redis 19 事务

Redis通过MULTI、EXEC、WATCH等命令来实现事务&#xff08;transaction&#xff09;功能。事务提供了一种将多个命令请求打包&#xff0c;然后一次性、按顺序地执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会中断事务而改去执行其他客户端的命令请求…

curl网络请求命令

curl简介 1、什么是curl2、curl命令的基本使用 1、什么是curl CURL&#xff08;CommandLine Uniform Resource Locator&#xff09;是一个利用URL语法&#xff0c;在命令行终端下使用的网络请求工具&#xff0c;支持HTTP、HTTPS、FTP等协议 Linux、MAC系统一般默认已安装好CUR…

169. 多数元素 --力扣 --JAVA

题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 解题思路 利用Arrays自带的函数对数组进行排序&#xff1b;记录起始位置和…

QT专栏1 -Qt安装教程

#本文时间2023年11月18日&#xff0c;Qt 6.6# Qt 安装简要说明&#xff1a; Qt有两个版本一个是商业版本&#xff08;收费&#xff09;&#xff0c;另一个是开源版本&#xff08;免费&#xff09;&#xff1b; 打开安装程序时&#xff0c;通过判断账号是否有公司&#xff0c;安…