A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções.

Apresentações semelhantes


Apresentação em tema: "Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções."— Transcrição da apresentação:

1 Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções

2 Motivação: Dividir tarefas grandes em tarefas menores: –Facilita manutenção do código. –As partes podem ser testadas separadamente. Reaproveitar código existente: –Evitar a reescrita de um mesmo código repetidas vezes. –Integração com códigos de outros programadores. Esconder detalhes: –Permite uma visão de mais alto nível. –Viabiliza programas mais complexos.

3 Funções Exemplo: –Calcular o número de combinações de m elementos tomados p a p (p<=m), não importando a ordem dos elementos.

4 Funções Definição: –Uma função é uma unidade de código de programa autônoma desenhada para cumprir uma tarefa particular (ex: printf, sqrt, strcmp ). Sintaxe: tipo nome_da_função(lista de argumentos){ Declarações de variáveis locais; Bloco de comandos; }

5 Funções Exemplo: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

6 Funções Exemplo: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Corpo da função

7 Funções Exemplo: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Lista de argumentos (parâmetros)

8 Funções Exemplo: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Chamada da função

9 Chamando Funções comando1; comando2; Chamada da função; comando3; comando4; comandoA; comandoB; comandoC; comandoD; Corpo da Função

10 Chamando Funções Chamada a uma função: –Aloca espaço para todas variáveis locais declaradas na função. –Inicializa os parâmetros com os valores passados para a função. –Desvia a execução do código para o corpo da função. Após execução: –Desaloca memória das variávies locais. –Retorna para a próxima instrução após a chamada.

11 Variáveis locais Variáveis declaradas dentro de uma função e argumentos são chamados de variáveis locais. –Existem somente durante a execução da função. –Podem ser acessadas apenas no corpo da função onde foram declaradas. OBS: Variáveis locais com mesmo nome declaradas em funções diferentes são variáveis distintas.

12 Variáveis locais Variáveis declaradas dentro de uma função e argumentos são chamados de variáveis locais. –Existem somente durante a execução da função. –Podem ser acessadas apenas no corpo da função onde foram declaradas. OBS: Variáveis locais com mesmo nome declaradas em funções diferentes são variáveis distintas. #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } Possui 3 variáveis locais: int a, int b, int q

13 Valor de Retorno Funções podem retornar um valor (ex: sqrt retorna a raiz quadrada de um número). O valor retornado deve ser compatível com o tipo da função. O valor é retornado através do comando return que causa a saída imediata da função. Funções que não retornam nada são chamadas de procedimentos e em C são implementadas como sendo do tipo void.

14 Exemplo de Execução: O programa inicia a execução na função principal ( main ). #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

15 Exemplo de Execução: É alocado espaço para as variáveis locais da função principal ( main ). #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r

16 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r A função resto é chamada.

17 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r É alocado espaço para as variáveis locais da função. ? int a ? int b ? int q

18 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r Os parâmetros são inicializados com os valores passados para a função. 5 int a 3 int b ? int q

19 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r A variável q recebe o resultado da divisão inteira. 5 int a 3 int b 1 int q

20 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } ? int r O resultado 2 da expressão (a-q*b) é calculado e retornado pela função. 5 int a 3 int b 1 int q

21 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } 2 int r A variável r recebe o valor de retorno da função e as variáveis locais da função são destruídas. 5 int a 3 int b 1 int q

22 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } 2 int r O conteúdo da variável r é impresso na saída padrão.

23 Exemplo de Execução: #include int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } 2 int r A função principal retorna 0 e a execução do programa é encerrada. As variáveis locais da função principal são destruídas.

24 Passando variáveis como argumentos Quando passamos variáveis a uma função, os seus conteúdos são copiados (atribuídos) para variáveis locais (parâmetros) da função. Alterações nos parâmetros dentro da função não alteram os valores das variáveis que foram passados. Ex: A saída do programa acima será 1 e não 3. void teste(int x){ x = 3; } int main(){ int x = 1; teste(x); printf("%d", x); return 0; }

25 Exemplo 2: Problema: –Calcular o fatorial de um número. Solução: double fatorial(int x){ double fat = 1.0; while(x>1){ fat = fat*x; x--; } return fat; }

