COBOL - Elaborazione tabelle
Gli array in COBOL sono noti come tabelle. Un array è una struttura dati lineare ed è una raccolta di elementi di dati individuali dello stesso tipo. Gli elementi di dati di una tabella vengono ordinati internamente.
Dichiarazione della tabella
La tabella è dichiarata in Divisione dati. Occursla clausola viene utilizzata per definire una tabella. La clausola Occurs indica la ripetizione della definizione del nome dati. Può essere utilizzato solo con i numeri di livello che vanno da 02 a 49. Non utilizzare la clausola si verifica con Redefines. La descrizione della tabella unidimensionale e bidimensionale è la seguente:
Tabella unidimensionale
In una tabella unidimensionale, occursla clausola viene utilizzata solo una volta nella dichiarazione. WSTABLE è l'elemento del gruppo che contiene la tabella. WS-B nomina gli elementi della tabella che ricorrono 10 volte.
Syntax
Di seguito è riportata la sintassi per la definizione di una tabella unidimensionale:
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 per eseguire il programma COBOL di cui sopra -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
Tabella bidimensionale
Viene creata una tabella bidimensionale con entrambi gli elementi di dati a lunghezza variabile. Per riferimento, passare attraverso la sintassi e quindi provare ad analizzare la tabella. Il primo array (WS-A) può verificarsi da 1 a 10 volte e l'array interno (WS-C) può verificarsi da 1 a 5 volte. Per ogni voce di WS-A, ci saranno 5 voci corrispondenti di WS-C.
Syntax
Di seguito è riportata la sintassi per definire una tabella bidimensionale:
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 per eseguire il programma COBOL di cui sopra -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
Pedice
È possibile accedere ai singoli elementi della tabella utilizzando il pedice. I valori di pedice possono variare da 1 al numero di volte in cui si verifica la tabella. Un pedice può essere qualsiasi numero positivo. Non necessita di alcuna dichiarazione nella divisione dati. Viene creato automaticamente con la clausola si verifica.
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 per eseguire il programma COBOL di cui sopra -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
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
Indice
È inoltre possibile accedere agli elementi della tabella utilizzando index. Un indice è uno spostamento di un elemento dall'inizio della tabella. Un indice viene dichiarato con la clausola Occurs utilizzando la clausola INDEXED BY. Il valore dell'indice può essere modificato utilizzando l'istruzione SET e l'opzione PERFORM Varying.
Syntax
Di seguito è riportata la sintassi per la definizione dell'indice in una tabella:
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 per eseguire il programma COBOL di cui sopra -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
ABC
DEF
GHI
JKL
MNO
PQR
Set Statement
L'istruzione Set viene utilizzata per modificare il valore dell'indice. Set verbo viene utilizzato per inizializzare, aumentare o diminuire il valore dell'indice. Viene utilizzato con Cerca e Cerca tutto per individuare gli elementi nella tabella.
Syntax
Di seguito è riportata la sintassi per l'utilizzo di un'istruzione 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 per eseguire il programma COBOL di cui sopra.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
ABC
JKL
Ricerca
La ricerca è un metodo di ricerca lineare, utilizzato per trovare elementi all'interno della tabella. Può essere eseguito su tabelle ordinate e non ordinate. Viene utilizzato solo per le tabelle dichiarate dalla frase Indice. Inizia con il valore iniziale di index. Se l'elemento cercato non viene trovato, l'indice viene automaticamente incrementato di 1 e continua fino alla fine della tabella.
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 per eseguire il programma COBOL di cui sopra.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
LETTER M FOUND IN TABLE
Cerca in tutto
Cerca tutto è un metodo di ricerca binario, utilizzato per trovare elementi all'interno della tabella. La tabella deve essere ordinata per l'opzione Cerca tutto. L'indice non richiede inizializzazione. Nella ricerca binaria, la tabella è divisa in due metà e determina in quale metà è presente l'elemento cercato. Questo processo si ripete finché l'elemento non viene trovato o viene raggiunta la fine.
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 per eseguire il programma COBOL di cui sopra -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Quando compili ed esegui il programma sopra, produce il seguente risultato:
RECORD FOUND
93
MNO