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