Menu

COBOL - Computação de Declaração

A instrução COMPUTE atribui o valor de uma expressão aritmética a um ou mais itens de dados.

As operações aritméticas podem ser combinadas sem as restrições de recebimento de itens de dados impostas pelas regras para as instruções ADD, SUBTRACT, MULTIPLY e DIVIDE com a instrução COMPUTE.

Quando as operações aritméticas são combinadas, a instrução COMPUTE pode ser mais eficiente do que as instruções aritméticas separadas escritas em série.

Syntax:

COMPUTE identifier-1 [ROUNDED]  =[EQUAL] arithmetic expression
	[ON SIZE ERROR imperative-statement-1]
        [NOT ON SIZE ERROR imperative-statement-2]
[END-COMPUTE]

identificador-1
Deve nomear um item numérico elementar ou um item numérico editado elementar.

Pode nomear um item de dados de ponto flutuante elementar.

arithmetic-expression
Pode ser qualquer expressão aritmética, conforme definido em Expressões aritméticas.

Quando a instrução COMPUTE é executada, o valor da expressão aritmética é calculado e armazenado como o novo valor de cada item de dados referenciado pelo identificador-1.
Frases opcionais na operação de computação:

ROUNDED phrase
ROUNDED Com a opção ROUNDED, o computador sempre arredondará o resultado para a especificação da cláusula PICTURE do campo receptor. Geralmente é codificado após o campo a ser arredondado.

SIZE ERROR phrases
Se esta for codificada com qualquer operação que terminou com SIZE error não será executada, mas a instrução que segue ON SIZE ERROR será executada.

NOT ON SIZE ERROR phrases
Isto é o oposto de SIZE ERROR. Se isso for codificado com qualquer operação que não tenha terminado com erro SIZE, a instrução a seguir ON SIZE ERROR será executada.

END-COMPUTE phrase
Esse terminador de escopo explícito serve para delimitar o escopo da instrução COMPUTE. END-COMPUTE permite que uma instrução condicional COMPUTE seja aninhada em outra instrução condicional. END-COMPUTE também pode ser usado com uma instrução COMPUTE imperativa.
Tipos:
  • Se apenas uma operação matemática for executada, use a instrução que executa essa operação (ADD, SUBTRACT, MULTIPLY ou DIVIDE). Reserve a instrução COMPUTE para fórmulas ou exponenciação, pois ela não possui uma instrução separada associada a ela.

  • Os campos de recebimento podem ser campos numéricos ou editados numéricos.

  • Use a cláusula SIZE ERROR para detectar estouro de campo no campo de recebimento.

  • Em todos os formatos, os resultados matematicamente corretos são calculados, mas se o campo receptor for muito curto na parte inteira ou decimal, o resultado será truncado, o inteiro à esquerda e o decimal à direita.

    Incluir a frase ROUNDED fará com que o campo de resposta seja arredondado em vez de truncado. Roundig é sempre feito na parte menos significativa da resposta.

Exemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. TSTCOMPT.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-N1 PIC 9(3) VALUE 5.
   01 WS-N2 PIC 9(4) VALUE 7.
   01 WS-N3 PIC 9(4) VALUE 8.
   01 WS-NA PIC 9(3) VALUE 80.
   01 WS-NB PIC 9(3) VALUE 20.
   01 WS-NC PIC 9(3).

PROCEDURE DIVISION.
   COMPUTE WS-NC= (WS-N1 * WS-N2) - (WS-NA / WS-NB) + WS-N3.
   DISPLAY "WS-NUM1     : " WS-N1
   DISPLAY "WS-NUM2     : " WS-N2
   DISPLAY "WS-NUM3     : " WS-N3
   DISPLAY "WS-NUMA     : " WS-NA
   DISPLAY "WS-NUMB     : " WS-NB
   DISPLAY "Result of compute is     : " WS-NC
   STOP RUN.

Saída:

WS-NUM1     : 005
WS-NUM2     : 0007
WS-NUM3     : 0008
WS-NUMA     : 080
WS-NUMB     : 020
Result of compute is     : 039