C++笔记之表驱动法

C++笔记之表驱动法

code review!
在这里插入图片描述

文章目录

  • C++笔记之表驱动法
    • 0.数组小技巧
    • 1.std::map实现
    • 2.结构体实现
    • 3.数组和结构体结合实现表驱动法-存储函数指针
    • 4.表驱动法概念-ChatGPT
    • 5. 直接访问表(Direct Access Table)的示例
    • 6. 索引访问表(Indexed Access Table)的示例
    • 7. 阶梯访问表(Look-Up Table)的示例
    • 8.《代码大全(第二版)》——表驱动法
    • 表驱动法经典应用:作为状态转移数组

参考博文:

一个计算器的程序—表驱动法

0.数组小技巧

在这里插入图片描述

代码

int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getDays(int month){return monthDays[--month];
}

1.std::map实现

在这里插入图片描述

代码

#include <iostream>
#include <map>// 定义一个映射表,将输入值映射到输出值
std::map<int, std::string> table = {{1, "One"},{2, "Two"},{3, "Three"},{4, "Four"},{5, "Five"}
};int main() {int input;std::cout << "请输入一个数字 (1-5): ";std::cin >> input;// 使用映射表查找输入值对应的输出值auto it = table.find(input);if (it != table.end()) {std::cout << "对应的字符串为: " << it->second << std::endl;} else {std::cout << "找不到对应的字符串" << std::endl;}return 0;
}

2.结构体实现

在这里插入图片描述

代码

#include <iostream>
#include <vector>// 定义一个结构体,包含输入和输出字段
struct Mapping {int input;std::string output;
};// 定义一个表格,将输入值映射到输出值
std::vector<Mapping> table = {{1, "One"},{2, "Two"},{3, "Three"},{4, "Four"},{5, "Five"}
};int main() {int input;std::cout << "请输入一个数字 (1-5): ";std::cin >> input;// 使用表格查找输入值对应的输出值for (const Mapping& entry : table) {if (entry.input == input) {std::cout << "对应的字符串为: " << entry.output << std::endl;return 0; // 找到匹配项后退出}}std::cout << "找不到对应的字符串" << std::endl;return 0;
}

3.数组和结构体结合实现表驱动法-存储函数指针

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <iostream>
#include <functional>// 定义一个结构体来存储操作符和对应的函数指针
struct Operator {char op;std::function<double(double, double)> func;
};// 定义一些操作函数
double Add(double a, double b) {return a + b;
}double Subtract(double a, double b) {return a - b;
}double Multiply(double a, double b) {return a * b;
}double Divide(double a, double b) {if (b != 0) {return a / b;} else {std::cerr << "Error: Division by zero" << std::endl;return 0.0;}
}int main() {// 创建操作符数组Operator operators[] = {{'+', Add},{'-', Subtract},{'*', Multiply},{'/', Divide}};char userOperator;double operand1, operand2;std::cout << "Enter an operator (+, -, *, /): ";std::cin >> userOperator;// 查找用户输入的操作符,并执行相应的函数for (const Operator& op : operators) {if (op.op == userOperator) {std::cout << "Enter two operands: ";std::cin >> operand1 >> operand2;double result = op.func(operand1, operand2);std::cout << "Result: " << result << std::endl;break;}}return 0;
}

4.表驱动法概念-ChatGPT

表驱动法是一种编程技巧,用于将输入值与输出值之间的关系存储在数据结构中,以减少大量的条件语句或计算逻辑。表驱动法可以采用不同的实现方式,包括直接访问表、索引访问表和阶梯访问表。

  1. 直接访问表(Direct Access Table):
    直接访问表是最简单的表,其中每个输入对应一个唯一的输出。这通常用于快速查找信息,例如字典或电话簿。以下是一个示例,显示如何通过人名查找其电话号码:

    直接访问表(姓名对应电话号码):
    -----------------------------------------
    | 姓名     | 电话号码          |
    -----------------------------------------
    | 小明     | 123-456-7890    |
    | 小红     | 234-567-8901    |
    | 小李     | 345-678-9012    |
    | ...     | ...             |
    -----------------------------------------
    
  2. 索引访问表(Indexed Access Table):
    索引访问表使用一个索引来引导到正确的数据记录。索引通常是关键字或标识符,它们指向数据表的特定行。以下是一个示例,显示如何通过学生ID查找学生信息:

    索引访问表(学生ID对应学生信息):
    ----------------------------------------------
    | 学生ID  | 姓名      | 年龄 | 课程   |
    ----------------------------------------------
    | 1001    | 小明      | 18   | 数学   |
    | 1002    | 小红      | 19   | 英语   |
    | 1003    | 小李      | 20   | 物理   |
    | ...     | ...       | ...  | ...    |
    ----------------------------------------------
    
  3. 阶梯访问表(LUT - Look-Up Table):
    阶梯访问表包含多个级别的数据,通常按照某种特定的条件进行分组。查找数据需要根据条件跳转到正确的级别,然后在该级别中查找所需信息。以下是一个示例,显示如何通过年龄范围查找不同年龄组的人数:

    阶梯访问表(年龄范围对应人数):
    ----------------------------------------------
    | 年龄范围  | 人数     |
    ----------------------------------------------
    | 0-10岁   | 100     |
    | 11-20岁  | 200     |
    | 21-30岁  | 150     |
    | ...      | ...     |
    ----------------------------------------------
    

