COBOL

REGOLE SINTATTICHE

Tutte le linee di comandi sono terminate da . e sono dette imperative.
Dicesi paragrafo l'insieme di una o piu' istruzioni che terminano con un unico punto.

COLONNE

Un programma in COBOL deve rispettare alcune colonnature standard.
        C  margine A  margine B
1<-->6  7  8<---->11  12<--->72
  |     |     |           |
  |     |     |           +--------- qui si digita il programma
  |     |     +--------------------- intestazione division/section/nomi par.
  |     +--------------------------- se * la riga e' un commento
  +--------------------------------- documentazione
Un programma e' suddiviso in DIVISION e SECTION:
  IDENTIFICATION DIVISION.     dichiarazioni generali del programma
    PROGRAM-ID                 nome del programma

  ENVIRONMENT DIVISION.
    CONFIGURATION SECTION.     definisce tipo di elaboratore
    INPUT-OUTPUT SECTION.      solo se il prog utilizza i file
      FILE-CONTROL.
        SELECT ...             assegna nomi interni a file esterni

  DATA DIVISION.               definizione tipo e dimensione dei dati
    FILE SECTION.
      FD ...                   file description
    WORKING-STORAGE SECTION.   contiene le dichiarazioni delle variabili
                               contiene dati elementari(77) e composti(>=01)
      VALUE ...
      PICTURE ...              A=alpha, 9=numerico, X=alphanum

  PROCEDURE DIVISION.
    MAIN SECTION.
    MAIN EXIT.

NUMERI DI LIVELLO

I numeri di livello permetto di dichiarare le variabili che saranno utilizzate nel programma.
Una variabile di tipo semplice o elementare viene indicata da 77, es:
  77LATO           PIC   9.
Soltanto i campi elementari hanno la clausola PICTURE.
Le variabili strutturate sono formate da una o piu' variabili elementari. Il livello 01 viene riservato per la dichiarazione dei record.
  01NOME-STUD.
    03      COGNOME       PIC X(15)
    03      NOME          PIC X(15)
    03      CLASSE        PIC X(5)
E' possibile associare nomi diversi ai valori che puo' assumere un campo.
  77   GRADO    PIC9(01)
       88       PRIMO     VALUE   1
       88       SECONDO   VALUE   2
       88       TERZO     VALUE   3

DICHIARAZIONE VARIABILI

PICTURE

Permette di definire la lunghezza di un campo e la sua classe.
  PIC XXXXX. o PIC X(5).         5 caratteri alphanumerici
  PIC 99.    o PIC 9(2).         2 caratteri numerici
- VALUE Associata alla PICTURE vi e' l'istruzione VALUE che permette una inizializzazione di una variabile durante la fase dichiarativa.
  PIC 9(3)       VALUE 145.
- variabile con segno:

  VALORE         S     PIC  S9(06)
- variabile con virgola:

  VALORE         V     PIC  9(03)V9(03)
- variabili zoned (numeriche) per la variabile sono utilizzati tanti byte quanti indicati nella PICTURE.
  01VAR1-ZONED   PIC   9(6).
  01VAR2-ZONED   PIC   S9(6)  DISPLAY.

  MOVE   19      TO  VAR1-ZONED.
  MOVE   -1993   TO  VAR2-ZONED.
- variabili packed (numeriche) in ogni byte sono impaccati 3 digit piu' un nibble per il segno.
  01VAR-PAC      PIC   9(6)  COMP-3.
- variabili binarie (numeriche) il numero viene memorizzato in 2, 4 o 8 byte secondo il numero di cifre.
  01VAR-BINPIC      PIC   9(4)  COMP.

  Fino a 4   cifre utilizza 2 byte
  da 5 a 9     "      "     4  "
  da 10 a 18   "      "     8  "
- variabili floating-point puo' essere in singola (COMP-1) o doppia precisione (COMP-2).
Se singola precisione utilizza 4 byte (1 esponente + 3 mantissa)
Se doppia precisione utilizza 8 byte (1 esponente + 7 mantissa)

TABELLE

Una tabella e' un array di tipi omogenei:
  01TABELLA     OCCURS 10 TIMES PIC 9(6).

  01TABELLA     OCCURS 10 TIMES.
    03     CAMPO-1 PIC 9(2).
    03     CAMPO-3 PIC X(4).
Per riferirsi alla variabile CAMPO-1 nel secondo elemento della tabella e' sufficente usare:
CAMPO-1(2)
Volendo riferirsi all'intero secondo record della tabella:
TABELLA(2)

OPERAZIONI MATEMATICHE

COMPUTE

Esegue le operazioni matemetiche fondamentali (+, -, /, *):
  COMPUTE campo-1 = VALORE * 2 + 10.
  COMPUTE X       = VALORE + VALORE.

