表驱动是什么:通过查找数据表来代替复杂的逻辑结构(如 if … else ……, switch等);
表驱动的优点是: 1、 将编程的重心调整到解决问题上,而不是复杂的逻辑判断;
2、 增加了程序的灵活性,易添加,易修改;
3、数据驱动,如果将数据写入文件,每次启动时,从文件中读取,那么,如果要修改一些变量,可能直接修改数据文件,而不是去修改程序结构;
表驱动的三种方法:
1、直接驱动法: 你需要找什么,指定索引,就可以给你立即返回索引在表中对应的元素 或者动作;
案例1:(一维查找:即可以代替一层的if结构或者switch结构):
比如你要查找1--12月份每个月的天数,如下:
month_day[12] = {31,30,29,30,30,31,31,31,30,30,31,30};
return month_day[5];
这样直接对应的就是5月的天数;
直接驱动 是 指 索引 和 需要的得到的数据 或者动作是直接对应关系;
案例2:(三维查找:即有三个条件同时限制,如果使用if 或者 switch 可能需要三层嵌套结构)
比如一个路由景点,收费标准因 性别,是否学生,以及是否残疾 三项 共同决定门票的价格,那么,我们可以
使用三维数据驱动表来代替 复杂的上层if 语句;
int entrance_ticket_fee[][][] =
{ { {0,10} , {0,15} }, { {0,15},{15,30} } }
这是一个三维向量,三个维度分别代表了不同的限制,
第一维代表性别,索引 0代表女,1 代表男;
第二维代表是否是学生,索引 0代表是,索引 1 代表不是;
第三维代表是否是残疾, 索引 0代表残疾, 索引 1代表健康;
以上这个三维数组代表的是:
女孩,学生,残疾 0元
女孩 ,学生,健康 10元;
女孩, 非学生,残疾 0 元;
女孩, 非学生,非常急15元;
男孩,学生,残疾 0元;
男孩,学生,健康,15元;
男孩,非学生,残疾 15元;
男孩,非学生,健康,30元;
通过给定性别,是否是学生,是否残疾,来确定其返回值;
return entrance_ticket_fee[0][1][1] //15元;
2、索引驱动法:
由于很多情况,有分段时,各段情况不一样,比如 按年龄来分,18岁以下和60岁以上的人 景区门票按照标准减一半,而 19 -- 59 之
间的人,门票和年龄相对应,那么,如果还用直接索引法的话,对于0--18岁以下 和 60 岁以上,都对应一个数值,那么其实可以用
一个索引来 代替,这样就节省了空间,这种转化通过函数来实现;
索引驱动是对直接驱动法在节约空间方面的改进;
3、阶梯访问表:
很多问题,并不需要一对一,而是要将其进行归类,简单的例子,比如说按成绩分类:
100 - 90 : A
89 - 80 : B
79 -- 60 : C
59 -- 0 : D
给定一个数,判断其所在的范围,即可以云阶梯访问。
阶梯访问是通过将要对比的数 (原数据) 和 各个区域的上限(或者下限)进行比较,可以选择顺序比较,也可以选择二分法之类的。
阶梯访问是对 索引驱动法的在节约内存空间方面的再次改进
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/186161.html