您的位置:首页 > 其它

表驱动概述<二>

2012-03-18 14:01 155 查看
上面讲到了访问自己构建的表的三种方法:

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;
}


阶段访问与上面保险费用有些相似,取值都是阶段性的,但是成绩点数阶段性不规律,所以无法使用函数直接转换为键值直接访问表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: