MC102 - Algoritmos e Programação de Computadores

22
MC102 - Algoritmos e Programação de Computadores 16ª Aula – Procedimentos e Funções Amanda Meincke Melo Instituto de Computação/Unicamp 1º Sem/2005

description

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 - PowerPoint PPT Presentation

Transcript of MC102 - Algoritmos e Programação de Computadores

Page 1: MC102 - Algoritmos e Programação de Computadores

MC102 - Algoritmos e Programação de Computadores

16ª Aula – Procedimentos e Funções

Amanda Meincke Melo

Instituto de Computação/Unicamp

1º Sem/2005

Page 2: MC102 - Algoritmos e Programação de Computadores

04/05/2005 2

Roteiro

Relembrando... Declaração, definição e uso Chamada a um procedimento - Ilustração

Escopo LocalPassagem de Parâmetros

Valor vs. Referência Vetores como parâmetros Matrizes como parâmetros

Page 3: MC102 - Algoritmos e Programação de Computadores

04/05/2005 3

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çõesDefiniçã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

Page 4: MC102 - Algoritmos e Programação de Computadores

04/05/2005 4

Relembrando...

Protótipo:tipo NomeDaFuncao (lista de parâmetros);

Definição:tipo NomeDaFuncao (lista de parâmetros) {

declarações e comandos;

}

ChamadaNomeDaFuncao (lista parâmetros);

Na declaração (protótipo e definição), cada parâmetro deve ser precedido por seu tipo de dado

Na declaração (protótipo e definição), cada parâmetro deve ser precedido por seu tipo de dado

Page 5: MC102 - Algoritmos e Programação de Computadores

04/05/2005 5

Chamada a um Procedimento

Instrução

Instrução

Procedimento

Instrução

Instrução

Instrução

Instrução

Instrução

Programa

Procedimento

Page 6: MC102 - Algoritmos e Programação de Computadores

04/05/2005 6

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

Page 7: MC102 - Algoritmos e Programação de Computadores

04/05/2005 7

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)

Page 8: MC102 - Algoritmos e Programação de Computadores

04/05/2005 8

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);

Page 9: MC102 - Algoritmos e Programação de Computadores

04/05/2005 9

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

Page 10: MC102 - Algoritmos e Programação de Computadores

04/05/2005 10

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

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

Page 11: MC102 - Algoritmos e Programação de Computadores

04/05/2005 11

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);

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);

Page 12: MC102 - Algoritmos e Programação de Computadores

04/05/2005 12

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

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

Page 13: MC102 - Algoritmos e Programação de Computadores

04/05/2005 13

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

Suponha que as variáveis a e b tenham sido declaradas como sendo do tipo long int

Page 14: MC102 - Algoritmos e Programação de Computadores

04/05/2005 14

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

As variáveis x e y são ambas do tipo ponteiro para long int

Page 15: MC102 - Algoritmos e Programação de Computadores

04/05/2005 15

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

Page 16: MC102 - Algoritmos e Programação de Computadores

04/05/2005 16

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

Suponha que LIM é uma constante inteira definida no início do programa

Page 17: MC102 - Algoritmos e Programação de Computadores

04/05/2005 17

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);

Page 18: MC102 - Algoritmos e Programação de Computadores

04/05/2005 18

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];}

Page 19: MC102 - Algoritmos e Programação de Computadores

04/05/2005 19

Matrizes como Parâmetros

Matrizes também podem ser passadas como parâmetros

Assim como vetores, são sempre passadas por referência

Page 20: MC102 - Algoritmos e Programação de Computadores

04/05/2005 20

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

Apenas a primeira dimensão da matriz pode ser omitida

Page 21: MC102 - Algoritmos e Programação de Computadores

04/05/2005 21

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”); }}

Page 22: MC102 - Algoritmos e Programação de Computadores

04/05/2005 22

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];}