OPERAZIONI ALGEBRICHE

Le operazioni matematiche sono utilizzabili con keyword indipendenti:
  ADD op-1 op-2 ... op-n GIVING ris-1 ... ris-m
  ADD op-1 op-2 ... op-n TO     ris-1 ... ris-m
  se VAR1 = 23 allora con
    ADD   VAR1 2   GIVING   RIS1 RIS2.
  RIS1 e RIS2 contengono 25

  se VAR1 = 23 e RIS1 = 5 allora con
    ADD   VAR1 3   TO       RIS1.
  RIS1 contiene 31
In ugual modo vi sono:
  SUBTRACT op-1 ... op-n  FROM  valore  GIVING  ris-1 ... ris-m
  SUBTRACT op-1 ... op-n  FROM  valore  TO      ris-1 ... ris-m

  MULTIPLY val-1  BY  val-2  GIVING  ris-1 ... ris-n
  MULTIPLY val-1  BY                 ris-1 ... ris-n

  DIVIDE   val-1  INTO  val-2  GIVING  ris-1  REMAINDER  campo-1
  DIVIDE   val-1  INTO                 ris-1 ... ris-n

I/O CON TERMINALE

ACCEPT

Attende da stdin un dato: ACCEPT VALORE.

DISPLAY

Scrive a stdout il contenuto di una variabile: DISPLAY VALORE.

TERMINAZIONE PROGRAMMA

STOP RUN

Termina l'esecuzione del programma.
Deve essercene almeno una.

ISTRUZIONI DI CONTROLLO

IF

  IF condizione istruzione-1 [ ELSE istruzione-2 ].
Per es:
  IF VARIABILE-A > VARIABILE-B
    DISPLAY 'A maggiore di B'
  ELSE
    DISPLAY 'B maggiore di A'.

  IF SCONTO NOT EQUAL ZERO
    COMPUTE TOT = IMP + ( IMP * SCONTO / 100 )
    DISPLAY TOT.

ALTRE ISTRUZIONI

MOVE

Trasferisce il contenuto di una variabile ad un altra.
  MOVE campo-1 TO campo-2.
  MOVE 12345   TO VALORE.

FILE I/O

DICHIARAZIONI

L' associazione dei files interni a quelli reali esterni viene effettuata in ENVIRONMENT DIVISION, INPUT-OUTPUT SECTION, paragrafo FILE-CONTROL mediante la clausola SELECT.
Per ogni file gestito si deve scrivere un FD (File Description):
  FILE SECTION.
  FD    nome-file
    LABEL RECORD IS STANDARD
    [BLOCK CONTAINS number RECORD].
  01    nome-record      PIC ..........
       ...oppure...
  01  REC-ARTICOLO.
    03   CODICE          PIC  X(10).
    03   DESCRIZIONE     PIC  X(20).
    03   GIACENZA        PIC  9(5).
    03   GIACENZA-MIN    PIC  9(5).
    03   QTA-ORD         PIC  9(5).

ISTRUZIONI PER OPERAZIONI SUI FILE

Un file puo' essere aperto in input od in output.
Quando si legge un file si puo' far leggere i dati in una struttura che ricalca quella dei record nella WORKING-STORAGE SECTION.

OPEN

  OPEN INPUT  nome-file1 [nome-file2] ...
  OPEN OUTPUT nome-file1 [nome-file2] ...
  OPEN INPUT  nome-file1
       OUTPUT nome-file2

CLOSE

  CLOSE nome-file1 [nome-file2] ...

READ

  READ nome-file [AT END istruzioni]
  READ nome-file INTO nome-dato [AT END istruzioni]

WRITE

  WRITE nome-record
  WRITE nome-record FROM nome-dato

PRE-PROCESSING

COPY - INCLUDE DI ALTRI FILES

Mediante questo comando e' possibile includere altri files che contengono per esempio definizioni comuni.
  COPY filename

CHIAMATE DI PROGRAMMI

PERFORM

PERFORM nome-di-procedura Esegue un paragrafo o una section.
Equivale alla call subroutine di molti linguaggi.
Al ritorno viene eseguita l'istruzione successiva.

CALL

L'istruzione call consente di chiamare un sotto-programma:
  CALL nome-modulo
Il programma chiamato ritorna il controllo mediante l'istruzione GOBACK.

USER SECTION (SUBROUTINES)

E' possibile dichiarare una subroutine mediante le istruzioni:
  SCONTO SECTION.
  INIZIO-SCONTO.
       COMPUTE TOT = IMP + ( IMP * SCONTO / 100 ).
  FINE-SCONTO.
       EXIT.