COBOL - 表处理


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

表声明

表在数据部中声明。Occurs子句用于定义表。Occurs 子句表示数据名称定义的重复。它只能与从 02 到 49 开始的级别号一起使用。不要将发生子句与 Redefines 一起使用。一维和二维表的描述如下 -

一维表

在一维表中,occurrence子句在声明中仅使用一次。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 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

搜索

搜索是一种线性搜索方法,用于查找表内的元素。它可以在已排序和未排序的表上执行。它仅用于由索引短语声明的表。它从索引的初始值开始。如果没有找到查找到的元素,则索引自动加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 是一种二分查找方法,用于查找表内的元素。对于“搜索全部”选项,表必须按排序顺序。该索引不需要初始化。在二分搜索中,表被分为两半,它确定搜索元素存在于哪一半。重复此过程,直到找到该元素或到达末尾。

例子

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