GetKeyFromAge()就是一个很好的名称。.PDF
文本预览下载声明
第十二章 复杂数据类型 189
把标志转换独立在函数中。当你使用变换数据的方法来建立直接存取标志时,应把对数据
的转换操作放在函数中,函数的使用消除了在不同地方使用不同转换方法的可能性,当需要对
变换作改动时也非常容易。同时,要恰当地命名转换函数以清楚地说明使用函数的目的,比如
GetKeyFromAge()就是一个很好的名称。
还要把转换函数放入含有表定义和其它与表有关子程序的模块中。当转换函数与数据表距
离比较近时,如果要改动数据表的活,也比较容易想起改动转换函数。
12.2.3 变址存取
有时依靠简单的数字变换还不足把数据转换为直接存取标志。这时可以用变址存取方法解
决某些问题。
当使用变址时,首先用基本数据在变址表中找到一个标志,然后利用这个标志查找你感兴
趣的主要数据。
假设你在考虑一个存货问题, 并且其中有一张含有100 项的清单,每一项都含有一个在
0000 到 9999 之间的四位数。在这种情况下,如果你想用四位数作为标志来直接进入一个描述
了某一项某些方面的表,就要先建立一个有10,000 个入口的变址数组。这一个数组中除了那些
与上述100 个4 位数相应的入口外,其余入口都是空的。如图12-4 所表示的那样,这些入口指
向一个描述了清单中的项,但入口数要远远小于10,000 的表。
图12-4 变址存取
变址存取方法主要有三个优点。首先,如果主查寻表中每一个入口占用的空间都很大的话,
那么建立一个有许多空入口的变址表所浪费的空间要比建立有许多空入口的主查寻表浪费的空
间少得多。比如上例中如果主查寻表每个入口占用10 个字书,而变址表每个入口占用5 个字节
的话,就可以节约 (10-5)*9900=49500 个字节。
第二个优点是即使使用变址表没有节约空间, 对变址表中的入口进行操作也要比对主查
第十二章 复杂数据类型 190
寻表口进行操作容易得多。比如,假设有一个含有雇员姓名、雇佣日期和工资等信息的表,你
可以建立一个通过姓名来查寻主表的变址表,还可以建立一个工资查寻主表的变址表,而且你
也可以建立通过雇佣日期查寻主表的第三个变址表。
使用变址存取的第三个优点是表驱动方法所共有的良好维护性。存在表中的数据维护起来
要比淹没在代码中的数据容易得多。为了增强灵活性,可以把变址存取代码放在子程序中,当
你需要由数据得到一个直接存取标志时再调用这个子程序,当需要改动表时,对子程序中的变
址存取代码进行修改要比对散布在程序中的同样代码进行修改容易得多。
12.2.4 阶梯存取
另一种表存取方法是阶梯法。这种存取方法不如变址法直接,但要比变址法节约空间。
阶梯法的主要思想是如图12-5 所示的阶梯结构,其核心是表中的入口对数据范围而不是
对不同数据点有效的。例如你正在编写一个评分程序,B 入口的取值范围可以是从77.5%到9
0%。下面是一些你可能遇到的评分范围:
≥90% A
90.0% B
77.5% C
65.0% D
50.0% F
这是一个很难用表来查寻的问题,因为你无法用一个简单的转换函数来得到从A 到F 的直
接存取标志。这对变址存取法来说也是比较困难的,因为上面的数都是浮点型的。或许你会考
虑把浮点型转化为整型,就这个问题而言,这样作是可行的。不过为了说明阶梯法,我们把解
决方案限制为只能用浮点型数。
图12-5 阶梯活确定入口
使用阶梯法时,首先把每个范围的上界放入表中,然后用一个循环来查找超过每一个范围
上界的分数。当你找到某一分数第一次超过某一范围上界的地方时,也就知道了该分数应属于
哪一级。使用这一技术时,必须仔细而且恰当地处理每一个范围的边界。下面是一段给一组学
生的分数分级的Basic 程序;
set up data for grading table
第十二章 复杂数据类型
显示全部