[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Il linguaggio COBOL offre la gestione di array attraverso la definizione di variabili multiple, all'interno di variabili strutturate (record); tuttavia, la denominazione usata nel COBOL per queste rappresentazioni dei dati è di tabella.
level-number data-name-1 [omissis] / \ | integer-2 TIMES | OCCURS < > ¯¯¯¯¯¯ | integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3] | \ ¯¯ ¯¯¯¯¯¯¯¯¯ / .-- / \ --. | | ASCENDING | | | < ¯¯¯¯¯¯¯¯¯ > KEY IS {data-name-4}... |... | | DESCENDING | | `-- \ ¯¯¯¯¯¯¯¯¯¯ / --' [ INDEXED BY {index-name-1}... ] ¯¯¯¯¯¯¯ [omissis] . |
Si dichiara che un campo è composto da più elementi dello stesso tipo aggiungendo in coda l'opzione OCCURS n TIMES. Lo schema sintattico completo dell'opzione è il seguente:
/ \ | integer-2 TIMES | OCCURS < > ¯¯¯¯¯¯ | integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3] | \ ¯¯ ¯¯¯¯¯¯¯¯¯ / .-- / \ --. | | ASCENDING | | | < ¯¯¯¯¯¯¯¯¯ > KEY IS {data-name-4}... |... | | DESCENDING | | `-- \ ¯¯¯¯¯¯¯¯¯¯ / --' [ INDEXED BY {index-name-1}... ] ¯¯¯¯¯¯¯ |
Le tabelle più semplici sono quelle che hanno un numero fisso di elementi. Si osservi l'esempio seguente:
|
Nell'esempio viene dichiarata una variabile strutturata denominata A, che si articola nelle variabili B, C e F. La variabile C è ripetuta per 10 volte e si articola ogni volta nella variabile D e nella variabile E. La variabile E si ripete per sette volte.
La variabile E è una tabella a due dimensioni, perché è inclusa nelle ripetizioni della variabile C, mentre la variabile C è una tabella a una sola dimensione.
È evidente che per fare riferimento ai valori contenuti nelle tabelle sia necessario utilizzare un indice.
Lo standard del 1974 del linguaggio COBOL pone come limite un massimo di tre dimensioni per le tabelle. |
Per fare riferimento a un elemento di una tabella, nelle istruzioni della divisione PROCEDURE DIVISION si usa una forma descritta dallo schema sintattico seguente:
data-name (subscript-1 [subscript-2 [subscript-3...]]) |
In pratica, si scrive il nome della variabile ripetuta, seguita dall'indice o dagli indici tra parentesi tonde. Il primo indice riguarda la prima dimensione, intesa come quella più esterna; l'ultimo riguarda l'annidamento più interno.
L'indice è un numero intero positivo che va da uno fino al massimo della dimensione che lo riguarda. Seguendo l'esempio apparso nella sezione precedente, E (1 7) rappresenta la settima occorrenza della variabile E nell'ambito della prima della variabile C. Pertanto, il nome da usare per indicare l'elemento è quello della variabile più interna che si vuole individuare, mentre gli indici partono dalla posizione più esterna.
Si noti che è convenzione comune inserire delle virgole per separare gli indici, anche se si tratta di una forma di rappresentazione facoltativa. |
Viene mostrato un altro esempio di tabella a tre dimensioni:
|
Si tratta di una variabile strutturata che serve a contenere delle informazioni su un'enciclopedia. L'elemento VOLUME (5) contiene le informazioni su tutto il volume quinto; l'elemento TITOLO-VOLUME (5) contiene il titolo del volume quinto; l'elemento TITOLO-PARTE (5, 3) contiene il titolo della terza parte del volume quinto; l'elemento TESTO (5, 3, 25) contiene il testo del venticinquesimo capitolo contenuto nella terza parte del quinto volume. Naturalmente, in questo esempio si intende che la numerazione delle parti ricominci da uno all'inizio di ogni volume; così si intende che all'inizio di ogni parte la numerazione dei capitoli riprenda da uno.
L'indice di una tabella può essere indicato attraverso una costante numerica, una variabile numerica a cui sia stato attribuito preventivamente un valore appropriato o attraverso un'espressione elementare che risulta in un numero intero appropriato.
Quando si usa una variabile per la gestione di un indice, è possibile ed è consigliabile che il tipo numerico di tale variabile sia INDEX. In pratica, nella sezione WORKING-STORAGE SECTION un indice potrebbe essere dichiarato come nell'esempio seguente, dove se ne vedono due, il primo, denominato INDICE, è dichiarato come variabile scalare di livello 77, il secondo, denominato INDICE-C, è sempre costituito da una variabile scalare, che però fa parte di una variabile strutturata:
|
Si può osservare che questo tipo di variabile numerica non prevede la definizione della sua dimensione che è stabilita invece dal compilatore, in base alle caratteristiche dell'elaboratore e del sistema operativo.
In alternativa, l'indice può essere dichiarato contestualmente alla dichiarazione della variabile ricorrente; in tal caso, il compilatore può aggiungere dei controlli tali da impedire che si possa assegnare alla variabile un valore al di fuori dell'ambito della dimensione della tabella:
|
Qui viene ripreso e modificato un esempio già apparso in una sezione precedente. La differenza consiste nell'assegnare l'indice a ogni variabile ricorrente. Pertanto si hanno gli indici: IND-VOLUME, IND-PARTE e IND-CAPITOLO.
Come accennato, si può fare riferimento a un elemento di una tabella indicando un indice costituito da un'espressione matematica elementare. Si parla in questo caso di indici relativi, perché si possono sommare o sottrarre dei valori a partire da una posizione di partenza. Per esempio, supponendo che la variabile I contenga il numero 15, l'elemento indicato come ELE (I - 4) corrisponderebbe alla notazione ELE (11); nello stesso modo, l'elemento indicato come ELE (I + 4) corrisponderebbe alla notazione ELE (19).
Teoricamente, è possibile dichiarare l'occorrenza di una variabile per una quantità variabile di elementi; si usa in tal caso la forma OCCURS m TO n TIMES. A seconda del compilatore, può essere obbligatorio, o facoltativo, specificare il nome di una variabile che controlla dinamicamente la quantità massima di elementi:
OCCURS integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3] ¯¯¯¯¯¯ ¯¯ ¯¯¯¯¯¯¯¯¯ |
Viene mostrato l'esempio di un programma completo, che serve ad accumulare in una tabella alcuni dati personali. Sono previsti un massimo di 60 elementi e la quantità effettiva di elementi è controllata dalla variabile UTENTI-MAX:
|
Se si devono utilizzare i dati in una tabella per eseguire una ricerca al suo interno (utilizzando l'istruzione SEARCH nella divisione PROCEDURE DIVISION), se si può essere certi che le informazioni contenute siano ordinate secondo una certa chiave, lo si può specificare nella dichiarazione:
/ \ | integer-2 TIMES | OCCURS < > ¯¯¯¯¯¯ | integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3] | \ ¯¯ ¯¯¯¯¯¯¯¯¯ / .-- / \ --. | | ASCENDING | | | < ¯¯¯¯¯¯¯¯¯ > KEY IS {data-name-4}... |... | | DESCENDING | | `-- \ ¯¯¯¯¯¯¯¯¯¯ / --' [ INDEXED BY {index-name-1}... ] ¯¯¯¯¯¯¯ |
La metavariabile data-name-4 dello schema sintattico rappresenta una variabile contenuta nell'elemento ricorrente; attraverso la parola chiave ASCENDING si intende dichiarare che la tabella è ordinata, lessicograficamente, in modo ascendente, secondo il contenuto di quella variabile, se invece si usa la parola chiave DESCENDING, si intende un ordinamento decrescente.
È possibile specificare più chiavi di ordinamento successive, nel caso si vogliano abbinare chiavi secondarie di ordinamento.
Sia chiaro che la tabella deve già risultare ordinata secondo le chiavi specificate, altrimenti le istruzioni SEARCH della divisione PROCEDURE DIVISION danno risultati errati o falliscono semplicemente. Naturalmente, all'interno del programma è possibile prevedere un procedimento di riordino, da eseguire prima di utilizzare delle istruzioni SEARCH. |
L'esempio seguente mostra l'indicazione della chiave di ordinamento, costituita precisamente dalla variabile COGNOME, che deve risultare ascendente in fase di ricerca:
|
Il linguaggio COBOL prevede un'istruzione apposita per facilitare la scansione delle tabelle. Si tratta di SEARCH, che ha due modalità di funzionamento, a seconda che si voglia eseguire una ricerca sequenziale o una ricerca binaria. Naturalmente, la ricerca sequenziale si presta alla scansione di una tabella i cui dati non sono ordinati, mentre nel secondo caso devono esserlo.
Viene mostrato l'esempio di un programma completo che inizia con l'inserimento di dati all'interno di una tabella, quindi esegue una ricerca sequenziale al suo interno:
|
Nell'esempio sono evidenziate le righe in cui si dichiara la tabella e quelle che eseguono la scansione. Si deve osservare che prima dell'istruzione SEARCH, l'indice deve essere collocato manualmente nella posizione iniziale.
L'esempio seguente mostra una variante del programma già descritto, in cui si vuole eseguire una ricerca binaria. Perché la ricerca possa avere successo, la tabella deve essere dichiarata con una dimensione variabile di elementi, inoltre non è più necessario impostare il valore iniziale dell'indice, prima della scansione.
|
La ricerca binaria richiede che gli elementi della tabella siano ordinati in base alla chiave primaria; pertanto, si presume che l'inserimento dei cognomi avvenga tenendo conto dell'ordine lessicografico.
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome tabelle_2.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]