这些示例展示了不同类型的表驱动法,它们在不同的应用中有不同的用途。直接访问表用于单一映射关系,索引访问表用于标识符到数据的映射,而阶梯访问表用于范围或条件相关的数据检索。以下是这些不同实现方式的详细解释:

  1. 直接访问表(Direct Lookup Table):

    • 直接访问表是一种最简单的表驱动法实现方式。
    • 在直接访问表中,输入值(通常作为键)与对应的输出值直接存储在一个数据结构中,通常是数组或散列表(哈希表)。
    • 通过直接查找输入值,你可以立即找到对应的输出值,而无需进行复杂的计算或搜索。
    • 这种方式适用于输入值的范围有限且已知的情况,例如将字母映射到其ASCII码值的情况。
  2. 索引访问表(Indexed Lookup Table):

    • 索引访问表是一种使用索引(通常是整数)来查找输出值的表驱动法实现方式。
    • 输入值与索引之间建立了一对一或一对多的映射关系,这个索引用于在表中查找对应的输出值。
    • 通常,表会以数组或向量的形式存储,索引用作数组的索引,从而找到输出值。
    • 这种方式适用于输入值不需要连续的情况,例如在游戏编程中,将不同类型的敌人映射到其属性和行为的情况。
  3. 阶梯访问表(Stepwise Lookup Table):

    • 阶梯访问表是一种将输入值划分为范围或阶段,并为每个范围分配一个输出值的表驱动法实现方式。
    • 输入值被划分为离散的阶梯(也称为阶段或区间),然后为每个阶梯分配一个输出值。
    • 输入值根据其所属的阶梯来查找对应的输出值,通常使用条件语句或查找表来实现。
    • 这种方式适用于将连续的输入值映射到离散的输出值范围,例如在温度范围内确定天气状况的情况,将分数映射到等级的情况等。

5. 直接访问表(Direct Access Table)的示例

#include <iostream>
#include <map>
#include <string>int main() {// 创建并初始化直接访问表(姓名对应电话号码)std::map<std::string, std::string> directAccessTable = {{"小明", "123-456-7890"},{"小红", "234-567-8901"},{"小李", "345-678-9012"}};// 通过姓名查找电话号码std::string name = "小明";if (directAccessTable.find(name) != directAccessTable.end()) {std::cout << name << "的电话号码是:" << directAccessTable[name] << std::endl;} else {std::cout << "找不到姓名为" << name << "的记录。" << std::endl;}return 0;
}

6. 索引访问表(Indexed Access Table)的示例

#include <iostream>
#include <map>
#include <string>int main() {// 创建并初始化索引访问表(学生ID对应学生信息)std::map<int, std::map<std::string, std::string>> indexedAccessTable = {{1001, {{"姓名", "小明"}, {"年龄", "18"}, {"课程", "数学"}}},{1002, {{"姓名", "小红"}, {"年龄", "19"}, {"课程", "英语"}}},{1003, {{"姓名", "小李"}, {"年龄", "20"}, {"课程", "物理"}}}};// 通过学生ID查找学生信息int studentId = 1001;if (indexedAccessTable.find(studentId) != indexedAccessTable.end()) {std::cout << "学生ID为" << studentId << "的学生信息:" << std::endl;for (const auto& pair : indexedAccessTable[studentId]) {std::cout << pair.first << ": " << pair.second << std::endl;}} else {std::cout << "找不到学生ID为" << studentId << "的学生记录。" << std::endl;}return 0;
}

7. 阶梯访问表(Look-Up Table)的示例

#include <iostream>
#include <map>
#include <string>int main() {// 创建并初始化阶梯访问表(年龄范围对应人数)std::map<std::string, int> lookupTable = {{"0-10岁", 100},{"11-20岁", 200},{"21-30岁", 150}};// 通过年龄范围查找人数std::string ageRange = "11-20岁";if (lookupTable.find(ageRange) != lookupTable.end()) {std::cout << ageRange << "的人数为:" << lookupTable[ageRange] << std::endl;} else {std::cout << "找不到" << ageRange << "的人数记录。" << std::endl;}return 0;
}

