Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMalu Leão Lage Alterado mais de 8 anos atrás
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; }
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.