domingo, 9 de abril de 2017

PICTURE SV9(n) - Números após a vírgula

Olá!

Ao trabalhar com variados cálculos há o momento que ocorre a necessidade de utilizar/manipular somente os valores que estão após a vírgula. Exemplo, verificar se o resultado de um cálculo vai gerar um número inteiro ou não, algo simples que pode ser feito de diversas formas.

E uma das maneiras de manipular esses valores, é realizar a definição de um item de grupo composto de duas variáveis, uma para armazenar valores inteiros e a outra para os valores após a vírgula. Ou seja, se o resultado de um cálculo está na variável:

       77  RESULTADO-CALCULO            PIC S9(005)V9(02) VALUE ZEROS.

Temos que realizar a definição de um item de grupo, conforme:

       01  RESULTADO.
           03 RESULTADO-CALC-PARTE-1    PIC S9(005) VALUE ZEROS.
           03 RESULTADO-CALC-PARTE-2    PIC  9(002) VALUE ZEROS.

Assim, se o valor de RESULTADO-CALCULO = 123,45 for movimentado para RESULTADO, respectivamente o valor de cada parte é:
RESULTADO-CALC-PARTE-1 = 123
RESULTADO-CALC-PARTE-2 = 45

Ok, o valor após a vírgula está separado e pronto para ser manipulado, é até um processo bem simples. Entretanto, tendo o objetivo de trabalhar especificamente com os números após a vírgula, este processo de criar um item de grupo não é o melhor.
Pois, veja a quantidade de passos realizados para chegar até o ponto do valor separado.
  1. Criar uma variável para armazenar o valor
  2. Criar um item de grupo para separar o valor em duas partes
  3. Atribuir valor a variável
  4. Movimentar o valor da variável para o item de grupo
Como melhorar?


  • PIC SV9(n)
A picture SV9(n) é exatamente para armazenar somente os números após a vírgula. Assim, valores decimais atribuídos a uma variável declarada com está definição terá o valor inteiro desprezado e considerado somente os números após a vírgula.

Exemplo:
       77  RESULTADO-CALCULO            PIC SV9(002) VALUE ZEROS.
      *
      * -- Divisao de 15 / 4 = 3,75
           DIVIDE 15
               BY 4
           GIVING RESULTADO-CALCULO
           END-DIVIDE

O valor da resposta da divisão acima é atribuído a variável RESULTADO-CALCULO, mas note que a declaração dessa variável é com SV9(002), deste modo é desprezado a parte inteira da resposta da divisão e somente guardado os valores após a vírgula, assim o valor final de RESULTADO-CALCULO = 75.

Para mais exemplos veja o código do programa a seguir:
(no final do post há o link para ver o código completo).

  • Declaração das variáveis:
      *
      *----------------------------------------------------------------*
       LOCAL-STORAGE                    SECTION.
      *----------------------------------------------------------------*
      *
      * -- Armazenar o resultado da operacao matematica
       77  RESULTADO                    PIC S9(004)V9(04) VALUE ZEROS.
      *
      * -- Item de grupo para separar o valor do resultado
       01  TESTE.
           03 TESTE-PARTE-1             PIC S9(004) VALUE ZEROS.
           03 TESTE-PARTE-2             PIC S9(004) VALUE ZEROS.
      *
      * -- Armazenar somente os numeros apos a virgula
       77  TESTE-SV9                    PIC SV9(04) VALUE ZEROS.

  • Comandos executados:
      *
           DISPLAY 'Valores iniciais das variáveis: '
           DISPLAY 'RESULTADO.: ' RESULTADO
           DISPLAY 'TESTE-SV9.: ' TESTE-SV9
           DISPLAY '.'
      *
      * -- Divisao de 9 / 4 = 2,25
           DIVIDE 9
               BY 4
           GIVING RESULTADO
           END-DIVIDE
      *
           DISPLAY 'Resultado de 9 / 4 = ' RESULTADO
           DISPLAY '.'
      *
      * -- Com item de grupo
           MOVE RESULTADO               TO TESTE
           DISPLAY 'O resultado separado no item de grupo'
           DISPLAY 'TESTE-PARTE-1.: ' TESTE-PARTE-1
           DISPLAY 'TESTE-PARTE-2.: ' TESTE-PARTE-2
           DISPLAY '.'.
      *
      * -- Somente os valores apos a virgula com SV9
           MOVE RESULTADO               TO TESTE-SV9
           DISPLAY 'Os números após a vírgula: ' TESTE-SV9
           DISPLAY '.'.
           DISPLAY '.'.
      *
      * -- Divisao de 15 / 4 = 3,75
           MOVE ZEROS                   TO TESTE-SV9
           DIVIDE 15
               BY 4
           GIVING TESTE-SV9
           END-DIVIDE
           DISPLAY 'Os números após a vírgula de 15 / 4 = ' TESTE-SV9
           DISPLAY '.'.
           DISPLAY '.'.

  • Resposta da execução do programa:
FELIPE BARBOSA FERREIRA
Resposta da execução do programa SV9(n)















Observe que com a utilização dessa Picture temos que ser precisos quanto a relação de casas numéricas a serem trabalhadas. Pois, veja que os zeros estão sendo posicionados a direita, fazendo que valor 25 ou 75 dos exemplos fique na unidade de milhar.

Com a utilização da PIC SV9(n) e tendo objetivo de trabalhar especificamente com os números após a vírgula, foi necessário de somente dois passos:

  1. Criar uma variável com a picture SV9(n)
  2. Realizar a operação para atribuir valor a variável
Note, que mesmo sendo exemplos de complexidade simples foi reduzido pela metade a quantidade de passos para obter o valor após a vírgula separado em uma variável.


Para Ctrl + C do código acesse aqui.
Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

Nenhum comentário:

Postar um comentário