C10-COBOL 表处理

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.
           ANDRE-PROC.
           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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值