Introdução a Funções
Funções Matemáticas função é uma relação de um ou vários valores de argumentos de entrada em um ÚNICO resultado de saída. y z Fig I f(x) = x 2 x = 2 f(x) = 4 x z = f(x,y) = x 2 +y 2 x = 2 y = 2 z = 8 O conjunto de todos os valores de entrada de uma função é chamado de DOMÍNIO da função. O conjunto de todos os resultados é chamado de IMAGEM da função. Normalmente a IMAGEM é um subconjunto de um conjunto de resultados possíveis chamado de CONTRADOMÍNIO. A notação é: f: Domínio Contradomínio. Para Fig I temos f: R R e para Fig II temos f: R R R, onde R é o conjunto dos números reais. Domínio Fig II f y Contradomínio x
Funções e Procedimentos Uma função matemática lembra uma máquina que recebe valores para os seus argumentos de entrada, processa-os e retorna um valor como saída (Figs A e B). Em computação nós estendemos este conceito permitindo que estas máquinas produzam efeitos colaterais (como escrever uma mensagem no papel) (Fig. C). Eventualmente, até admitimos que a máquina não retorna valor (Fig. D) Fig A Fig B Fig C Fig D Neste caso, podemos dizer que as máquinas deixam de ser equivalentes a funções matemáticas (i.e. deixam de ser FUNCIONAIS) e passam a ser PROCEDIMENTAIS, no sentido de que seguem um procedimento, claro, sequencial e com possíveis efeitos colaterais que afetam o ambiente.
Funções e Procedimentos Em C, um procedimento (retornando ou não valores) continua sendo chamado de função (function). Funções que não retornam valor não podem ser usadas em expressões ou como argumentos de outra função. Por exemplo, é possível termos g(f(1,2), 2) e g(h(1,2), 2) mas, não é possível, pois h não retorna valor!!! Em C, o comando return define o que retorna float g(float x, float y) float z = x*x + y*y; printf( %f^2 + %f^2 igual a %f\n,x,y,z); return z; void h(float x, float y) float z = x*x + y*y; printf( %f^2 + %f^2 igual a %f\n,x,y,z); 10+f(1,2) A sintaxe é: tipo_de_retorno nomefuncao(lista_de_argumentos) corpo da função
Usando Funções Funções em C recebem VALORES (e não nomes de variáveis) e retornam VALORES. float g(float x, float y) float z = x*x + y*y; printf("%f^2 + %f^2 igual a %f\n",x,y,z); return z; int main(void) float z = 1.0; float w = 2.0; printf("%f\n",10+g(z,w)); /* imprime 15 */ return 0; 4 3 Numa área local e isolada de memória, x recebe o valor de 1.0 e y recebe o valor de 2.0 e g retorna o valor calculado de 5.0. Ao terminar, esta memória local é totalmente apagada! 2 g é chamada com o primeiro argumento igual a 1.0 e o segundo argumento igual a 2.0 1
Usando Funções Como são valores que são passados para a função, ela desconhece as variáveis que continham estes valores. Os nomes podem coincidir, mas são variáveis distintas. float dobra(float x) x = 2 * x; return x; são variáveis distintas int main(void) float x = 5.0; printf("%f\n", dobra(x)); /* imprime 10.0 */ printf("%f\n", x); /* imprime 5.0 */ return 0; o valor de x permanece inalterado!! Há uma maneira de fazer com que uma função em C altere o valor de uma variável que pertence ao código que a chamou. Este efeito colateral a torna um PROCEDIMENTO. Isto será visto mais adiante. A possibilidade de alterar valores de variáveis que pertencem a outras funções, torna as funções em C muito poderosas, mas também requerem atenção redobrada (pois alteram o ambiente).
Considerações Importantes Algumas linguagens de programação, chamadas LINGUAGENS FUNCIONAIS, como Lisp e Haskell, consideram o ato de computar como sendo o ato de avaliar funções matemáticas, sem que o estado do mundo (e.g. variáveis) seja alterado. Lisp, por exemplo, é uma linguagem que pode ser entendida como sendo simplesmente expressões dentro de expressões que sempre retornam valor. Em oposição, temos linguagens de programação denominadas de Linguagens Procedimentais (tais como C, C++ e Java), que definem PROCEDIMENTOS, isto é: comandos imperativos em uma ordem específica que podem alterar o estado do mundo (e.g. mudanças de valores de variáveis ou efeitos colaterais de uma maneira geral). Porém, todas as linguagens permitem uma fuga para o estilo que lhe é oposto por natureza. Por exemplo, podemos escrever procedimentos em Lisp e funções matemáticas em C. Procedimentos são instrumentos poderosos, mas devem ser usados com cautela, porque as mudanças do estado do mundo podem ser sutis, silenciosas, e erros catastróficos podem passar desapercebidos.... Programar é uma arte poderosa e iniciantes são aprendizes de feiticeiro que devem treinar bastante todas as técnicas!