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

Slides:



Advertisements
Apresentações semelhantes
Funções em C Prof. Fabiano Utiyama.
Advertisements

Técnicas de Programação II Revisão TP1 Parte2
Programação em Java Prof. Maurício Braga
Programação em Java Prof. Maurício Braga
Centro Integrado de Tecnologia da Informação
V Procedimentos – são estruturas que agrupam um conjunto de comandos, que são executados quando o procedimento é chamado. v Funções – são procedimentos.
Construção de Algoritmos AULA 07
Programação II Estruturas de Dados
Algoritmos e Estrutura de Dados I
Alocação Dinâmica de Memória
PROGRAMAÇÃO MODULAR (com uso de subprogramas)
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Universidade Federal do Espírito Santo
Linguagem C Strings.
Linguagem C Funções.
Vetores, Matrizes e Funções
Vetores, Matrizes e Funções
Fundamentos de Programação 1
Algoritmos e Programação
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.
Introdução a Computação e Cálculo Numérico
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação.
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
PROGRAMAÇÃO ESTRUTURADA II
Definição de Tipos Estruturas e Ponteiros
CADEIA DE CARACTERES (Strings)
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Programação II Estruturas de Dados Aula 02 - continuação
Argumentos por valor Passagem de valor da variável indicada Não permite alteração de variável indicada Exemplo: int quadrado_de(int ); //protótipo int.
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
PROGRAMAÇÃO ESTRUTURADA (MODULARIZAÇÃO/SUBPROGRAMAÇÃO)
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Prof. Ricardo Santos PONTEIROS
Técnicas de Desenvolvimento de Programas
F UNÇÕES : PASSAGEM DE PARÂMETROS Aluno:Kaynã Vasconcelos Santos Matéria: Estrutura de dados e algoritmos I Turma: Professor: Danilo Silva dos Santos.
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
Modularização Dividir um problema em subproblemas Módulos menores facilita a depuração Dividir o desenvolvimento entre vários programadores “Reutilização”
Introdução à Linguagem C
Algumas notas sobre a linguagem de programação C
Aula Prática 3 Funções Monitoria Introdução à Programação.
 São utilizadas para dividir um código maior (mais complexo) em partes menores (mais simples).  Quando uma mesma tarefa é realizada várias vezes em um.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
Aula Prática 3 Funções Monitoria Introdução à Programação.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 2 Variáveis e Atribuições.
Algoritmos e Programação MC102
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Ponteiros.
Algoritmos e Programação MC102
Programação Computacional Aula 9: Meu primeiro programa em C
Ameliara Freire Dividir para Conquistar.
Profa. Maria Augusta Constante Puget
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Estruturas Homogêneas – Vetores e Matrizes
Linguaguem de Programação II
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
PCI- Vetores Profa. Mercedes Gonzales Márquez. Aula 5 - VetoresAlgoritmos e Estruturas de Dados I Sequência de valores todos do mesmo tipo Nome único.
PRE 1002 Éverlin Marques 2015/1.
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 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.

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.

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

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

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

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)

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

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

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.

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.

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

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.

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

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

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.

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

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

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

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

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

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.

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.

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

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

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:

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:

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

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.

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

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

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.

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

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

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.

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.

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.

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