Lezioni del modulo (2/2)
Tabelle e Clausola OCCURS
In COBOL non esiste una parola chiave "array" o "vettore" per definire liste di dati omogenei. Per questo scopo si utilizza la clausola OCCURS, che specifica il numero di volte in cui una variabile o una struttura si ripete in memoria.
Definizione di una Tabella con OCCURS
La clausola OCCURS viene aggiunta alla dichiarazione di una variabile subordinata (ad esempio, di livello 05 o superiore) all'interno di una struttura di gruppo (livello 01):
01 WS-SALES-DATA.
05 WS-MONTHLY-SALES PIC 9(4) OCCURS 12 TIMES.
In questo esempio, WS-MONTHLY-SALES è una tabella formata da 12 elementi numerici di 4 cifre ciascuno. La memoria allocata per questo record sarà esattamente di 12 * 4 = 48 caratteri.
Accesso agli Elementi e Indici
Per accedere a un elemento specifico all'interno di una tabella, si specifica l'indice tra parentesi subito dopo il nome del campo.
[!IMPORTANT] A differenza della maggior parte dei linguaggi moderni che usano indici base-0, COBOL utilizza indici base-1. Il primo elemento si trova all'indice
1, il secondo all'indice2, e così via.
MOVE 1500 TO WS-MONTHLY-SALES(1).
MOVE 2400 TO WS-MONTHLY-SALES(2).
Scansione di una Tabella (Iterazione)
Per scorrere gli elementi di una tabella, si può utilizzare l'istruzione PERFORM VARYING o gestire manualmente un contatore in un ciclo PERFORM UNTIL:
PERFORM UNTIL WS-INDEX > 12
DISPLAY "Sales: " WS-MONTHLY-SALES(WS-INDEX)
ADD 1 TO WS-INDEX
END-PERFORM.
Prova tu
Dichiara una tabella di 5 temperature decimali (3 cifre intere e 1 decimale) sotto la struttura di gruppo WS-WEATHER-DATA usando la clausola OCCURS.
Mostra suggerimento
Scrivi: 05 WS-TEMPERATURE PIC 9(3)V9 OCCURS 5 TIMES.
Soluzione disponibile dopo 3 tentativi
Inizializza i primi tre elementi della tabella WS-MONTHLY-SALES con i valori 1200, 1500 e 1800 rispettivamente usando istruzioni MOVE. Ricorda che gli indici in COBOL partono da 1.
Mostra suggerimento
Usa MOVE 1200 TO WS-MONTHLY-SALES(1). per il primo elemento, poi ripeti per il secondo e il terzo usando gli indici (2) e (3).
Soluzione disponibile dopo 3 tentativi