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-numberSET I TO JSET I TO 5SET I J UP BY 1SET 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-AAT END DISPLAY 'N NOT FOUND IN TABLE'WHEN WS-A(I) = WS-SRCHDISPLAY '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-RECORDAT END DISPLAY 'RECORD NOT FOUND'WHEN WS-N(I) = 93DISPLAY 'RECORD FOUND 'DISPLAY WS-N(I)DISPLAY WS-NAME(I)END-SEARCH.

【COBOL-数组/表处理】输出如下:
COBOL-数组/表处理

文章图片

    推荐阅读