UC02840

Programação COBOL

Sintaxe, file handling, mainframe legacy

Curso profissional · 25h · Linguagem business

Plano

  1. COBOL — contexto e mercado
  2. Setup (GnuCOBOL)
  3. Estrutura de um programa
  4. Tipos e PICTURE
  5. Estruturas de controlo
  6. Ficheiros sequenciais
  7. Subprograms e CALL
  8. Mainframe básico

Bloco 1 · Contexto

Porquê aprender COBOL em 2026?

  • 220 mil milhões de linhas ainda em produção (estimativa).
  • 80% das transações de cartões de crédito passam por COBOL.
  • 70% dos bancos mundiais correm em mainframe COBOL.
  • Programadores escassos — salários muito altos.
  • Segurança no emprego: legados que não vão a lado nenhum.

Linguagem dos anos 60 mas ainda essencial em finança, seguros, governo.

Onde se usa COBOL

  • Bancos: core banking, processamento batch.
  • Seguros: cálculo de apólices, sinistros.
  • Governo: segurança social, impostos.
  • Aviação: reservas, scheduling.
  • Retail: gestão de stocks, payroll.

IBM mainframes (z/OS), Unisys, NEC.

Setup — GnuCOBOL

# Ubuntu/Debian
sudo apt install gnucobol

# Mac
brew install gnucobol

# Verificar
cobc --version

GnuCOBOL compila para C, depois para binário. Permite aprender sem mainframe.

IDE: OpenCobolIDE (Linux/Mac/Win) ou VSCode + COBOL extension.

Hello World

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO-WORLD.
       
       PROCEDURE DIVISION.
           DISPLAY "Olá mundo!".
           STOP RUN.
cobc -x hello.cob -o hello
./hello

Atenção às colunas — COBOL tem formato fixo:

  • Colunas 1-6: numeração (opcional).
  • Coluna 7: indicador (*=comentário, -=continuação).
  • Colunas 8-11: Area A (DIVISIONS, SECTIONS, paragraphs).
  • Colunas 12-72: Area B (statements).

Bloco 2 · Estrutura

4 Divisions obrigatórias

       IDENTIFICATION DIVISION.
       PROGRAM-ID. EXEMPLO.
       AUTHOR. EU.
       
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER. PC.
       OBJECT-COMPUTER. PC.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-NOME PIC X(50).
       01 WS-IDADE PIC 9(3).
       
       PROCEDURE DIVISION.
           DISPLAY "Nome: " WS-NOME.
           STOP RUN.

Divisions explicadas

  • IDENTIFICATION: nome do programa, autor.
  • ENVIRONMENT: configuração (computadores, ficheiros físicos).
  • DATA: variáveis e estruturas.
  • PROCEDURE: a lógica do programa.

Estrutura rígida — sempre nesta ordem.

Bloco 3 · Tipos e PICTURE

PIC clause

01 WS-NOME       PIC X(20).        * 20 chars
01 WS-IDADE      PIC 9(3).         * 3 dígitos (até 999)
01 WS-SALARIO    PIC 9(7)V99.      * 7 inteiros + 2 decimais
01 WS-INICIAL    PIC X.            * 1 char
01 WS-PONTOS     PIC ZZ9.          * 3 dígitos com zeros suprimidos
01 WS-NIF        PIC 9(9).         * 9 dígitos

X = alfanumérico, 9 = numérico, V = decimal implícito, Z = supressão de zero.

Grupos (records)

01 WS-CLIENTE.
   05 WS-NOME       PIC X(30).
   05 WS-MORADA.
      10 WS-RUA     PIC X(40).
      10 WS-CIDADE  PIC X(20).
      10 WS-CP      PIC 9(4)-9(3).
   05 WS-IDADE      PIC 9(3).

Níveis: 01 = record principal, 02-49 = subgrupos.

Literais e MOVE

       WORKING-STORAGE SECTION.
       01 WS-NOME    PIC X(20).
       01 WS-IDADE   PIC 9(3).
       
       PROCEDURE DIVISION.
           MOVE "Ana" TO WS-NOME.
           MOVE 25 TO WS-IDADE.
           
           DISPLAY "Nome: " WS-NOME.
           DISPLAY "Idade: " WS-IDADE.
           
           STOP RUN.

MOVE A TO B = atribuir A em B.

Bloco 4 · Aritmética

Operações

       01 WS-A PIC 9(5) VALUE 100.
       01 WS-B PIC 9(5) VALUE 30.
       01 WS-RES PIC 9(5).
       
       PROCEDURE DIVISION.
           ADD WS-A TO WS-B GIVING WS-RES.        * A + B
           SUBTRACT WS-B FROM WS-A GIVING WS-RES. * A - B
           MULTIPLY WS-A BY WS-B GIVING WS-RES.   * A * B
           DIVIDE WS-A BY WS-B GIVING WS-RES.     * A / B
           
           COMPUTE WS-RES = (WS-A + WS-B) * 2.    * fórmulas

COMPUTE permite expressões aritméticas normais.

ACCEPT — input

       01 WS-NOME PIC X(30).
       01 WS-IDADE PIC 9(3).
       
       PROCEDURE DIVISION.
           DISPLAY "Nome: ".
           ACCEPT WS-NOME.
           
           DISPLAY "Idade: ".
           ACCEPT WS-IDADE.
           
           DISPLAY "Olá " WS-NOME ", " WS-IDADE " anos".
           STOP RUN.

Bloco 5 · Controlo

IF / ELSE

       IF WS-IDADE > 18
           DISPLAY "Adulto"
       ELSE
           DISPLAY "Menor"
       END-IF.
       
       IF WS-NOTA >= 18
           DISPLAY "Excelente"
       ELSE IF WS-NOTA >= 14
           DISPLAY "Bom"
       ELSE IF WS-NOTA >= 10
           DISPLAY "Suficiente"
       ELSE
           DISPLAY "Reprovado"
       END-IF.

