Ficha 01 · COBOL fundamentos
Exercício 1 · Hello World
Cria hello.cob em formato clássico (com colunas) que imprime "Olá mundo!" e o teu nome. Compila com cobc -x e corre.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
AUTHOR. JOAO SILVA.
PROCEDURE DIVISION.
DISPLAY "Olá mundo!".
DISPLAY "Sou o João Silva.".
STOP RUN.
cobc -x hello.cob -o hello
./hello
Exercício 2 · Input e cálculo
Programa que pede idade ao utilizador e responde: - "Adulto" se >= 18. - "Adolescente" se >= 13. - "Criança" caso contrário.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. CLASSIFICAR-IDADE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-IDADE PIC 9(3).
PROCEDURE DIVISION.
DISPLAY "Idade: ".
ACCEPT WS-IDADE.
IF WS-IDADE >= 18
DISPLAY "Adulto"
ELSE
IF WS-IDADE >= 13
DISPLAY "Adolescente"
ELSE
DISPLAY "Criança"
END-IF
END-IF.
STOP RUN.
Exercício 3 · Conversor temperatura
Pede uma temperatura em Celsius e converte para Fahrenheit (F = C × 9/5 + 32). Usa COMPUTE.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. CELSIUS-FAHRENHEIT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CELSIUS PIC S9(3)V99.
01 WS-FAHRENHEIT PIC S9(3)V99.
PROCEDURE DIVISION.
DISPLAY "Celsius: ".
ACCEPT WS-CELSIUS.
COMPUTE WS-FAHRENHEIT = WS-CELSIUS * 9 / 5 + 32.
DISPLAY WS-CELSIUS " C = " WS-FAHRENHEIT " F".
STOP RUN.
Exercício 4 · Tabuada com PERFORM
Pede um número e imprime a sua tabuada de 1 a 10. Usa PERFORM VARYING.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. TABUADA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-N PIC 9(2).
01 WS-I PIC 9(2).
01 WS-RES PIC 9(4).
PROCEDURE DIVISION.
DISPLAY "Número: ".
ACCEPT WS-N.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 10
COMPUTE WS-RES = WS-N * WS-I
DISPLAY WS-N " x " WS-I " = " WS-RES
END-PERFORM.
STOP RUN.
Exercício 5 · Cliente record
Define um record WS-CLIENTE com nome (30), email (50), telefone (9), idade (3). Preenche, e imprime cada campo + o record inteiro.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. CLIENTE-RECORD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CLIENTE.
05 WS-NOME PIC X(30).
05 WS-EMAIL PIC X(50).
05 WS-TELEFONE PIC 9(9).
05 WS-IDADE PIC 9(3).
PROCEDURE DIVISION.
MOVE "Ana Silva" TO WS-NOME.
MOVE "ana.silva@example.pt" TO WS-EMAIL.
MOVE 912345678 TO WS-TELEFONE.
MOVE 25 TO WS-IDADE.
DISPLAY "Nome: " WS-NOME.
DISPLAY "Email: " WS-EMAIL.
DISPLAY "Telefone: " WS-TELEFONE.
DISPLAY "Idade: " WS-IDADE.
DISPLAY "---".
DISPLAY "Record: " WS-CLIENTE.
STOP RUN.
Exercício 6 · Notas dos alunos
Cria array (OCCURS) com 5 notas. Lê todas via ACCEPT, calcula e imprime média.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. MEDIA-NOTAS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NOTAS.
05 WS-NOTA OCCURS 5 TIMES PIC 99.
01 WS-I PIC 9.
01 WS-SOMA PIC 999.
01 WS-MEDIA PIC 99V99.
PROCEDURE DIVISION.
MOVE 0 TO WS-SOMA.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
DISPLAY "Nota " WS-I ": "
ACCEPT WS-NOTA(WS-I)
ADD WS-NOTA(WS-I) TO WS-SOMA
END-PERFORM.
COMPUTE WS-MEDIA = WS-SOMA / 5.
DISPLAY "Soma: " WS-SOMA.
DISPLAY "Média: " WS-MEDIA.
STOP RUN.
Exercício 7 · EVALUATE
Pede o número do mês (1-12) e responde com a estação: - 12, 1, 2: Inverno - 3, 4, 5: Primavera - 6, 7, 8: Verão - 9, 10, 11: Outono
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. ESTACAO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-MES PIC 99.
PROCEDURE DIVISION.
DISPLAY "Mês (1-12): ".
ACCEPT WS-MES.
EVALUATE WS-MES
WHEN 12
WHEN 1
WHEN 2
DISPLAY "Inverno"
WHEN 3 THRU 5
DISPLAY "Primavera"
WHEN 6 THRU 8
DISPLAY "Verão"
WHEN 9 THRU 11
DISPLAY "Outono"
WHEN OTHER
DISPLAY "Mês inválido"
END-EVALUATE.
STOP RUN.
Exercício 8 · Modularização com paragraphs
Cria programa que faz uma simulação de caixa registadora simples:
- MAIN: chama os outros.
- INICIALIZAR: zera total, imprime cabeçalho.
- ADICIONAR-ITEM: pede preço, adiciona ao total (PERFORM até preço = 0).
- FECHAR: imprime total + IVA 23%.
Resposta:
IDENTIFICATION DIVISION.
PROGRAM-ID. CAIXA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-PRECO PIC 9(5)V99.
01 WS-TOTAL PIC 9(7)V99.
01 WS-IVA PIC 9(7)V99.
01 WS-FINAL PIC 9(8)V99.
PROCEDURE DIVISION.
MAIN.
PERFORM INICIALIZAR.
PERFORM ADICIONAR-ITENS.
PERFORM FECHAR.
STOP RUN.
INICIALIZAR.
DISPLAY "=== CAIXA REGISTADORA ===".
DISPLAY "Introduz 0 para terminar".
MOVE 0 TO WS-TOTAL.
ADICIONAR-ITENS.
MOVE 1 TO WS-PRECO. * inicializa não-zero
PERFORM UNTIL WS-PRECO = 0
DISPLAY "Preço: "
ACCEPT WS-PRECO
IF WS-PRECO > 0
ADD WS-PRECO TO WS-TOTAL
DISPLAY " Subtotal: " WS-TOTAL
END-IF
END-PERFORM.
FECHAR.
COMPUTE WS-IVA = WS-TOTAL * 0.23.
COMPUTE WS-FINAL = WS-TOTAL + WS-IVA.
DISPLAY "---".
DISPLAY "Subtotal: " WS-TOTAL.
DISPLAY "IVA 23%: " WS-IVA.
DISPLAY "TOTAL: " WS-FINAL.