Programas complicados e extensos podem se tornar bem mais simples de ler e manter se usarmos o conceito de funções. Portanto, quer esteja aprendendo a programar, quer esteja seguindo a série de artigos sobre
Octave, certamente achará muito útil o uso de funções em programação.
No último caso, se ainda não o fez, leia os primeiros artigos da série (veja os links em
Programação.
De forma simples, funções podem ser vistas como caixas pretas, onde colocamos algo. A caixa então nos devolve outra coisa como resposta. Compreenda que, para usar a função, não precisamos saber como ela trabalha internamente. O importante é saber o que a função nos devolve, sem se preocupar como ela faz isso. É como uma caixa "mágica", onde damos a entrada e ela fornece uma saída.
Este tipo de artifício é muito útil, principalmente quando temos tarefas que serão repetidas ao longo de um programa, ou ainda em vários programas. É aí que entram as funções. Basicamente escrevemos o trecho do código que será usado, e apenas fazemos uma chamada desse trecho em nosso programa "principal". Em Octave, a definição de uma função tem a seguinte forma:
function NOME
código
endfunction
O código incluído dentro de uma função é a parte mais importante, pois é o motivo de sua existência. Por exemplo, a função abaixo escreve a string "Viva O
Linux":
function VOL
printf ("Viva O Linux\n");
endfuction
O comando printf irá exibir na tela a expressão "Viva O Linux". Depois que escrevemos a função, podemos executá-la simplesmente por usar seu nome.
Como falamos no começo do artigo, podemos passar informações para uma função e a resposta dada será dependente de tais informações. Chamamos de parâmetro cada dado que entregamos para a função, e a sintaxe é a seguinte:
function NOME (ARGUMENTOS)
código
endfunction
Os argumentos, ou seja, os dados que passaremos, devem ser separados por vírgulas. Dentro do código da função, usamos os mesmos nomes dos argumentos da definição. Quando chamamos a função para a execução, os valores dos argumentos dados passam a ser usados. Um exemplo certamente esclarece melhor. Vejamos uma adaptação da função anterior.
function VOL (texto)
printf ("%s\n",texto);
endfuction
Na maioria das vezes, como já indicamos, o que realmente queremos é produzir informação a partir das funções. Ou seja, quando chamamos uma função desejamos que ela nos retorne algum valor. Nos exemplos acima isso não foi necessário. A sintaxe no Octave para uma função retornar valor, não é muito bonito. Outras linguagens são mais "eficientes". No entanto, a idéia é sempre a mesma. Veja:
function VALOR = NOME (ARGUMENTOS)
CÓDIGO
endfunction
No trecho acima você deve ter notado que a sintaxe é quase igual ao caso anterior. O acréscimo se deve ao termo VALOR =. No "CÓDIGO" a ser executado, usaremos o termo VALOR para definir a informação retornada pela função. Lembre que as variáveis usadas dentro da função são variáveis locais. Variáveis locais são acessadas apenas de dentro da função, e o restante do programa não consegue "ver" essas variáveis. Abaixo, um exemplo.
function VALOR = soma (a,b)
VALOR = a + b;
endfunction
Note que dentro da função o termo VALOR é bem definido, e é esse o valor que a função entrega de volta ao programa. Só um lembrete: VALOR deve ser definida antes do fim da função, ou o Octave retornará uma mensagem de erro. Por exemplo, no caso abaixo a função pode terminar sem definir o termo ret-var.
function VALOR = soma (a,b)
if (a<100)
VALOR = a + b;
endif
endfunction
O código acima é passível de erro, pois se a variável a tiver valor maior ou igual a 100, o código dentro do if não será executado, e VALOR não será definida - a consequência é um erro de execução.