为加深对索引表的理解,同时也对之前学习过的下标表作一个回顾,现将二者进行比较。索引表和下标表既有不同之处,也有相似之处,下面分别进行讲解。
1.索引表和下标表的不同之处
索引表和下标表主要有4点区别,以下分别讲解。
(1)定义方式不同。依据前面学过的知识,对于下标表,除定义表的基本结构外,还要定义一个下标下标。定义下标表的代码通常如下。
01 sample-subscripted-table.
05 item-list OCCURES x1 TIMES.
10 item-num PIC 9(x2).
10 item-data PIC X(x3).
05 sub PIC 9(x4) USAGE IS COMP. /*此处定义下标*/
对于索引表而言,则需要指明相应的索引。这里需要再次强调一下,索引表中的索引只用指明,不需要定义。索引的存储位置和存储空间大小是由COBOL系统本身管理的,程序员不必去理会。定义索引表的代码通常如下。
01 sample-indexed-table.
05 item-list OCCURS x1 TIMES
INDEXED BY data-ndx. /*此处是指明索引变量,不是定义*/
10 item-num PIC 9(x2).
10 item-data PIC X(x3).
(2)下标变量和索引变量类型不同。下标表是通过下标变量管理的,索引表是通过索引变量管理的。此二种变量类型的不同也是下标表和索引表的一个重要区别。
下标变量本身是一个整型数据变量。因此,同其他的整型数据变量一样,可对其使用MOVE语句操作和运算符语句操作。
例如,以下代码都是正确的。
MOVE subscript TO data-field.
MOVE data-field TO subscript.
ADD 3 TO subscript.
COMPUTE subscript = (5+7) / 3.
……
因此,可以看出下标变量除用于引用下标表中数据时,还可用于其他操作。也就是说,可以将下标变量当作一个通常的整型数据变量进行任何相应的操作。
然而,前面已经讲到,索引变量是不能直接对其使用MOVE语句和运算符语句的。索引变量是一个特殊的数据类型,由COBOL系统本身管理,只能用于引用索引表中的数据。除此之外,索引变量不能用于其他任何操作。
(3)适用语句不同。对下标表进行操作,实际上通常是对其中的下标变量进行操作。因此,下标表的适用语句也可看作是下标变量的适用语句。适用语句通常有以下几条。
q MOVE语句
q PERFORM VARYING语句
q ADD语句
q SUBTRACT语句
q MULTIPLY语句
q DIVIDE语句
q COMPUTER语句
同样,适用于索引表的语句也可认为是适用于索引变量的语句。适用于索引表的语句有一些和适用于下标表的是一样的,但更多的则并不相同。通常,适用于索引表的语句有下面这几条。
q PERFORM VARYING语句
q SET语句
q SEARCH语句
q SEARCH ALL语句
(4)查找效率不同。索引表的查找效率通常要高于下标表的查找效率。这通常可以从两个方面体现出来。下面分别对此进行介绍。
一方面,索引表用来查找的索引变量访问效率要高于下标表中对应的下标。虽然下标变量可以通过在定义后面使用USAGE IS COMP来提高访问效率,如下。
05 sub PIC 9(x1) USAGE IS COMP.
或者简写为。
05 sub PIC 9(x1) COMP.
但即使是通过这种方式提高了访问效率,其效率仍然还是没有索引的高。由于索引变量是直接有COBOL系统本身来管理的,因此具有最高的访问效率。
另一方面,在索引表中可以方便地进行二分查找。前面已经讲到,二分查找方式是从算法角度来讲最高效的查找方式。因此,索引表的查找效率通常要高于下标表的查找效率。
2.索引表和下标表的相似之处
索引表和下标表最大的相似之处在于对数据的引用格式。二者都是通过在数据条目名称加上相应的索引名或下标名,完成对具体数据项的引用。对于下标表,引用数据的方式如下。
item-data ( sub ).
对于索引表,引用数据的方式如下。
item-data (index).