COBOL中数组操作

COBOL数组、索引、关键字及搜索语句详解
本文围绕COBOL语言展开,介绍了数组的定义,包括定长和变长数组,还阐述了索引名的使用、关键字ASCENDING和DESCENDING对表格排序的作用,以及表格初始化的方法。此外,详细讲解了SET和SEARCH语句的功能与使用示例,包括在一维和多维表格中的查找应用。

下面是数组的例子:
          01 RECORD-X.
            03 MONTH OCCURS 12 TIMES.
              05 NAME PIC X(12).
              05 DAYS OCCURS 31 TIEMS.
                07 COMMENT PIC X(20).
                07 TEMP-HI PIC S999.
                07 TEMP-LO PIC S999.
          77 CURRENT-DAY PIC 99.
          调用表示如下:
          MONTH(5) : 包含NAME 和 DAYS表格的组项目。
          NAME OF MONTH(5) :基本字母数字项目,长度为12个字符。
          NAME(5) (1:3) 上述第5个项目的前3个字符。
          TEMP-HI(1,31) 基本数字项目,长度为3个字符。前一个参数是在MONTH数组中的位置,后一个参数是在DAYS数组中的位置。相当于MONTH[1].DAYS[31].TEMP-HI。
          COMMENT OF RECORD-X(5,CURRENT-DAY)(11) 基本字母数字项目第五个月的CURRENT-DAY的COMMENT字段的最后10个字符。

    03 TEXT PIC XXX OCCURS 1 TO 12 TIMES DEPENDING ON IX.
    定义一个变长的数组。定义的长度是12,实际以IX为准,若IX为10,则TEXT的长度就是30。

索引
  索引名INDEX
    索引名可以用作PERFORM语句的变量,用于SET和SEARCH语句和用作下标。
    03 TEXT PIC XXX OCCURS 7 TIMES INDEXED BY index
      05 A PIC XXX
      05 B PIC XXX
    PERFORM VARYING index FROM 1 BY 1 UNTIL index >7
      DISPLAY A(index),B(index)
    END-PERFORM.
    注意和不用索引名的比较:
    77 index PIC 99
    03 TEXT PIC XXX OCCURS 7 TIMES
      05 A PIC XXX
      05 B PIC XXX
    PERFORM VARYING index FROM 1 BY 1 UNTIL index >7
      DISPLAY A(index),B(index)
    END-PERFORM.

  关键字KEY
    关键字有ASCENDING(升序,由低到高)和DESCENDING(降序,由高到低)。
      03 TEXT PIC XXX OCCURS 7 TIMES ASCENDING KEY IS A,B.
      05 A PIC XXX.
      05 B PIC XXX.
    TEXT中的元素按A升序排序,A相同的元素按B升序排序。
    关键字的作用是定义SEARCH语句带ALL短语时表格的排序。

  表格初始化,可以一个一个数据项单独初始化,也可以一起初始化。
      03 TEXT PIC XXX OCCURS 7 TIMES VALUES SPACE.
      05 A PIC XXX.
      05 B PIC XXX.                          一起初始化为空格。
      03 TEXT PIC XXX OCCURS 7 TIMES.
      05 A PIC XXX VALUES SPACE.
      05 B PIC XXX VALUES SPACE.            单独初始化。

SET
    保存或恢复索引值。SET A TO B.
    将索引递增或递减一个整数值。SET A UP/DOWN BY N.

SEARCH
    SEARCH A [VARYING B] AT END C {WHEN CONDITION D}...END-SEARCH
    A为带INDEXED BY 短语的表格。每一步都轮流求值CONDITION ,为真时执行D,SEARCH语句终止。    为假时,索引值递增,至最大索引时执行AT END C,SEARCH语句终止。
    若一开始索引值即为最大,则不执行WHEN语句,直接执行AT END 语句。
    VARYING 指定索引B,省略为A中制定的索引。
    下面的例子查找月份表中下一个具有31天的月份。
    01 MONTH-DATA.
      03 MONTH-INFO.
        05 PIC X(10) VALUES "JANUARY".
        05 PIC X(3) VALUES "JAN".
        05 PIC 99 VALUES 31.
        05 PIC X(10) VALUES "FEBRUARY".
        05 PIC X(3) VALUES "FEB".
        05 PIC 99 VALUES 28.
        ...(省略代码)
      03 MONTH REDEFINES MONTH-INFO OCCURS 12 TIMES INDEXED BY MONTH-INDEX.
        05 NAME   PIC X(10).
        05 ABBREV PIC X(3).
        05 DAYS   PIC 99.
    77 CURRENT-MONTH PIC 99.
    77 NEXT-31-DAY-MONTH PIC 99.

    SET MONTH-INDEX TO CURRENT-MONTH.
    SET MONTH-INDEX UP BY 1.
    SEARCH MONTH
        AT END MOVE 1 TO MONTH-INDEX
            SEARCH MONTH
                AT END MOVE 0 TO NEXT-31-DAY-MONTH
                WHEN DAYS(MONTH-INDEX) = 31
                    SET NEXT-31-DAY-MONTH TO MONTH-INDEX
            END-SEARCH
        WHEN DAYS(MONTH-INDEX) = 31
            SET NEXT-31-DAY-MONTH TO MONTH-INDEX
    END-SEARCH
    要查找多维表格,要将SEARCH放到PERFORM中。
    01 TABLE-DATA.
      03 DIM-1 OCCURS 10 TIMES INDEXED BY X1.
        05 DIM-2 OCCURS 20 TIMES INDEXED BY X2.
          07 NAME PIC X(20).
          07 STATE PIC XX.
          ...
    PERFORM VARYING X1 FROM 1 BY 1 UNTIL X1 > 20
        SET X2 TO 1
        SEARCH DIM-2
            WHEN STATE(X1,X2) = "AL" ....
            WNEH STATE(X1,X2) = "AZ" ....
        END SEARCH
    END-PERFORM.
    还有一种SEARCH是对有关键字的表格进行查找,和上面的查找差不多,主要是WHEN 条件中要用关键字作为查找条件。比如说关键字为A,则必须有WHEN A = .....

COBOL 语言中,数组(表格操作)是重要的数据处理方式。以下是关于 COBOL 数组表格操作的详细信息: ### 数组定义 - **定长数组**:可以使用 `OCCURS` 子句定义定长数组。例如: ```cobol 01 RECORD-X. 03 MONTH OCCURS 12 TIMES. 05 NAME PIC X(12). 05 DAYS OCCURS 31 TIMES. 07 COMMENT PIC X(20). 07 TEMP-HI PIC S999. 07 TEMP-LO PIC S999. ``` 在这个例子中,`MONTH` 是一个包含 12 个元素的数组,每个 `MONTH` 元素又包含 `NAME` 和 `DAYS` 数组,`DAYS` 数组包含 31 个元素,每个 `DAYS` 元素包含 `COMMENT`、`TEMP-HI` 和 `TEMP-LO` 数据项[^1]。 - **变长数组**:使用 `OCCURS...DEPENDING ON` 子句可以定义变长数组。例如: ```cobol 03 TEXT PIC XXX OCCURS 1 TO 12 TIMES DEPENDING ON IX. ``` 这里定义了一个变长数组 `TEXT`,其最大长度为 12,实际长度由变量 `IX` 决定。若 `IX` 为 10,则 `TEXT` 的长度就是 30(每个元素长度为 3)[^3]。 ### 数组调用 - **访问数组元素**:可以通过索引来访问数组中的元素。例如: - `MONTH(5)`:表示包含 `NAME` 和 `DAYS` 表格的组项目,即访问 `MONTH` 数组的第 5 个元素[^1]。 - `NAME OF MONTH(5)`:表示基本字母数字项目,是 `MONTH` 数组第 5 个元素中的 `NAME` 数据项,长度为 12 个字符[^1]。 - `NAME(5)(1:3)`:表示上述第 5 个项目的前 3 个字符[^1]。 - `TEMP-HI(1,31)`:表示基本数字项目,长度为 3 个字符。前一个参数是在 `MONTH` 数组中的位置,后一个参数是在 `DAYS` 数组中的位置,相当于 `MONTH[1].DAYS[31].TEMP-HI`[^1]。 - `COMMENT OF RECORD-X(5,CURRENT-DAY)(11)`:表示基本字母数字项目,是第五个月的 `CURRENT-DAY` 的 `COMMENT` 字段的最后 10 个字符[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值