COBOL - przetwarzanie tabel
Tablice w języku COBOL są nazywane tabelami. Tablica jest liniową strukturą danych i jest zbiorem pojedynczych elementów danych tego samego typu. Pozycje danych w tabeli są sortowane wewnętrznie.
Deklaracja tabeli
Tabela jest zadeklarowana w Data Division. Occursklauzula służy do definiowania tabeli. Klauzula Occurs wskazuje na powtórzenie definicji nazwy danych. Może być używany tylko z numerami poziomów zaczynającymi się od 02 do 49. Nie używaj klauzuli występuje z Redefines. Opis tabeli jednowymiarowej i dwuwymiarowej jest następujący -
Tabela jednowymiarowa
W jednowymiarowej tabeli occursklauzula jest używana tylko raz w deklaracji. WSTABLE to element grupy zawierający tabelę. WS-B nazywa elementy tabeli, które występują 10 razy.
Syntax
Poniżej znajduje się składnia definiowania jednowymiarowej tabeli -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
Tabela dwuwymiarowa
Tworzona jest dwuwymiarowa tabela, w której oba elementy danych mają zmienną długość. W celach informacyjnych przejrzyj składnię, a następnie spróbuj przeanalizować tabelę. Pierwsza tablica (WS-A) może wystąpić od 1 do 10 razy, a wewnętrzna tablica (WS-C) może wystąpić od 1 do 5 razy. Każdy wpis WS-A będzie odpowiadał 5 wpisom WS-C.
Syntax
Poniżej znajduje się składnia definiowania dwuwymiarowej tabeli -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
Indeks
Dostęp do poszczególnych elementów tabeli można uzyskać za pomocą indeksu dolnego. Wartości indeksu dolnego mogą wynosić od 1 do liczby wystąpień tabeli. Indeks dolny może być dowolną liczbą dodatnią. Nie wymaga żadnej deklaracji w zakresie podziału danych. Jest tworzony automatycznie z klauzulą wystąpienia.
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
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
Indeks
Dostęp do elementów tabeli można również uzyskać za pomocą indeksu. Indeks to przemieszczenie elementu od początku tabeli. Indeks jest deklarowany za pomocą klauzuli Occurs za pomocą klauzuli INDEXED BY. Wartość indeksu można zmienić za pomocą instrukcji SET i opcji PERFORM Varying.
Syntax
Poniżej znajduje się składnia definiowania indeksu w tabeli -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
ABC
DEF
GHI
JKL
MNO
PQR
Instrukcja Set
Instrukcja set służy do zmiany wartości indeksu. Czasownik set jest używany do inicjowania, zwiększania lub zmniejszania wartości indeksu. Jest używany z funkcją Wyszukaj i Wyszukaj wszystko, aby zlokalizować elementy w tabeli.
Syntax
Poniżej znajduje się składnia użycia instrukcji 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 aby wykonać powyższy program w języku COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
ABC
JKL
Szukaj
Wyszukiwanie to liniowa metoda wyszukiwania, która służy do znajdowania elementów wewnątrz tabeli. Można to wykonać zarówno na tabeli posortowanej, jak i niesortowanej. Jest używany tylko dla tabel zadeklarowanych frazą indeksu. Zaczyna się od początkowej wartości indeksu. Jeśli szukany element nie zostanie znaleziony, indeks jest automatycznie zwiększany o 1 i trwa do końca tabeli.
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 aby wykonać powyższy program w języku COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
LETTER M FOUND IN TABLE
Wyszukaj wszystko
Search All to binarna metoda wyszukiwania, która służy do znajdowania elementów wewnątrz tabeli. Tabela musi być posortowana dla opcji Wyszukaj wszystko. Indeks nie wymaga inicjalizacji. W wyszukiwaniu binarnym tabela jest dzielona na dwie połowy i określa, w której połowie znajduje się poszukiwany element. Ten proces powtarza się do momentu znalezienia elementu lub osiągnięcia końca.
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
RECORD FOUND
93
MNO