2. 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.
• 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ínioContradomínio.
Para Fig I temos e para Fig II temos , onde R é o conjunto
dos números reais.
x = 2
y = 2
z = 8z = f(x,y) = x2+y2
f(x) = x2
x = 2 f(x) = 4
x
y
f: R R f: R R R
z
y x
Fig I
Fig II
Domínio Contradomíniof
3. 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)
• 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.
Fig A Fig B Fig C Fig D
4. 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 e
– mas, não é possível , pois h não retorna valor !!!
• Em C, o comando return define o que retorna
• A sintaxe é:
g(f(1,2), 2)
g(h(1,2), 2)
10+f(1,2)
float g(float x, float y)
{
float z = x*x + y*y;
printf(“%f^2 + %f^2 igual a %fn“,x,y,z);
return z;
}
void h(float x, float y)
{
float z = x*x + y*y;
printf(“%f^2 + %f^2 igual a %fn“,x,y,z);
}
tipo_de_retorno nomeFuncao(lista_de_argumentos)
{
corpo da função
}
5. 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 %fn",x,y,z);
return z;
}
int main(void)
{
float z = 1.0;
float w = 2.0;
printf("%fn",10+g(z,w)); /* imprime 15 */
return 0;
}
g é chamada com o primeiro
argumento igual a 1.0 e o
segundo argumento igual a 2.0
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 !
1
2
3
4
6. 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.
• 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).
float dobra(float x)
{
x = 2 * x;
return x;
}
int main(void)
{
float x = 5.0;
printf("%fn", dobra(x)); /* imprime 10.0 */
printf("%fn", x); /* imprime 5.0 */
return 0;
}
são variáveis distintas
o valor de x permanece
inalterado !!
7. 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 !