新彩天欢迎您!
幻海优品

COBOL - 表处理

COBOL中的数组称为表.数组是线性数据结构,是相同类型的各个数据项的集合.表的数据项在内部排序.

表声明

表在数据部门中声明. 发生子句用于定义表. Occurs子句表示重复数据名称定义.它只能用于从02到49的级别编号.不要使用带有Redefines的occurrence子句.一维和二维表的描述如下 :

一维表

在一维表中, occurrence 子句仅在声明中使用一次. WSTABLE是包含表的组项. WS-B命名出现10次的表元素.

语法

以下是定义一个的语法-dimensional table :

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'.

JCL 执行上述COBOL程序 :

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 :

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

下标

可以使用下标来访问表格中的各个元素.下标值的范围可以是1到表发生的次数.下标可以是任何正数.它不需要在数据分区中声明任何声明.它是使用event子句自动创建的.

示例

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  : 12ABCDEF34GHIJKL56MNOPQRWS-A(1)   : 12ABCDEFWS-C(1,1) : ABCWS-C(1,2) : DEFWS-A(2)   : 34GHIJKLWS-C(2,1) : GHIWS-C(2,2) : JKLWS-A(3)   : 56MNOPQRWS-C(3,1) : MNOWS-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


当您编译并执行上述程序时,它会产生以下结果 :

ABCDEFGHIJKLMNOPQR


设置声明

设置语句用于更改索引值. Set动词用于初始化,递增或递减索引值.它与Search and Search All一起用于定位表中的元素.

语法

以下是使用的语法a Set语句 :

SET I J TO positive-numberSET I TO JSET I TO 5SET I J UP BY 1SET 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

当你编译并执行上面的程序时,它产生以下结果 :

ABCJKL

搜索

搜索是一种线性搜索方法,用于查找表格内的元素.它可以在已排序和未排序的表上执行.它仅用于由Index短语声明的表.它从索引的初始值开始.如果找不到搜索到的元素,则索引会自动递增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

全部搜索

搜索全部是一种二元搜索方法,用于查找表格内的元素.对于"全部搜索"选项,表必须按排序顺序排列.索引不需要初始化.在二进制搜索中,表被分成两半,并确定搜索到的元素的一半存在.重复此过程直到找到元素或达到结束.

示例

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 93MNO

免责声明:以上内容(如有图片或视频亦包括在内)有转载其他网站资源,如有侵权请联系删除