MC102 - Algoritmos e Programação de
Computadores
16ª Aula – Procedimentos e Funções
Amanda Meincke Melo
Instituto de Computação/Unicamp
1º Sem/2005
Roteiro
Relembrando...
Declaração, definição e uso
Chamada a um procedimento - Ilustração
Escopo Local
Passagem de Parâmetros
Valor vs. Referência
Vetores como parâmetros
Matrizes como parâmetros
04/05/2005
2
Declaração, definição e uso
Declaração
Quando são definidas as propriedades de uma
função (tipo de retorno e lista de parâmetros):
Protótipos de Funções
Definição de Funções (declaração está implícita)
Definição
Quando uma função é detalhadamente descrita
Uso
Quando uma função é chamada por outra função
04/05/2005
3
Relembrando...
Na declaração (protótipo e
definição), cada parâmetro deve ser
precedido por seu tipo de dado
Protótipo:
tipo NomeDaFuncao (lista de parâmetros);
Definição:
tipo NomeDaFuncao (lista de parâmetros) {
declarações e comandos;
}
Chamada
NomeDaFuncao (lista parâmetros);
04/05/2005
4
Chamada a um Procedimento
Programa
Instrução
Procedimento
Instrução
Instrução
Procedimento
Instrução
Instrução
Instrução
Instrução
04/05/2005
5
Escopo Local
 As variáveis que temos declarado até o momento
são privativas ou locais as suas funções
 Os parâmetros de uma função também são
considerados variáveis locais a ela
 Este tipo de variável passa a existir somente
quando a função é chamada e deixa de existir
somente quando a função termina e, por isso, são
denominadas variáveis automáticas
04/05/2005
6
Escopo Local
 Variáveis automáticas não retêm seus valores de
uma chamada para outra e se não forem
inicializadas contêm um valor desconhecido
Duas ou mais variáveis não podem ser
declaradas com o mesmo nome se fazem parte
da mesma função, mas elas podem ter o
mesmo nome se forem declaradas em funções
diferentes (neste caso farão referência a
endereços de memória distintos, ou seja, são
variáveis diferentes)
04/05/2005
7
Passagem de Parâmetros
long int somatorio (long int m, long int n);
double produtorio (long int m, long int n);
double potencia (float x, int y);
double fatorial (int n);
double Pn (int n);
double Ank (int n, int k);
double Cnk (int n, int k);
04/05/2005
8
Passagem de Parâmetros
Passagem de parâmetros por valor
As funções cujos protótipos foram apresentados na
transparência anterior são funções que recebem
valores como parâmetros
Estes valores podem ser valores constantes,
conteúdos de variáveis, resultados de expressões
em geral
É importante que estes valores estejam de acordo
com o tipo declarado para o parâmetro
correspondente
04/05/2005
9
Passagem de Parâmetros
Considere os trechos de código a seguir:
soma = somatorio (0, 1);
soma = somatorio (a, b);
produto = produtorio (somatorio (a,b), a*b);
printf (“%d”, somatorio (a, 2*b));
Suponha que as variáveis soma, a e b tenham
sido declaradas como sendo do tipo long int
Suponha que a variável produto tenha sido
declarada como double
04/05/2005
10
Exemplo 1
/* Uma definição para a função somatório */
long int somatorio (long int m, long int n) {
long int i, soma = 0;
for (i = m; i <= n; i++)
soma += i;
return (soma);
As variáveis m e n, ambas parâmetros do
}
tipo long int, são variáveis que pertencem
ao escopo da função:
long int somatorio (long int m, long int n);
04/05/2005
11
Exemplo 1
/* Outra definição para a função somatório */
long int somatorio (long int m, long int n) {
long int soma = 0;
while (m <= n)
soma += m++;
return (soma);
}
Alterações na variável m, local à função
long int somatorio (long int m, long int n);
são percebidas apenas no escopo da função
04/05/2005
12
Passagem de Parâmetros
void troca (long int *x, long int *y);
Passagem de parâmetros por referência
O protótipo acima, indica que o procedimento deve
receber endereços para variáveis do tipo long int
como parâmetros
O trecho a seguir ilustra o uso desse procedimento:
if (a > b)
Suponha que as variáveis a e b
troca (&a, &b);
tenham sido declaradas como
sendo do tipo long int
04/05/2005
13
Exemplo 2
/* Definição da função cujo protótipo foi exibido na
transparência anterior */
void troca (long int *x, long int *y) {
long int aux;
aux = *x; /* variável aux recebe conteúdo do endereço
apontado por x */
*x = *y; /* endereço apontado por x recebe o conteúdo
do endereço apontado por y */
*y = aux; /* endereço apontado por y recebe o conteúdo
da variável aux */
}
As variáveis x e y são ambas do
tipo ponteiro para long int
04/05/2005
14
Vetores como Parâmetros
Vetores também podem ser passados
como parâmetros para funções, mas são
sempre passados por referência
Implicação: ao alterar valores dos elementos
de um vetor passado como parâmetro, as
alterações são “percebidas” no escopo da
função chamadora
04/05/2005
15
Exemplo 3 (Protótipos)
Considere os protótipos a seguir:
void mostra_vetor (int v[LIM], int n);
void multiplica_escalar (int v[LIM], int n, int e);
Suponha que LIM é uma constante
inteira definida no início do programa
04/05/2005
16
Exemplo 3 (Protótipos)
Também são válidos os protótipos:
void mostra_vetor (int v[], int n);
void multiplica_escalar (int v[], int n, int e);
Ou ainda:
void mostra_vetor (int *v, int n);
void multiplica_escalar (int *v, int n, int e);
04/05/2005
17
Exemplo 3 (Definições)
void mostra_vetor (int v[LIM], int n) {
int i;
for (i = 0; i < n; i++)
printf (“%d”, v[i]);
}
void multiplica_escalar (int v[], int n, int e) {
int i;
for (i = 0; i < n; i++)
v[i] = e*v[i];
}
04/05/2005
18
Matrizes como Parâmetros
Matrizes também podem ser passadas
como parâmetros
Assim como vetores, são sempre
passadas por referência
04/05/2005
19
Exemplo 4 (Protótipos)
Considere os protótipos a seguir:
void mostra_matriz (int m[LIM][LIM], int i, int j);
void multiplica_escalarM (int m[LIM][LIM], int i, int j, int e);
Também são válidos os protótipos:
void mostra_matriz (int m[][LIM], int i, int j);
void multiplica_escalarM (int m[][LIM], int i, int j, int e);
Apenas a primeira dimensão da
matriz pode ser omitida
04/05/2005
20
Exemplo 4 (Definições)
void mostra_matriz (int m[][LIM], int i, int j) {
int auxi, auxj;
for (auxi = 0; auxi < i; auxi++) {
for (auxj = 0; auxj < j; auxj++)
printf (“%d ”, m[auxi][auxj]);
printf (“\n”);
}
}
04/05/2005
21
Exemplo 4 (Definições)
void multiplica_escalarM (int m[LIM][LIM], int i, int j, int e) {
int auxi, auxj;
for (auxi = 0; auxi < i; auxi++)
for (auxj = 0; auxj < j; auxj++)
m[auxi][auxj] = e*m[auxi][auxj];
}
04/05/2005
22
Download

Funções - Instituto de Computação