下面以一个银行账户管理系统为例子,具体分析在通常情况下是如何进行顺序查找的。对于银行账户管理系统而言,最主要的数据是以下两条。
q 账号
q 账号所对应的用户名
下面仍然针对顺序查找提取一个简化的模型。该模型只包含以上两类数据,并且假设用户数为10人。对此,可定义银行账户管理表如下。
01 BANK-ACCOUNT-TABLE.
05 ACCOUNT OCCURS 10 TIMES.
10 ACCOUNT-NUM PIC 9(9). /*定义账号。并假设其由9个数字组成*/
10 ACCOUNT-NAME PIC X(10). /*定义用户名。并假设其由不超过10个的字符组成*/
将该表通过任意一种方式初始化后,假设表中数据如表所示。
表 银行账户表
ACCOUNT-NUM | ACCOUNT-NAME |
021845984 | TOM |
547874956 | HARRY |
201874698 | PITTER |
004847624 | SMITH |
478206045 | JONES |
032874512 | ROBIN |
064840574 | SIMON |
120873954 | FRANK |
657842216 | SANDY |
689-574-402 | SUE |
以上表格中的数据都是任意指定的。另外,这里需要再强调一下,数据编号和下标并不是一个概念。对于本例而言,数据编号就是账号ACCOUNT-NUM。该数据编号用以代表相应数据,即用户名ACCOUNT-NAME。数据通常是有具体意义的,如ACCOUNT-NAME数据表示人名。而编号则是没有具体意义的,只是为了更方便地表示数据。
通过上表可以看出,此处数据编号和数据存放的位置并不是一致的。为更好地说明这一点,银行账户表中的数据编号,数据以及数据存放位置的对应关系如表所示。
表 数据编号,数据和数据存放位置的对应关系
数据编号 | 数据 | 数据存放位置 |
021845984 | TOM | 1 |
547874956 | HARRY | 2 |
201874698 | PITTER | 3 |
004847624 | SMITH | 4 |
478206045 | JONES | 5 |
032874512 | ROBIN | 6 |
064840574 | SIMON | 7 |
120873954 | FRANK | 8 |
657842216 | SANDY | 9 |
689574402 | SUE | 10 |
对于该表而言,不妨假设需要查找数据编号(即账号)为“064840574”的数据(即用户名)。则使用顺序查找方式的代码如下。
……
05 ACCOUNT-SUB PIC 99 USAGE IS COMP. /*定义下标*/
05 FOUND-FLAG PIC X. /*定义找到标志*/
05 KEY-NUM PIC 9(9). /*该变量用于存放指定的数据编号*/
05 FOUND-NAME PIC X(10). /*该变量用于存放查找到的数据*/
……
MOVE ‘N’ TO FOUND-FLAG. /*将找到标志设为默认值‘N’*/
MOVE ‘064840574’ TO KEY-NUM. /*将指定的数据编号MOVE到KEY-NUM变量中*/
PERFORM 100-FIND-NAME
VARYING ACCOUNT-SUB FROM 1 BY 1
UNTIL ACCOUNT-SUB > 10
OR
FOUND-FLAG = ‘Y’.
以上实际上是通过PERFORM VARYING语句从表的第一条数据开始,一条条顺次查找的。因此,这也是该查找方式被称为顺序查找方式的原因。
对于上面的100-FIND-NAME具体每一步的查找过程,代码如下。
100-FIND-NAME.
IF ACCOUNT-NUM (ACCOUNT-SUB) = KEY-NUM
MOVE ‘Y’ TO FOUND-FLAG
MOVE ACCOUNT-NAME (ACCOUNT-SUB) TO FOUND-NAME
END-IF.
通过顺序查找方式查找后,最终找到的数据应该为“SIMON”。整个查找过程共进行了7次查找,查找过的数据如表所示。
表 查找过的数据
ACCOUNT-NUM | ACCOUNT-NAME |
021845984 | TOM |
547874956 | HARRY |
201874698 | PITTER |
004847624 | SMITH |
478206045 | JONES |
032874512 | ROBIN |
064840574 | SIMON |
上面最后一条记录中的数据“Simon”即为所要查找的数据。
此外,整个查找结束后,下标ACCOUNT-SUB也应该为7。数据的存放位置实际上是和下标对应的,而不是数据的编号。数据编号和数据都要通过下标引用。使用下标引用数据编号的方式如下。
ACCOUNT-NUM (ACCOUNT-SUB)
使用下标引用数据的方式如下。
ACCOUNT-NAME (ACCOUNT-SUB)