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

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

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

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

Algoritmos e Programação MC102

Prof. Paulo MirandaIC-UNICAMP

Aula 15Funções

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

Funções

• 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.

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

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.

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

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;

}

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

Funções

• Exemplo:#include <stdio.h>

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

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

Funções

• Exemplo:#include <stdio.h>

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

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

Funções

• Exemplo:#include <stdio.h>

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)

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

Funções

• Exemplo:#include <stdio.h>

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

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

Chamando Funções

comando1;

comando2;

Chamada da função;

comando3;

comando4;

comandoA;

comandoB;

comandoC;

comandoD;

Corpo da Função

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

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.

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

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.

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

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 <stdio.h>

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

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

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.

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

Exemplo de Execução:

• O programa inicia a execução na função principal (main).

#include <stdio.h>

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

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

Exemplo de Execução:

• É alocado espaço para as variáveis locais da função principal (main).

#include <stdio.h>

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

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

Exemplo de Execução:

#include <stdio.h>

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.

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

Exemplo de Execução:

#include <stdio.h>

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

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

Exemplo de Execução:

#include <stdio.h>

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.

5int a

3int b

?int q

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

Exemplo de Execução:

#include <stdio.h>

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.

5int a

3int b

1int q

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

Exemplo de Execução:

#include <stdio.h>

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.

5int a

3int b

1int q

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

Exemplo de Execução:

#include <stdio.h>

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

2int 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.

5int a

3int b

1int q

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

Exemplo de Execução:

#include <stdio.h>

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

2int r

• O conteúdo da variável r é impresso na saída padrão.

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

Exemplo de Execução:

#include <stdio.h>

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

2int 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.

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

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

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

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

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

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:

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

Exemplo com Estruturas:

#include <stdio.h>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:

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

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

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

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.

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

Exemplo com Vetores:• Faça uma função que copia uma string em outra.

#include <stdio.h>#define LIM 300void 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;}

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

Exemplo com Vetores:• Faça uma função que copia uma string em outra.

#include <stdio.h>#define LIM 300void 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

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

Exemplo com Vetores:• Faça uma função que copia uma string em outra.

#include <stdio.h>#define LIM 300void 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.

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

Exemplo com Vetores:• Faça uma função que copia uma string em outra.

#include <stdio.h>#define LIM 300void 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, poisatuam sobre o vetor original (passagem por referência).

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

• 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 <stdio.h>#include <stdlib.h>#include <time.h>#define LIM 100void 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; } }}

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

• 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 <stdio.h>#include <stdlib.h>#include <time.h>#define LIM 100void 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.

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

• 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 <stdio.h>#include <stdlib.h>#include <time.h>#define LIM 100void 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.

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

• 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 <stdio.h>#include <stdlib.h>#include <time.h>#define LIM 100void 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.

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

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