COBOL 表处理
COBOL中的数组称为表。数组是一种线性数据结构,是同一类型的单个数据项的集合。表的数据项在内部进行排序。
表声明
表在数据部(Data division)中进行声明。occurs子句用于定义一个表,表示数据名称定义的重复。它只能用于02到49的级数。不要使用带有redefines的occurs子句。一维和二维表的描述如下:
一维表
在一维表中,occurs子句仅在声明中使用一次。WS-TABLE是包含表的组项。WS-A命名出现10次的表元素。
语法
以下是定义一维表的语法:
01 WS-TABLE. 05 WS-A PIC A(10) OCCURS 10 TIMES.
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES. PROCEDURE DIVISION. DISPLAY "ONE-D TABLE : "WS-TABLE. STOP RUN.
JCL执行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
二维表
二维表使用两个可变长度的数据元素创建。作为参考,通过语法,然后尝试分析表。第一数组(WS-A)可以出现1至10次,而内部数组(WS-C)可以出现1至5次。对于WS-A的每个条目,将有对应的5个WS-C条目。
语法
以下是定义二维表的语法:
01 WS-TABLE. 05 WS-A OCCURS 10 TIMES. 10 WS-B PIC A(10). 10 WS-C OCCURS 5 TIMES. 15 WS-D PIC X(6).
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A OCCURS 2 TIMES. 10 WS-B PIC A(10) VALUE ' TUTORIALS'. 10 WS-C OCCURS 2 TIMES. 15 WS-D PIC X(6) VALUE ' POINT'. PROCEDURE DIVISION. DISPLAY "TWO-D TABLE : "WS-TABLE. STOP RUN.
JCL执行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
Subscript(下标)
表的单个元素可以使用下标元素来访问。下标值的范围可以从1到表的出现次数。下标可以是任意正数。它在数据部中不需要任何声明。它是与occurs子句一起自动创建的。
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A OCCURS 3 TIMES. 10 WS-B PIC A(2). 10 WS-C OCCURS 2 TIMES. 15 WS-D PIC X(3). PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. DISPLAY 'WS-TABLE : ' WS-TABLE. DISPLAY 'WS-A(1) : ' WS-A(1). DISPLAY 'WS-C(1,1) : ' WS-C(1,1). DISPLAY 'WS-C(1,2) : ' WS-C(1,2). DISPLAY 'WS-A(2) : ' WS-A(2). DISPLAY 'WS-C(2,1) : ' WS-C(2,1). DISPLAY 'WS-C(2,2) : ' WS-C(2,2). DISPLAY 'WS-A(3) : ' WS-A(3). DISPLAY 'WS-C(3,1) : ' WS-C(3,1). DISPLAY 'WS-C(3,2) : ' WS-C(3,2). STOP RUN.
JCL执行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
WS-TABLE : 12ABCDEF34GHIJKL56MNOPQR WS-A(1) : 12ABCDEF WS-C(1,1) : ABC WS-C(1,2) : DEF WS-A(2) : 34GHIJKL WS-C(2,1) : GHI WS-C(2,2) : JKL WS-A(3) : 56MNOPQR WS-C(3,1) : MNO WS-C(3,2) : PQR
Index(索引)
表元素也可以使用索引访问。索引是从表的开始的元素的位移。索引通过使用INDEXED BY子句的occurs子句进行声明。可以使用SET语句和PERFORM Varying选项来更改索引的值。
语法
以下是在表中定义索引的语法:
01 WS-TABLE. 05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A OCCURS 3 TIMES INDEXED BY I. 10 WS-B PIC A(2). 10 WS-C OCCURS 2 TIMES INDEXED BY J. 15 WS-D PIC X(3). PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3 STOP RUN. A-PARA. PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2. C-PARA. DISPLAY WS-C(I,J).
JCL执行上述COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
ABC DEF GHI JKL MNO PQR
SET语句
Set语句是用于更改索引值。Set词用于初始化,递增或递减索引值。它与search和search all一起使用可以定位表中的元素。
语法
以下是使用Set语句的语法:
SET I J TO positive-number SET I TO J SET I TO 5 SET I J UP BY 1 SET J DOWN BY 5
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A OCCURS 3 TIMES INDEXED BY I. 10 WS-B PIC A(2). 10 WS-C OCCURS 2 TIMES INDEXED BY J. 15 WS-D PIC X(3). PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. SET I J TO 1. DISPLAY WS-C(I,J). SET I J UP BY 1. DISPLAY WS-C(I,J). STOP RUN.
JCL执行上述COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
ABC JKL
Search
Search是一种线性搜索方法,用于查找表内的元素。它可以在排序以及未排序的表上执行。它仅用于通过索引短语声明的表,以索引的初始值开始。如果没有找到要搜索的元素,则索引将自动递增1,并继续到表的末尾。
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I. 01 WS-SRCH PIC A(1) VALUE 'M'. PROCEDURE DIVISION. MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE. SET I TO 1. SEARCH WS-A AT END DISPLAY 'M NOT FOUND IN TABLE' WHEN WS-A(I)=WS-SRCH DISPLAY 'LETTER M FOUND IN TABLE' END-SEARCH. STOP RUN.
JCL执行上述COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
LETTER M FOUND IN TABLE
Search All
Search All是一种二分法搜索方法,用于查找表内的元素。对于Search All选项,表必须是排序的,索引不需要初始化。在二分法搜索中,表被分为两半,并确定所搜索的元素在哪一半。此过程一种重复,直到元素被找到或到达结尾。
例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TABLE. 05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I. 10 WS-NUM PIC 9(2). 10 WS-NAME PIC A(3). PROCEDURE DIVISION. MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE. SEARCH ALL WS-RECORD AT END DISPLAY 'RECORD NOT FOUND' WHEN WS-NUM(I)=93 DISPLAY 'RECORD FOUND ' DISPLAY WS-NUM(I) DISPLAY WS-NAME(I) END-SEARCH.
JCL执行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO
当你编译和执行上面的程序,会产生以下结果:
RECORD FOUND 93 MNO