Учебники

КОБОЛ — Обработка таблицы

Массивы в COBOL называются таблицами. Массив представляет собой линейную структуру данных и представляет собой набор отдельных элементов данных одного типа. Элементы данных таблицы внутренне отсортированы.

Стол Декларации

Таблица объявлена ​​в Отделе данных. Предложение Occurs используется для определения таблицы. Предложение Occurs указывает на повторение определения имени данных. Он может использоваться только с номерами уровней, начинающимися с 02 до 49. Не используйте пункт происходит с переопределением. Описание одномерной и двумерной таблицы выглядит следующим образом —

Одномерный стол

В одномерной таблице, встречается предложение, используется только один раз в объявлении. WSTABLE — элемент группы, содержащий таблицу. WS-B называет элементы таблицы, которые встречаются 10 раз.

Синтаксис

Ниже приведен синтаксис для определения одномерной таблицы:

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

пример

Live Demo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

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

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

JCL для выполнения вышеуказанной программы COBOL —

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Двумерный Стол

Двумерная таблица создается с обоими элементами данных переменной длины. Для справки пройдите синтаксис и попробуйте проанализировать таблицу. Первый массив (WS-A) может встречаться от 1 до 10 раз, а внутренний массив (WS-C) — от 1 до 5 раз. Для каждой записи WS-A будут соответствующие 5 записей WS-C.

Синтаксис

Ниже приведен синтаксис для определения двумерной таблицы:

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

пример

Live Demo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

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

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

STOP RUN.

JCL для выполнения вышеуказанной программы COBOL —

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

индекс

Доступ к отдельным элементам таблицы можно получить с помощью индекса. Значения нижнего индекса могут варьироваться от 1 до количества раз, когда таблица встречается. Индекс может быть любым положительным числом. Это не требует каких-либо объявлений в разделении данных. Он автоматически создается с предложением происходит.

пример

Live Demo

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 '12ABCDEF34GHIJKL56MNOPQR' 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.

JCL для выполнения вышеуказанной программы COBOL —

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

Индекс

Доступ к элементам таблицы также можно получить с помощью индекса. Индекс — это смещение элемента от начала таблицы. Индекс объявляется с предложением Occurs с использованием предложения INDEXED BY. Значение индекса может быть изменено с помощью оператора SET и параметра PERFORM Varying.

Синтаксис

Ниже приводится синтаксис определения индекса в таблице.

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

пример

Live Demo

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

JCL для выполнения вышеуказанной программы COBOL —

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

ABC
DEF
GHI
JKL
MNO
PQR

Задать заявление

Оператор Set используется для изменения значения индекса. Заданный глагол используется для инициализации, увеличения или уменьшения значения индекса. Он используется с Search и Search All, чтобы найти элементы в таблице.

Синтаксис

Ниже приведен синтаксис для использования оператора Set —

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

пример

Live Demo

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.

JCL для выполнения вышеуказанной программы на языке COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

ABC
JKL

Поиск

Поиск — это метод линейного поиска, который используется для поиска элементов внутри таблицы. Это может быть выполнено как на отсортированном, так и на несортированном столе. Используется только для таблиц, объявленных индексной фразой. Начинается с начального значения индекса. Если искомый элемент не найден, индекс автоматически увеличивается на 1 и продолжается до конца таблицы.

пример

Live Demo

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

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

STOP RUN.

JCL для выполнения вышеуказанной программы на языке COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —

LETTER M FOUND IN TABLE

Искать все

Поиск по всем — это двоичный метод поиска, который используется для поиска элементов внутри таблицы. Таблица должна быть в отсортированном порядке для опции Поиск всех. Индекс не требует инициализации. При бинарном поиске таблица делится на две половины и определяет, в какой половине присутствует искомый элемент. Этот процесс повторяется до тех пор, пока элемент не будет найден или пока не будет достигнут конец.

пример

Live Demo

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

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

END-SEARCH. 

JCL для выполнения вышеуказанной программы COBOL —

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —