个性化阅读
专注于IT技术分析

COBOL-数组/表处理

本文概述

数组在COBOL中称为表。数组是线性数据结构, 是相同数据类型的单个数据项的集合。

表的数据项在内部进行排序。

表声明

在数据部门中, 我们可以声明表, 并且必须使用” Occurs”子句来定义表。 Occurs子句用于指示数据名称定义的重复。它只能与02到49之间的级别编号一起使用。对于重新定义, 我们不能使用Occurs子句。

一维和二维表的说明如下:

一维表

在一维表中, ” Occurs”子句只能在声明中指定一次。

语法如下:

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

此处, WS-TABLE是包含表的组项目, 而WS-A将出现十次的表元素命名。

例子:

让我们看一个单维表的示例:

IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.

       DATA DIVISION.
           WORKING-STORAGE SECTION.
            01 WS-TABLE.
               05 WS-A PIC A(12) VALUE 'srcmini' OCCURS 5 TIMES.     

       PROCEDURE DIVISION.
              DISPLAY "ONE-D TABLE : "WS-TABLE.
       STOP RUN.

输出如下:

COBOL数组/表处理

二维表

使用两个数据元素的可变长度生成二维表。

语法如下:

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).

在此, 第一WS-A阵列可以发生1至10次, 而内部WS-C阵列可以发生1至5次。意味着, 每个WS-A条目将有5个WS-C条目。

例子:

让我们看一个二维表的例子:

IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.

       DATA DIVISION.
           WORKING-STORAGE SECTION.
       01 WS-TABLE.
         05 WS-A OCCURS 2 TIMES.
           10 WS-B PIC A(6) VALUE ' JAVAT'.
             10 WS-C OCCURS 2 TIMES.
               15 WS-D PIC X(6) VALUE ' POINT'.

       PROCEDURE DIVISION.
           DISPLAY "TWO-D TABLE : "WS-TABLE.

       STOP RUN.

输出如下:

COBOL数组/表处理

下标

通过使用下标, 我们可以检索表的各个元素。下标的值将在1到表/数组出现的次数之间变化。任何+ ve数字都可以是下标值。在数据划分中, 不需要任何下标声明。它由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 '12ABCDEF13DEEP24NIKITA24' 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.

输出如下:

COBOL数组/表处理

编号

我们还可以使用索引来访问表元素。索引是从表的开头移动的元素。我们需要用Occurs子句描述INDEXED BY子句以声明索引。

使用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).

输出如下:

COBOL数组/表处理

设定陈述

set语句更改索引值。它用于初始化, 增加或减少索引值。该语句可与search和search all一起使用, 以在表中定位元素。

语法如下:

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

例子:

让我们看一下set语句的示例:

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.

输出如下:

COBOL数组/表处理

搜索

这是一种线性搜索方法。这用于查找表元素。我们可以对已排序或​​未排序的表执行搜索。搜索仅用于由索引短语声明的表。这从索引的初始值开始。如果搜索到的项目不可用, 索引将自动加一, 并将一直持续到表末尾。

例子:

让我们看一下Search的示例:

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 'N'.

       PROCEDURE DIVISION.
           MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
             SET I TO 1.
           SEARCH WS-A
              AT END DISPLAY 'N NOT FOUND IN TABLE'
              WHEN WS-A(I) = WS-SRCH
              DISPLAY 'LETTER N FOUND IN TABLE'
           END-SEARCH.  

       STOP RUN.

输出如下:

COBOL数组/表处理

全部搜寻

全部搜索是一种二进制搜索方法。这用于查找表内的元素。该表必须在”全部搜索”中按排序顺序。索引不需要初始化。

众所周知, 在二进制搜索方法中, 表分为两半, 并确定搜索到的元素在哪一半中。重复此过程, 直到找到元素或到达终点为止。

例子:

让我们看一下”搜索全部”的示例:

IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.

       DATA DIVISION.
           WORKING-STORAGE SECTION.
           01 WS-TABLE.
       05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-N INDEXED BY I.
             10 WS-N 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-N(I) = 93
        DISPLAY 'RECORD FOUND '
        DISPLAY WS-N(I)
        DISPLAY WS-NAME(I)

       END-SEARCH.

输出如下:

COBOL数组/表处理

赞(0)
未经允许不得转载:srcmini » COBOL-数组/表处理

评论 抢沙发

评论前必须登录!