在这里插入图片描述

8.《代码大全(第二版)》——表驱动法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

表驱动法经典应用:作为状态转移数组

表驱动最常见在状态机设计模式里作为状态转移数组,在命令设计模式里作为命令码数组。

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

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

相关文章

Yolov8目标识别与实例分割——算法原理详细解析

前言 YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统&#xff0c;最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出&#xff0c;并随后进行了多次改进和迭代&#xff0c;产生了一系列不同版本的YOLO模型&#xff0c;如YOLOv2、YOLOv3、YOLOv4&a…

项目上线前发现严重Bug怎么办?

今天分享一个面试问题&#xff0c;现在有一个面试场景&#xff1a; 项目计划明天发布&#xff0c;但是在今天你作为测试人员发现了一个严重的bug&#xff0c;市场相关人员又在催发布的事情&#xff0c;这个时候你应该怎么办&#xff1f; 这是测试工程师不管是在面试&#xff0…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…

基于计算机视觉的身份证识别系统 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…

初识jQuery

文章目录 一、jQuery介绍二、Jquery优势三、jQuery版本四、jQuery对象jQuery的引用js代码与jQuery代码对比标签对象与jQuery对象 五、jQuery查找标签1.基本选择器2.组合选择器3.层次选择器4.属性选择器5.基本筛选器6.表单筛选器 六、筛选器方法七、操作标签1.class操作2.文本操…

048基于web+springboot的校园资料分享平台

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本校园资料分享平台有管理员和用户两个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;资料分享管理&#xff0c;资源分…

FastBond2阶段2——基于ESP32C3开发的简易IO调试设备

1. 项目介绍 之前买了许多国产单片机esp32c3一直在吃灰&#xff0c;没有发挥它的真实价值。非常感谢硬禾组织的Fastbond2活动&#xff0c;刚好两者经过微妙的碰撞。恰可以用于FastBond2活动主题4 - 测量仪器&#xff08;单片机开发测试领域&#xff09;&#xff0c;或者用于国…

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的&#xff0c;包括制度的不完善、医疗资源紧张等问题也时有存在&#xff0c;为了缓解医患矛盾&#xff0c;不仅要提升患者以及家属对于医院的认知&#xff0c;还需要完善医疗制度&#xff0c;提高医疗资源的配置效率&#xff0c;提高服务质量。 因…

Linux学习笔记之三(vim编辑器)

目录 1、vim的四种工作模式2、正常模式下的操作指令2.1、进入编辑模式2.2、进入命令行模式2.3、进入视觉模式2.4、光标跳转2.5、复制、粘贴、删除2.6、重复、撤回操作 3、命令行模式下的操作指令 1、vim的四种工作模式 vim的四种工作模式分别是编辑模式(insert mode)、命令行模…

多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

【Linux】僵尸进程、孤儿进程的理解与验证

僵尸进程 概念 僵尸进程&#xff08;Zombie Process&#xff09;是指一个已经终止执行的子进程&#xff0c;但其父进程尚未调用 wait() 或 waitpid() 函数来获取子进程的退出状态。 Linux 中&#xff0c;僵尸进程会保留一些资源&#xff0c;如进程 ID、进程表项和一些系统资源…

王道p18 07.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。(c语言代码实现)

视频讲解在这&#xff1a;&#x1f447; p18 第7题 c语言代码实现王道数据结构课后代码题_哔哩哔哩_bilibili 本题代码如下 int merge(struct sqlist* A, struct sqlist* B, struct sqlist* C) {if (A->length B->length > C->length)//大于顺序表的最大长度r…

48基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

基于matlab的经验傅里叶分解&#xff0c;适用于非线性及非平稳时间序列分析&#xff0c;将信号进行精确分解。程序已调通&#xff0c;可直接运行。

玻色量子签约移动云“五岳”量子云计算创新加速计划!

2023年4月24-26日&#xff0c;由中国移动通信集团主办的“云擎未来 智信天下”2023移动云大会在苏州圆满落幕。 中国移动在本次大会发布了“五岳”量子云计算创新加速计划。作为中国移动量子计算方向的战略伙伴&#xff0c;玻色量子创始人&CEO文凯博士代表北京玻色量子科技…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义&#xff0c;两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业…

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针&#xff0c;快指针一次走两个&#xff0c;慢指针一次走一个&#xff0c;如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…