COBOL - Comando COMPUTE - www.cadcobol.com.br


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

Precisão nos cálculos de resultados intermediários

Compute
  • Se uma instrução aritmética for suficiente, use-a; se for necessário mais de uma, use o comando COMPUTE

  • A instrução COMPUTE usa símbolos em vez de comandos aritméticos.

  • A principal vantagem do comando COMPUTE é que pode realizar várias operações aritméticas com uma única instrução, conforme quadro e exemplos abaixo:

  • A instrução COMPUTE atribui o valor de uma expressão aritmética de um ou mais itens de dados.
    Ele permite que você combine operações aritméticas sem as restrições na recepção de itens de dados que as regras para as declarações ADD, SUBTRACT, MULTIPLY e DIVIDE impõem.
    Quando você precisa combinar operações aritméticas, usar a instrução COMPUTE pode ser mais eficiente do que escrever uma série de declarações aritméticas separadas.

Símbolos usados em uma instrução COMPUTE

Símbolo Significado
+ ADD
- SUBTRACT
* MULTIPLY
/ DIVIDE
** exponenciação (não há comando correspondente no COBOL)

Formato geral:

Sintaxe do comando COMPUTE

identifier-1
Deve nomear um item numérico elementar ou um item editado numérico elementar.
Pode nomear um item de dados elementar de ponto flutuante.

Se o identifier-1 ou o resultado da expressão aritmética (ou ambos) forem campos de data, consulte Storing arithmetic results that involve date fields para obter detalhes sobre como o resultado é armazenado no identifier-1.
Se um campo de data do último ano for especificado como identifier-1, o resultado da expressão aritmética deverá ser uma não-data.

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 identifier-1.

Uma expressão aritmética que consiste em um único identificador, função numérica ou literal permite que o usuário defina o valor dos itens de dados que são referenciados pelo identifier-1 igual ao valor desse identificador, função ou literal.

Um campo de data do último ano não deve ser especificado na expressão aritmética.

ROUNDED phrase
Para uma discussão da frase ROUNDED, consulte ROUNDED.

SIZE ERROR phrases
Para uma discussão da frase SIZE ERROR, consulte SIZE ERROR.

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 COMPUTE condicional seja aninhada em outra instrução condicional.
END-COMPUTE também pode ser usado com uma instrução imperativa COMPUTE.

Exemplos:

Usando COMPUTE Usando ADD, SUBTRACT, DIVIDE e MULTIPLY
COMPUTE VENDAS-DIARIAS = QUANTIDADE * VALOR-UNITARIO / 5 MULTIPLY QUANTIDADE BY VALOR-UNITARIO GIVING VENDAS-DIARIAS
DIVIDE 5 INTO VENDAS-DIARIAS
COMPUTE VALOR-1 = VALOR-1 + 1 ADD 1 TO VALOR-1
COMPUTE VALOR-3 = VALOR-1 - VALOR-2 SUBTRACT VALOR-2 FROM VALOR-1 GIVING VALOR-3
COMPUTE VALOR-2 ROUNDED = VALOR-1 / 5 DIVIDE VALOR-1 BY 5 GIVING VALOR-2 ROUNDED
COMPUTE VALOR-3 = VALOR-1 * VALOR-2 MULTIPLY VALOR-1 BY VALOR-2 GIVING VALOR-3
COMPUTE VALOR-3 = VALOR-1 + VALOR-2 + 50 ADD VALOR-1 VALOR-2 50 GIVING VALOR-3
COMPUTE VALOR-1 = VALOR-1 - 1 SUBTRACT 1 FROM VALOR-1
COMPUTE VALOR-1 = VALOR-1 + 1
COMPUTE VALOR-2 = VALOR-2 + 1
COMPUTE VALOR-3 = VALOR-3 + 1
ADD 1 TO VALOR-1 VALOR-2 VALOR-3
COMPUTE VALOR-1 VALOR-2 VALOR-3 = 2 * 3 MULTIPLY 2 BY 3 GIVING VALOR-1
MULTIPLY 2 BY 3 GIVING VALOR-2
MULTIPLY 2 BY 3 GIVING VALOR-3


O uso das opções ROUNDED e ON SIZE ERROR em uma instrução COMPUTE.
Para arrendondar o resultado de um comando COMPUTE, usamos a opção ROUNDED diretamente após o campo receptor.

Se for necessário verificar uma condição de erro, devemos usar a cláusula ON SIZE ERROR como a última instrução.

Segundo exemplo:

05 VALOR-TRUNCADO PIC 9(002) VALUE ZEROES.
COMPUTE VALOR-TRUNCADO = 502 - 2
O resultado desta condição seria de OVERFLOW (o valor obtido é maior que o tamanho da PICTURE definida para o campo receptor) no campo VALOR-TRUNCADO, pois o valor retornado é 500 (quinhentos).
Haveria um truncamento do dígito mais significativo, a posição das centenas, e o valor do campo VALOR-TRUNCADO será 00 (zero zero).

Para nossa proteção contra esse tipo de truncamento, usamos a opção ON SIZE ERROR da seguinte maneira:
          COMPUTE VALOR-TRUNCADO = 502 - 2
                  ON SIZE ERROR PERFORM 900-ERRO-CALCULO
          END-COMPUTE.
Na rotina 900-ERRO-CALCULO codificamos as condições de erros necessárias.


Exemplos

Atribua à variável X o valor de A + 6.

    COMPUTE X = A + 6;

Atribua à variável MYCODE o valor da variável do z/OS Debugger% PATHCODE + 1.

    COMPUTE MYCODE = %PATHCODE + 1;

Atribua à variável XX o resultado da expressão (A + E (1)) / C * 2.

    COMPUTE XX = (A + E(1)) / C * 2;

Você também pode usar elementos de tabela em tais atribuições, conforme mostrado no exemplo a seguir.

    COMPUTE ITM-2(1,2) = (A + 10) / E(2);