C语言精华知识之表驱动法编程实践.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简而言之就是用查表的方 ,但可视为数据库的一种体1概念提出 简而言之就是用查表的方 ,但可视为数据库的一种体 未知的汉字就是典型的表驱动 一个索引值,并映射到对应的 ,部首检字法效率极高。所谓表驱 动法(Table-Driven Approach) 法获取数据。此处的“表”通常为数组 现。 未知的汉字就是典型的表驱动 一个索引值,并映射到对应的 ,部首检字法效率极高。 具体到编程方面,在数据不多时可用逻辑判断语句(if 具体到编程方面,在数据不多时可用逻辑判断语句(if…else或 )来获 取值;但随着数据的增多,逻辑语句会越来越长, 的优势就开始显现。 36进制(A表示10, B表示11,…)表示更大的数字,逻 下: switch …case 此时表驱动法 例如,用 辑判断语句如 if(ucNum 10) { ucNumChar = Con vertToChar(ucNum); } else if(ucNum == 10) { ucNumChar = A; } else if(ucNum == 11) { ucNumChar = B; } else if(ucNum == 12) { ucNumChar = C; } else if(ucNum == 35) { ucNumChar = Z; 当然也可 以用switch -case 结构,但实现都 很冗 长。而用 表驱动 法(将numChar存入数组)则非常直观和简洁。如: CHAR aNumCharsQ = {0, 1, 2, /*3~9*/A, B, C, /*D~Y*/Z}; CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)]; 像这样直接将变量当作下数组下标来读取数值的方法就是直接查 表法。 注意,如果熟悉字符串操作,则上述写法可以更简洁: CHAR ucNumChar = 0123456789ABCDEFGHIJKLM NOP QRSTUVWXYZ[ucNum]; 使用表驱动法时需要关注两个冋题:一■是如何查表,从表中读取 正确的数据;二是表里存放什么,如数值或函数指针。 1.1查表方式 常用的查表方式有直接查找、索引查找和分段查找等。 1.1.1 直接查找 即直接通过数组下标获取到数据。如果熟悉哈希表的话,可以很 容易看出这种查表方式就是哈希表的直接访问法。 如获取星期名称,逻辑判断语句如下: if(0 == ucDay) { p szDayName = Sun day; } else if(1 == ucDay) { p szDayName = Mon day; } else if(6 == ucDay) { p szDayName = Saturday; 而实现同样的功能,可将这些数据存储到一个表里: CHAR *p aNumCharsQ = {S un day, Mo nday, Tuesday, Wed nesday, Thursday, Friday, Saturday}; CHAR *p szDayName = paNumChars[ucDay]; 类似哈希表特性,表驱动法适用于无需有序遍历数据,且数据量 大小可提前预测的情况。 对于过于复杂和庞大的判断,可将数据存为文件,需要时加载文 件初始化数组,从而在不修改程序的情况下调整里面的数值。 有时,访问之前需要先进行一次键值转换。如表驱动法表示端口 忙闲时,需将槽位端口号映射为全局编号。所生成的端口数目大小的 数组,其下标对应全局端口编号,元素值表示相应端口的忙闲状态。 索引查找 有时通过一次键值转换,依然无法把数据(如英文单词等)转为键 值。此时可将转换的对应关系写到一个索引表里,即索引访问。 如现有100件商品,4位编号,范围从0000到9999。此时只需要 申请一个长度为100的数组,且对应2位键值。但将4位的编号转换 为2位的键值,可能过于复杂或没有规律,最合适的方法是建立一个 保存该转换关系的索引表。采用索引访问既节省内存,又方便维护。 比如索引A表示通过名称访问,索引B表示通过编号访问。 分段查找 通过确定数据所处的范围确定分类(下标)。有的数据可分成若干 区间,即具有阶梯性,如分数等级。此时可将每个区间的上限(或下 限)存到一个表中,将对应的值存到另一表中,通过第一个表确定所处 的区段,再由区段下标在第二个表里读取相应数值。注意要留意端 点,可用二分法查找,另外可考虑通过索引方法来代替。 如根据分数查绩效等级: #defi ne MAX_GRADE_LEVEL (INT8U)5 DOUBLE aRa ngeLimit[MAX_GRADE_LEVEL] = {50.0, 60.0, 70.0, 80.0, 100.0}; CHAR

文档评论(0)

大宝&小宝 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档