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 console
display "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
