COBOL - 表处理
COBOL 中的数组称为表。 数组是一种线性数据结构,是相同类型的各个数据项的集合。 表的数据项在内部排序。
表声明
表在数据部中声明。 Occurs 子句用于定义表。 Occurs 子句表示数据名称定义的重复。 它只能与从 02 到 49 开始的级别号一起使用。请勿将发生子句与 Redefines 一起使用。 一维和二维表说明如下 −
一维表
在一维表中,occurrs 子句在声明中仅使用一次。 WSTABLE 是包含表的组项。 WS-B 命名出现 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
下标
表中的各个元素可以通过使用下标来访问。 下标值的范围可以从 1 到表出现的次数。 下标可以是任何正数。 它不需要在数据划分中进行任何声明。 它是使用 events 子句自动创建的。
示例
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
索引
表元素也可以使用索引来访问。 索引是元素从表开头的位移。 索引是使用 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 动词用于初始化、递增或递减索引值。 它与"搜索"和"搜索全部"一起使用来定位表中的元素。
语法
以下是使用 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 是一种二分查找方法,用于查找表内的元素。 对于"搜索全部"选项,表必须按排序顺序。 该索引不需要初始化。 在二分搜索中,表被分为两半,它确定搜索元素存在于哪一半。 重复此过程,直到找到该元素或到达末尾。
示例
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