表驱动概述<二>

来源:互联网 发布:潘多拉 网络共享 编辑:程序博客网 时间:2024/05/12 14:21

上面讲到了访问自己构建的表的三种方法:

1.直接访问

2.索引访问

3.阶梯访问

这三种方法涵盖了实际使用表驱动的大部分方法,继续以举例的方式说明:

1.直接访问

上一篇文章中举的例子可以直接的访问表,而在实际情况中,往往需要构造查询健值。

保险行业的投保费用一般按照年龄段来区分,假如以5年一个标准,0~5岁按照一个基准费用的1.5倍收取,5~10岁。。。。人的年龄取值范围一般在0~150岁,如果构建一个150条记录的静态表显的有些愚蠢,事实上每个年龄主需要存在一个表项即可。

typedef struct tagTInsuran{    int age;    double rate;}TInsuran;double pay;TInsuran atInsuran[] = {    0,1.5*pay;    1,1.4*pay;    ...    30,2*pay;}int CalAge(int age){    return age/5;}

使用函数 CalAge()的结果直接访问表即可。

2.索引访问

索引访问是通过索引访问键值,再通过键值直接访问构造表。索引访问适合于表有大量的空洞,并且表的键值毫无规律的情况下使用。

3.阶段访问

当我们无法简单使用构造键值的方法,直接访问表时,可以使用阶段访问。

仍旧是举例说明,大学一般按照绩点评定学生成绩,一般的绩点转换表为:

>=95  4

>=90    3.5

>=80    3

>=70   2.5

>=60   2

<60 0

这样的情况很适合使用阶段访问表

int score[] =  {60,70,80,90,95,100};double point[] = {0,2,2.5,3,3.5,4};int CalPoint(int inScore){    double retPoint = 4;    double loopPoint = 0;    int i = 0;    while(loopPoint<4)    {        if(inScore<score[i])         {            retPoint = point[i];              break;         }        loopPoint = point[++i];    }    return retPoint;}

阶段访问与上面保险费用有些相似,取值都是阶段性的,但是成绩点数阶段性不规律,所以无法使用函数直接转换为键值直接访问表。


原创粉丝点击