COBOL - 表处理

  • 简述

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

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

    一维表

    在一个一维表中,occurs子句在声明中只使用一次。WSTABLE 是包含表的组项。WS-B 命名出现 10 次的表格元素。
    Syntax
    以下是定义一维表的语法 -
    
    01 WS-TABLE.
       05 WS-A PIC A(10) OCCURS 10 TIMES.
    
    Example
    
    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 条目。
    Syntax
    以下是定义二维表的语法 -
    
    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).
    
    Example
    
    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 到表格出现的次数。下标可以是任何正数。它不需要在数据划分中进行任何声明。它是使用发生子句自动创建的。
    Example
    
    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 选项更改索引的值。
    Syntax
    以下是在表中定义索引的语法 -
    
    01 WS-TABLE.
       05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
    
    Example
    
    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 动词用于初始化、增加或减少索引值。它与 Search 和 Search All 一起使用来定位表中的元素。
    Syntax
    以下是使用 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
    
    Example
    
    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 并一直持续到表的末尾。
    Example
    
    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 选项,表必须按排序顺序排列。索引不需要初始化。在二分查找中,表被分成两半,它决定了被搜索的元素存在于哪一半。重复此过程,直到找到元素或到达终点。
    Example
    
    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