本文概述
数组在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.
输出如下:
二维表
使用两个数据元素的可变长度生成二维表。
语法如下:
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.
输出如下:
下标
通过使用下标, 我们可以检索表的各个元素。下标的值将在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.
输出如下:
编号
我们还可以使用索引来访问表元素。索引是从表的开头移动的元素。我们需要用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).
输出如下:
设定陈述
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.
输出如下:
搜索
这是一种线性搜索方法。这用于查找表元素。我们可以对已排序或未排序的表执行搜索。搜索仅用于由索引短语声明的表。这从索引的初始值开始。如果搜索到的项目不可用, 索引将自动加一, 并将一直持续到表末尾。
例子:
让我们看一下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.
输出如下:
全部搜寻
全部搜索是一种二进制搜索方法。这用于查找表内的元素。该表必须在”全部搜索”中按排序顺序。索引不需要初始化。
众所周知, 在二进制搜索方法中, 表分为两半, 并确定搜索到的元素在哪一半中。重复此过程, 直到找到元素或到达终点为止。
例子:
让我们看一下”搜索全部”的示例:
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.
输出如下:
评论前必须登录!
注册