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