26 Problema: Calcular o número de combinações de m elementos tomados p a p (p<=m), não importando a ordem dos elementos. int binomial(int m, int p){ int b=0; if(m>=0 && p>=0 && p<=m) b = (int)(fatorial(m)/(fatorial(p)*fatorial(m-p))); return b; } Podemos resolver facilmente usando a função do problema anterior:

27 Exemplo com Estruturas: #include struct Complexo{ float real; float imag; }; struct Complexo LeComplexo(){ struct Complexo A; printf("Digite a parte real: "); scanf("%f",&A.real); printf("Digite a parte imaginaria: "); scanf("%f",&A.imag); return A; } void PrintComplexo(struct Complexo A){ printf("%.2f + (%.2f)*i\n",A.real,A.imag); } Faça um programa que lê dois números complexos e testa se eles são iguais:

28 Exemplo com Estruturas: Faça um programa que lê dois números complexos e testa se eles são iguais: (continuação) int IgualdadeComplexos(struct Complexo A, struct Complexo B){ return (A.real==B.real && A.imag==B.imag); } int main(){ struct Complexo A; struct Complexo B; A = LeComplexo(); B = LeComplexo(); if(IgualdadeComplexos(A,B)) printf("Números iguais.\n"); else printf("Números distintos.\n"); return 0; }

29 Vetores como argumentos de funções Quando o nome de uma variável simples (ex: int, estrutura) é passado na chamada da função, é gerada uma cópia do conteúdo da variável fornecida em uma variável local da função. Esse processo é conhecido como chamada por valor. –Ex: Todos exemplos até agora usaram chamadas por valor. Vetores podem conter grandes quantidades de dados, logo copiar todos dados de um vetor em uma chamada por valor é ineficiente. Em C, vetores são passados por referência de modo que existe uma única cópia do vetor (a original). É passado apenas o endereço do vetor para a função.

30 Exemplo com Vetores: Faça uma função que copia uma string em outra. #include #define LIM 300 void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){ char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A); printf("A: %s\n",A); printf("B: %s\n",B); return 0; }

31 Exemplo com Vetores: Faça uma função que copia uma string em outra. #include #define LIM 300 void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){ char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A); printf("A: %s\n",A); printf("B: %s\n",B); return 0; } Os tamanhos dos vetores podem ser omitidos

32 Exemplo com Vetores: Faça uma função que copia uma string em outra. #include #define LIM 300 void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){ char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A); printf("A: %s\n",A); printf("B: %s\n",B); return 0; } O nome de um vetor sem o colchetes representa o endereço do vetor que é passado para a função.

33 Exemplo com Vetores: Faça uma função que copia uma string em outra. #include #define LIM 300 void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){ char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A); printf("A: %s\n",A); printf("B: %s\n",B); return 0; } Alterações nos elementos dos vetores possuem efeito externo a função, pois atuam sobre o vetor original (passagem por referência).

34 Matrizes são vetores de vetores e logo também são passadas por referência. A função abaixo embaralha os dados de uma matriz: Exemplo com Matrizes: #include #define LIM 100 void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp; srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; }

35 Matrizes são vetores de vetores e logo também são passadas por referência. A função abaixo embaralha os dados de uma matriz: Exemplo com Matrizes: #include #define LIM 100 void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp; srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } Somente a primeira dimensão pode ser omitida.

36 Matrizes são vetores de vetores e logo também são passadas por referência. A função abaixo embaralha os dados de uma matriz: Exemplo com Matrizes: #include #define LIM 100 void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp; srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } Número de linhas e colunas efetivamente em uso.

37 Matrizes são vetores de vetores e logo também são passadas por referência. A função abaixo embaralha os dados de uma matriz: Exemplo com Matrizes: #include #define LIM 100 void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp; srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } Troca elementos de cada posição i, j por elementos de posição aleatória y, x.

38 A função principal abaixo pode ser usada para testar a função que embaralha os dados de uma matriz: Exemplo com Matrizes: int main(){ int i,j; int A[LIM][LIM]={{1,2,3}, {4,5,6}, {7,8,9}}; EmbaralhaMatriz(A, 3, 3); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf(" %4d",A[i][j]); printf("\n"); } return 0; }


Carregar ppt "Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções."

Apresentações semelhantes


Anúncios Google