Como construir uma função em Cobol?
Funções são semelhantes a subprogramas e têm por objetivo aumentar o reuso de código. Em alguns casos, o uso de funções no lugar de subprogramas pode deixar o programa chamador mais limpo.
Além de contar com dezenas de funções intrínsecas o Cobol permite também a codificação de nossas próprias funções, chamadas de user defined function.
Neste artigo vamos ver um exemplo bem simples de construção de função para calcular o valor futuro a partir de um valor presente, uma taxa de juros e um período de tempo informados pelo usuário.
A fórmula do valor futuro é:
Onde:
VF = Valor Futuro VP = Valor Presente i = taxa de juros n = períodos
A função recebe VP, i e n como parâmetros e retorna o valor futuro depois de aplicar a fórmula. A função completa está codificada nas linhas abaixo:
identification division. function-id. VF. data division. linkage section. 01 lk-vp pic 9(013)v9(002). 01 lk-i pic 9(003)v9(003). 01 lk-n pic 9(003). 01 lk-vf pic 9(013)v9(003). procedure division using by reference lk-vp, lk-i, lk-n returning lk-vf. principal.compute lk-vf = lk-vp * ((1 + (lk-i / 100)) ** lk-n)
goback.
end function VF.
Uma função deve ser codificada com FUNCTION-ID ao invés de PROGRAM-ID. Tanto os argumentos quanto a variável de retorno (resultado da funcão) devem ser declaradas na LINKAGE-SECTION. Os argumentos são recebidos pelo programa através da cláusula USING da PROCEDURE DIVISION, e a variável de retorno é exportada através da opção RETURNING.
Para chamar essa função devemos declará-la no parágrafo REPOSITORY da ENVIRONMENT DIVISION e em seguida usar um comando de atribuição para mover o resultado da função a uma variável do programa, como podemos ver no código abaixo:
identification division. program-id. gtc005. environment division. configuration section. special-names. decimal-point is comma. repository. function VF. data division. working-storage section. 01 wt-vp pic 9(013)v9(002) value zeros. 01 wt-i pic 9(003)v9(003) value zeros. 01 wt-n pic 9(003) value zeros. 01 wt-vf pic zzz.zzz.zzz.zz9,99 value zeros. procedure division. inicio. display "Informe o valor presente: " accept wt-vp from consoledisplay "Informe a taxa de juros: "
accept wt-i from console
display "Informe o numero de periodos: "
accept wt-n from console
move VF(wt-vp, wt-i, wt-n) to wt-vf
display "Valor Futuro sera' " wt-vf
stop run.
Ao executar esse programa…
[aeisxpad ~/cbl]$ gtc005 Informe o valor presente: 80000 Informe a taxa de juros: 5 Informe o numero de periodos: 10 Valor Futuro sera' 130.311,57