[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
La divisione PROCEDURE DIVISION costituisce la quarta e ultima parte di un programma sorgente COBOL. La divisione si può suddividere in paragrafi, oppure in sezioni contenenti eventualmente dei paragrafi. All'interno delle sezioni o dei paragrafi, si inseriscono le istruzioni che descrivono la procedura del programma.
Le istruzioni sono inserite a gruppi, terminanti con un punto fermo, seguito da uno spazio; le istruzioni singole, che non costituiscono un gruppo autonomo, possono essere separate graficamente attraverso dei separatori (la virgola, il punto e virgola, la parola THEN).
Alcune istruzioni, quando non costituiscono un gruppo autonomo, possono collocarsi solo alla fine del gruppo. Si tratta precisamente di GO TO e di STOP RUN. |
La divisione può articolarsi in tre modi diversi; quello che si vede descritto nello schema segue è il più semplice, perché non fa uso delle sezioni:
[PROCEDURE DIVISION. ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ {paragraph-name. [sentence]...}... |
Se si usano le sezioni, i paragrafi devono essere contenuti tutti all'interno di sezioni:
[PROCEDURE DIVISION. ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ / section-name SECTION [segment-number]. \ | ¯¯¯¯¯¯¯ | < {paragraph-name. >... | [sentence]...}... | \ / |
Eventualmente ci può essere un gruppo iniziale di sezioni speciali; in tal caso, è obbligatorio suddividere il resto del programma in sezioni:
[PROCEDURE DIVISION. ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ DECLARATIVES. ¯¯¯¯¯¯¯¯¯¯¯¯ / section-name SECTION [segment-number]. \ | ¯¯¯¯¯¯¯ | | USE statement | < ¯¯¯ >... | {paragraph-name. | | [sentence]...}... | \ / END DECLARATIVES. ¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯ / section-name SECTION [segment-number]. \ | ¯¯¯¯¯¯¯ | < {paragraph-name. >... | [sentence]...}... | \ / |
Il primo gruppo di istruzioni a essere eseguito è quello che si trova nel primo paragrafo della prima sezione; escludendo quelli inseriti in un blocco DECLARATIVES. In condizioni normali, la sequenza dei gruppi di istruzioni eseguiti prosegue con quelli successivi, salvo quando si incontrano istruzioni speciali che richiedono esplicitamente di modificare questo tipo di flusso.
Quando all'inizio della divisione PROCEDURE DIVISION appare la parola chiave DECLARATIVES, che inizia dall'area A del modulo di programmazione, le sezioni dichiarate fino alla riga dove appare END DECLARATIVES (sempre a partire dall'area A), non vengono eseguite normalmente, ma solo al verificarsi di certe condizioni.
DECLARATIVES. ¯¯¯¯¯¯¯¯¯¯¯¯ / section-name SECTION [segment-number]. \ | ¯¯¯¯¯¯¯ | | USE statement | < ¯¯¯ >... | {paragraph-name. | | [sentence]...}... | \ / END DECLARATIVES. ¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯ |
Ogni sezione di questo gruppo speciale, inizia con una o più istruzioni USE, prima di procedere con dei paragrafi contenenti altre istruzioni. L'istruzione USE serve ad abbinare l'esecuzione della sezione (a partire dal primo dei suoi paragrafi), a condizione che si verifichi una certa condizione:
/ {file-name}... \ | | / \ | INPUT | | EXCEPTION | | ¯¯¯¯¯ | USE AFTER STANDARD < ¯¯¯¯¯¯¯¯¯ > PROCEDURE ON < OUTPUT > ¯¯¯ ¯¯¯¯¯ | ERROR | ¯¯¯¯¯¯¯¯¯ | ¯¯¯¯¯¯ | \ ¯¯¯¯¯ / | I-O | | ¯¯¯ | \ EXTEND / ¯¯¯¯¯¯ |
Tenendo conto che le parole chiave EXCEPTION e ERROR del modello sono equivalenti, si intende che questa istruzione serve ad attivare la sezione che la contiene se si verifica una condizione di errore, che non sia stato gestito diversamente all'interno del programma, riguardante: un certo file (file-name), un file qualunque aperto in lettura (INPUT), scrittura (OUTPUT), lettura e scrittura (I-O) o in estensione (EXTEND).
Viene mostrato l'esempio di un piccolo programma completo, che ha lo scopo di leggere un file (input.txt
) e di mostrarne il contenuto sullo schermo:
|
Si può osservare nel programma che il ciclo di lettura non termina mai, perché la condizione 0 = 1 non si può avverare. Così facendo, dato che la lettura non prevede alcun controllo del superamento della fine del file, si verifica un errore che viene preso in considerazione dalla sezione FILE-ACCESS-ERROR.
Compilando il programma con OpenCOBOL, l'avvio dell'eseguibile che si ottiene genera un risultato simile a quello seguente:
aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccccccc FILE ACCESS ERROR: 10 |
In pratica, alla fine del file termina la visualizzazione del suo contenuto e si ottiene un messaggio di errore, come organizzato nella sezione FILE-ACCESS-ERROR.
Le sezioni della divisione PROCEDURE DIVISION, oltre al nome possono indicare un numero di segmento, che può andare da zero a 99.
section-name SECTION [segment-number]. |
Il numero di segmento serve a raggruppare tutte le sezioni con lo stesso numero in uno stesso segmento, allo scopo di sapere, quale parte del programma deve rimanere simultaneamente nella memoria centrale durante il funzionamento.
Si dividono precisamente due tipi di segmenti: quelli fissi, con numeri da 00 a 49, e quelli indipendenti, da 50 a 99. I segmenti numerati fino al numero 49 devono rimanere sempre in memoria, mentre gli altri devono esserci solo per il tempo necessario al loro funzionamento. Per questa ragione, le sezioni dichiarate nella zona DECLARATIVES, possono essere associate soltanto a segmenti fissi (da 00 a 49).
Naturalmente, questa possibilità di segmentare il programma dipende dal compilatore, che potrebbe limitarsi semplicemente a ignorare il numero di segmento.
Un gruppo di istruzioni si evidenzia per la presenza del punto fermo conclusivo (seguito da uno spazio). Le istruzioni che non costituiscono gruppi singoli possono essere separate, oltre che con lo spazio, con la virgola, il punto e virgola, e con la parola THEN.
Le istruzioni condizionali sono quelle che alterano la sequenza normale dell'esecuzione delle istruzioni, sulla base della verifica di una condizione. L'istruzione condizionale tipica è IF, ma molte altre istruzioni prevedono delle parole opzionali per descrivere un'azione da compiere al verificarsi di una certa condizione.
/ \ .-- / \ --. | { statement-1 }... | | | { statement-2 }... | | IF condition-1 < > | ELSE < > | ¯¯ | NEXT SENTENCE | | ¯¯¯¯ | NEXT SENTENCE | | \ ¯¯¯¯ ¯¯¯¯¯¯¯¯ / `-- \ ¯¯¯¯ ¯¯¯¯¯¯¯¯ / --' |
Quello che si vede sopra è lo schema sintattico dell'istruzione IF, che incorpora a sua volta altre istruzioni. Naturalmente, le istruzioni incorporate possono contenere altre istruzioni condizionali annidate; in ogni caso, non è possibile suddividere una struttura del genere in gruppi di istruzioni più piccoli, pertanto il punto fermo finale può apparire solo alla fine della struttura più esterna.
|
L'esempio mostra un'istruzione IF annidata, dove sono stati usati i vari separatori disponibili, per facilitare la lettura: la parola THEN non fa parte dell'istruzione, ma introduce qui le istruzioni da eseguire nel caso la condizione si avveri; la virgola viene usata per terminare le istruzioni singole, mentre il punto e virgola si usa per concludere quelle istruzioni dopo le quali si passa all'alternativa (introdotta dalla parola chiave ELSE).
Il punto fermo finale è molto importante, perché rappresenta l'unico modo per stabilire dove finisca tutta la struttura, dal momento che nel linguaggio non è previsto l'uso di parole come «end if».
Quando la parte procedurale del programma si suddivide in sezioni, i nomi dei paragrafi devono essere univoci soltanto nell'ambito della sezione in cui vengono dichiarati.
Quando si deve fare riferimento al nome di un paragrafo che non è unico nel programma, si deve usare la qualificazione per distinguere a quale sezione si sta facendo riferimento; eccezionalmente, se si tratta della sezione in cui ci si trova già, la qualificazione è implicita.
La qualificazione si ottiene aggiungendo la parola OF, oppure IN, seguita dal nome della sezione.
/ \ | IN | paragraph-name < ¯¯ > section-name | OF | \ ¯¯ / |
L'espressione aritmetica è ciò che si traduce in un valore numerico, eventualmente attraverso l'uso di operatori. Gli operatori aritmetici disponibili nel linguaggio COBOL sono molto pochi, limitando le possibilità alle quattro operazioni.
È importante osservare che gli operatori aritmetici, tranne nel caso delle parentesi, vanno separati dai loro argomenti; diversamente, il segno - verrebbe confuso come carattere che compone una parola. Per esempio, A - B è un'espressione che rappresenta una sottrazione, mentre A-B è una parola. |
Tabella 471.12. Espressioni aritmetiche.
|
L'ordine di precedenza nelle espressioni aritmetiche è quello consueto: prima gli operatori unari, che si applicano a un operando singolo, poi la moltiplicazione e la divisione, quindi la somma e la sottrazione.
Nel linguaggio COBOL si distinguono diversi tipi di espressioni condizionali elementari, che vengono descritte nelle sezioni successive. Le espressioni elementari, a loro volta, si possono combinare in espressioni composte, con l'uso di operatori booleani ed eventualmente con l'aiuto di parentesi tonde per modificare l'ordine di valutazione.
Le condizioni di relazione stabiliscono un confronto tra due valori, che possono essere rappresentati da variabili, costanti o da espressioni aritmetiche. Segue lo schema sintattico:
/ IS [NOT] GREATER THAN \ | ¯¯¯ ¯¯¯¯¯¯¯ | | IS [NOT] LESS THAN | / identifier-1 \ | ¯¯¯ ¯¯¯¯ | / identifier-2 \ | | | IS [NOT] EQUAL TO | | | < literal-1 > < ¯¯¯ ¯¯¯¯¯ > < literal-2 > | | | IS [NOT] > | | | \ arith-expression-1 / | ¯¯¯ ¯ | \ arith-expression-2 / | IS [NOT] < | | ¯¯¯ ¯ | \ IS [NOT] = / ¯¯¯ ¯ |
Tabella 471.14. Significato degli operatori di relazione.
|
Quando gli operandi sono entrambi numerici, indipendentemente dal fatto che la loro rappresentazione sia in forma di «indice» (INDEX), compatta (COMPUTATIONAL) o in forma di byte (DISPLAY), il confronto si basa sul valore numerico che esprimono, tenendo conto del segno, se c'è, considerando positivi i valori senza segno.
Quando si confrontano operandi alfanumerici, o quando anche uno solo è di tipo alfanumerico, il confronto avviene in modo lessicografico (in base all'ordinamento previsto dalla codifica adottata).
La condizione di classe serve a stabilire se l'operando a cui si applica è numerico o alfabetico. È numerico un operando che è composto soltanto di cifre da 0 a 9, con il segno eventuale; è alfabetico un operando composto soltanto dal lettere alfabetiche ed eventualmente da spazi.
La condizione di classe si utilizza solo per verificare il contenuto di variabili che sono state dichiarate con una rappresentazione in byte (USAGE IS DISPLAY). |
Segue lo schema sintattico per esprimere la condizione di classe:
/ \ | NUMERIC | identifier IS [NOT] < ¯¯¯¯¯¯¯ > ¯¯¯ | ALPHABETIC | \ ¯¯¯¯¯¯¯¯¯¯ / |
Naturalmente, se si usa la parola chiave NOT, si intende invertire il significato della condizione.
I nomi di condizione, che si dichiarano nella divisione DATA DIVISION con il numero di livello 88, servono a descrivere il confronto della variabile a cui si riferiscono con i valori che rappresentano.
Supponendo di avere dichiarato il nome di condizione PARI nel modo seguente:
|
Nella divisione PROCEDURE DIVISION potrebbero apparire righe come quelle successive, per verificare che la variabile CODICE contenga un valore pari:
|
La condizione di segno permette di stabilire se un'espressione aritmetica (e può essere anche solo una costante o una variabile numerica) è positiva, negativa o se vale esattamente zero:
/ POSITIVE \ | ¯¯¯¯¯¯¯¯ | arithmetic-expression IS [NOT] < NEGATIVE > ¯¯¯ | ¯¯¯¯¯¯¯¯ | \ ZERO / ¯¯¯¯ |
Attraverso gli operatori booleani comuni, si possono definire delle condizioni composte, oppure negate. Si utilizzano le parole chiave AND, OR e NOT per esprimere gli operatori booleani noti con lo stesso nome. Con l'ausilio delle parentesi tonde si possono modificare le precedenze nella valutazione delle espressioni.
Per «avverbi comuni» qui si intendono delle parole chiave che possono far parte di varie istruzioni, fornendo però lo stesso tipo di funzionalità.
Tabella 471.19. Alcuni avverbi comuni.
|
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 divisione_171_procedure_division_187.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]