220 likes | 315 Views
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
E N D
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
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
Na declaração (protótipo e definição), cada parâmetro deve ser precedido por seu tipo de dado Relembrando... • 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);
Chamada a um Procedimento Programa Instrução Procedimento Instrução Instrução Procedimento Instrução Instrução Instrução Instrução
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
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)
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);
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
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
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);
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
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) troca (&a, &b); Suponha que as variáveis a e b tenham sido declaradas como sendo do tipo long int
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
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
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
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);
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]; }
Matrizes como Parâmetros • Matrizes também podem ser passadas como parâmetros • Assim como vetores, são sempre passadas por referência
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
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”); } }
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]; }