EVALUATE (switch)

       EVALUATE WS-DIA
           WHEN 1 THRU 5
               DISPLAY "Dia útil"
           WHEN 6 THRU 7
               DISPLAY "Fim-de-semana"
           WHEN OTHER
               DISPLAY "Inválido"
       END-EVALUATE.

PERFORM (loops + chamada de paragraph)

       * Chamar paragraph como função
       PERFORM SAUDAR.
       
       * Loop N vezes
       PERFORM 10 TIMES
           DISPLAY "Olá"
       END-PERFORM.
       
       * Loop condicional
       PERFORM UNTIL WS-CONTADOR > 10
           DISPLAY WS-CONTADOR
           ADD 1 TO WS-CONTADOR
       END-PERFORM.
       
       * For loop
       PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 10
           DISPLAY WS-I
       END-PERFORM.

Bloco 6 · Paragraphs

Modularização

       PROCEDURE DIVISION.
       MAIN-PARAGRAPH.
           PERFORM INICIALIZAR.
           PERFORM PROCESSAR.
           PERFORM FINALIZAR.
           STOP RUN.
       
       INICIALIZAR.
           DISPLAY "Início".
           MOVE 0 TO WS-CONTADOR.
       
       PROCESSAR.
           PERFORM 5 TIMES
               ADD 1 TO WS-CONTADOR
               DISPLAY WS-CONTADOR
           END-PERFORM.
       
       FINALIZAR.
           DISPLAY "Fim. Total: " WS-CONTADOR.

PERFORM chama paragraph (como função sem args).

Bloco 7 · Ficheiros sequenciais

Definir ficheiro

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT CLIENTES-FILE 
               ASSIGN TO "clientes.dat"
               ORGANIZATION IS LINE SEQUENTIAL.
       
       DATA DIVISION.
       FILE SECTION.
       FD CLIENTES-FILE.
       01 CLIENTE-REC.
          05 NOME PIC X(30).
          05 IDADE PIC 9(3).
          05 SALARIO PIC 9(7)V99.

Ler ficheiro

       WORKING-STORAGE SECTION.
       01 WS-EOF PIC X VALUE "N".
       
       PROCEDURE DIVISION.
           OPEN INPUT CLIENTES-FILE.
           
           PERFORM UNTIL WS-EOF = "Y"
               READ CLIENTES-FILE
                   AT END MOVE "Y" TO WS-EOF
                   NOT AT END
                       DISPLAY NOME ", " IDADE " anos"
               END-READ
           END-PERFORM.
           
           CLOSE CLIENTES-FILE.
           STOP RUN.

Escrever ficheiro

       OPEN OUTPUT CLIENTES-FILE.
       
       MOVE "Ana Silva" TO NOME.
       MOVE 25 TO IDADE.
       MOVE 1500.00 TO SALARIO.
       WRITE CLIENTE-REC.
       
       MOVE "Bruno Costa" TO NOME.
       MOVE 32 TO IDADE.
       MOVE 2200.00 TO SALARIO.
       WRITE CLIENTE-REC.
       
       CLOSE CLIENTES-FILE.

Modos: INPUT (ler), OUTPUT (escrever), I-O (ambos), EXTEND (append).

Bloco 8 · CALL

Subprograms

SUBPROG.cob:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SUBPROG.
       
       DATA DIVISION.
       LINKAGE SECTION.
       01 LK-A PIC 9(5).
       01 LK-B PIC 9(5).
       01 LK-RES PIC 9(5).
       
       PROCEDURE DIVISION USING LK-A LK-B LK-RES.
           COMPUTE LK-RES = LK-A + LK-B.
           GOBACK.

CALL

       WORKING-STORAGE SECTION.
       01 WS-A PIC 9(5) VALUE 10.
       01 WS-B PIC 9(5) VALUE 20.
       01 WS-RES PIC 9(5).
       
       PROCEDURE DIVISION.
           CALL "SUBPROG" USING WS-A WS-B WS-RES.
           DISPLAY "Resultado: " WS-RES.
           STOP RUN.

Compilar separadamente e linkar:

cobc -m subprog.cob
cobc -x main.cob -o main
./main

Bloco 9 · Boas práticas

Convenções

  • Prefix WS- em working-storage.
  • Prefix WS-EOF ou WS-FIM para flags.
  • Paragraph names descritivos: LER-CLIENTE, PROCESSAR-DADOS.
  • MAIÚSCULAS sempre (convenção forte).
  • VALUE para inicializar.
       01 WS-CONTADOR PIC 9(5) VALUE ZERO.
       01 WS-EOF      PIC X    VALUE "N".
       01 WS-MAX      PIC 9(3) VALUE 100.

Mainframe na prática

  • z/OS é o SO dos mainframes IBM.
  • JCL (Job Control Language) lança jobs batch.
  • CICS = transaction processing.
  • DB2 = base de dados.
  • VSAM = ficheiros indexados.

COBOL hoje é frequentemente parte de stack:

  • COBOL (lógica) + DB2 (dados) + CICS (transações) + JCL (jobs).

UC02840 · resumo

  • COBOL é antigo mas omnipresente em bancos, seguros, governo.
  • Sintaxe rígida com 4 DIVISIONS, formato em colunas.
  • PICTURE clause define tipo e tamanho.
  • MOVE, ADD, COMPUTE para manipulação.
  • PERFORM para loops e chamada de paragraphs.
  • FD + SELECT + OPEN/READ/WRITE/CLOSE para ficheiros.
  • CALL para subprograms.
  • Empregabilidade altíssima — escassez de programadores COBOL.