COBOL - Обработка таблиц
Массивы в COBOL известны как таблицы. Массив - это линейная структура данных, представляющая собой набор отдельных элементов данных одного типа. Элементы данных таблицы отсортированы внутри.
Объявление таблицы
Таблица объявлена в Data Division. Occursпредложение используется для определения таблицы. Предложение Occurs указывает на повторение определения имени данных. Его можно использовать только с номерами уровней, начинающимися с 02 по 49. Не использовать условие возникновения с переопределениями. Описание одномерной и двухмерной таблицы выглядит следующим образом -
Одномерный стол
В одномерной таблице occursПредложение используется только один раз в объявлении. WSTABLE - это элемент группы, содержащий таблицу. WS-B называет элементы таблицы, которые встречаются 10 раз.
Syntax
Ниже приведен синтаксис для определения одномерной таблицы:
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES.
Example
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.
Syntax
Ниже приведен синтаксис для определения двумерной таблицы.
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).
Example
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 до количества раз, когда таблица встречается. Нижний индекс может быть любым положительным числом. Никакого объявления в разделе данных не требуется. Он автоматически создается с предложением происходит.
Example
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
Индекс
Доступ к элементам таблицы также можно получить с помощью index. Индекс - это смещение элемента от начала таблицы. Индекс объявляется с помощью предложения Occurs с использованием предложения INDEXED BY. Значение индекса можно изменить с помощью оператора SET и опции PERFORM Varying.
Syntax
Ниже приведен синтаксис для определения индекса в таблице.
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
Example
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 для поиска элементов в таблице.
Syntax
Ниже приводится синтаксис использования оператора 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
Example
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
Поиск
Поиск - это метод линейного поиска, который используется для поиска элементов внутри таблицы. Это может быть выполнено как на отсортированной, так и на несортированной таблице. Используется только для таблиц, объявленных индексной фразой. Он начинается с начального значения index. Если искомый элемент не найден, индекс автоматически увеличивается на 1 и продолжается до конца таблицы.
Example
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
Искать все
Search All - это метод двоичного поиска, который используется для поиска элементов внутри таблицы. Для параметра Искать все таблица должна быть отсортирована. Индекс не требует инициализации. При двоичном поиске таблица делится на две половины и определяет, в какой половине находится искомый элемент. Этот процесс повторяется до тех пор, пока элемент не будет найден или не будет достигнут конец.
Example
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
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
RECORD FOUND
93
MNO