COBOL中数组操作

2019-04-15 13:56发布

下面是数组的例子:
          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 = .....