c语言从0000循环到9999,C语言精华知识之表驱动法编程实践.docx

简而言之就是用查表的方 ,但可视为数据库的一种体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] =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值