Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 3 Comandos Condicionais.
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções.
-
Upload
malu-leao-lage -
Category
Documents
-
view
224 -
download
0
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/1.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/2.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/3.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/4.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/5.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/6.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/7.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/8.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/9.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/10.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/11.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/12.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/13.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/14.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/15.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/16.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/17.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/18.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/19.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/20.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/21.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/22.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/23.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/24.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/25.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/26.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/27.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/28.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/29.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/30.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/31.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/32.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/33.jpg)
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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/34.jpg)
• 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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/35.jpg)
• 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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/36.jpg)
• 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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/37.jpg)
• 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.](https://reader035.fdocument.pub/reader035/viewer/2022062306/570638641a28abb8239015eb/html5/thumbnails/38.jpg)
• 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;}