第五节——转移表(让你不再害怕指针)

server/2024/10/18 11:19:34/


文章目录

  • 制作简易计算器
    • 什么是转移表
    • switch函数实现
    • 函数指针数组实现

制作简易计算器

要求:制作一个简易计算器,可以进行* / + - 等功能运算。

什么是转移表

指的就是通过函数指针数组的方式通过数组去调用里面的函数,从而代替switch代码实现的冗余,这就叫做转移表

switch函数实现

  1. 制作简易菜单(告知使用方式)
  2. 通过switch方式完成代码实现
void menu()
{printf("***********************\n");printf("*****1.add   2.sub*****\n");printf("*****3.mul   4.div*****\n");printf("********0.exit*********\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 a = 0;int b = 0;int input = 0;int len = 0;printf("*********计算器********\n");do {menu();scanf("%d", &input);switch (input){case 1:printf("请输入两个数:");scanf("%d%d", &a, &b);len = Add(a, b);printf("%d\n", len);break;case 2:printf("请输入两个数:");scanf("%d%d", &a, &b);len = Sub(a, b);printf("%d\n", len);break;case 3:printf("请输入两个数:");scanf("%d%d", &a, &b);len = Mul(a, b);printf("%d\n", len);break;case 4:printf("请输入两个数:");scanf("%d%d", &a, &b);len = Div(a, b);printf("%d\n", len);break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

实现这个简易计算器之后,我们发现这段代码不够高效简洁,有许多地方是重复的。
这时转移表恰恰可以解决这些问题,把一个冗余的代码化繁为简。
在这里插入图片描述

函数指针数组实现

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 a = 0;int b = 0;int len = 0;// 函数指针数组 -- 转移表int (*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };printf("*********计算器********\n");do {menu();scanf("%d", &input);if (input >= 1 && input <= 4){printf("请输入两个操作数:\n");scanf("%d%d", &a, &b);len = pfArr[input](a, b);printf("%d\n", len);}else if (input == 0){printf("退出计算器\n");break;}elseprintf("输入错误,重新输入\n");} while (input);return 0;
}

我们发现使用转移表之后很快速的简化了重复的代码,并且如果我们需要添加新功能时仅仅需要在转移表中加入函数名(实现对应功能)即可,非常的方便~!!!


http://www.ppmy.cn/server/128036.html

相关文章

酒店生态发展旅游四个一体化建设-—未来之窗行业应用跨平台架构

一、酒店在旅游中的作用 首先&#xff0c;酒店为游客提供了舒适的住宿环境。经过一天的游玩&#xff0c;游客需要一个干净、安全、设施齐全的空间休息&#xff0c;恢复精力&#xff0c;以更好地继续后续的行程。 其次&#xff0c;酒店是旅游服务的重要载体。它不仅提供住宿&am…

C++ 矩阵拼接相关问题记录

应用场景 目前使用的重力补偿算法需要进行矩阵运算。 原先版本的程序通过外部通信(Python)和HMI联动实现,HMI作为客户端,负责控制机械臂运动到不同姿态,并将RPY(Roll-Pitch-Yaw)角发送给服务端,Python作为服务端,在每次机械臂运动指定位姿后,记录当前的RPY角和对应…

嵌入式面试八股文(五)·一文带你详细了解程序内存分区中的堆与栈的区别

目录 1. 栈的工作原理 1.1 内存分配 1.2 地址生长方向 1.3 生命周期 2. 堆的工作原理 2.1 动态内存分配 2.1.1 malloc函数 2.1.2 calloc函数 2.1.3 realloc函数 2.1.4 free函数 2.2 生命周期管理 2.3 地址生长方向 3. 堆与栈区别 3.1 管理方式不同…

快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践

作者&#xff1a;熊兮、贺弘、临在 Mixtral 8x7B大模型是Mixtral AI推出的基于decoder-only架构的稀疏专家混合网络&#xff08;Mixture-Of-Experts&#xff0c;MOE&#xff09;开源大语言模型。这一模型具有46.7B的总参数量&#xff0c;对于每个token&#xff0c;路由器网络选…

Solidity智能合约中的事件和日志

1. Solidity 中的事件和日志概述 1.1 什么是事件&#xff1f; 在 Solidity 中&#xff0c;事件&#xff08;Event&#xff09;是一种允许智能合约与外部世界进行通信的机制。通过触发事件&#xff0c;可以记录合约执行中的关键操作&#xff0c;并将这些操作发送到链上。事件的…

华为OD机试 - Excel单元格数值统计(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

2.1MyBatis——ORM对象关系映射

2.1MyBatis——ORM对象关系映射 1. 验证映射配置2.ResultType和ResultMap2.1ResultMap是最终的ORM依据2.2ResultType和ResultMap的使用区别 3.具体的转换逻辑3.1 TypeHandle类型转换 5.总结 概括的说&#xff0c;MyBatis中&#xff0c;对于映射关系的声明是由开发者在xml文件手…

Vue入门-Vue中实例和java中类的相同和不同

相似之处&#xff1a; 封装性&#xff1a; 在 Java 中&#xff0c;类可以封装数据和方法&#xff0c;将相关的属性和行为组合在一起。类似地&#xff0c;Vue 实例也封装了数据&#xff08;data中的属性&#xff09;、方法&#xff08;methods中的函数&#xff09;以及其他配置…