Prévia do material em texto
Funções e Operações Exercícios Contato Curso de C para Engenharias Aula 5 Cristiano Dalbem Dennis Balreira Gabriel Moreira Miller Biazus Raphael Lupchinski Universidade Federal do Rio Grande do Sul Instituto de Informática Grupo PET Computação Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Funções e Operações Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão De�nição Matemática Idéia Mapeamento entre conjuntos Transformação de um domínio para outro Termos importantes Domínio, Entrada, Origem Imagem, Resultado Destino, Codomínio Parâmetros Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão De�nição Matemática Figura: Representação funcional matemática Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Figura: Composição Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Figura: Circuitos Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Programação Idéia Trecho de código (uma operação, por exemplo) que pode ser chamado várias vezes Cada uma das vezes pode ser com entradas (parâmetros) diferentes Cada uma das execuções pode prover resultados (retornos) para uso posterior Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Qual é o sentido de usar funções? Benefícios Desenvolver código genérico apenas uma vez Reaproveitamento de código Facilitar nosso entendimento/abstração do problema Dividir para conquistar Facilita o trabalho no caso de precisar mudar o código depois Modularidade, manutenibilidade, praticidade. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Sintaxe Declaração tipo_retorno nome_função (parâmetro1, parâmetro2, ...) 1 { 2 //Aqui escrevemos o que vamos fazer na função 3 4 return ( r e t o r n o ) //Caso a função não seja void! 5 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Sintaxe Chamada variável = nome_função (parâmetro1, parâmetro2, ...) variável contém o retorno de nome_função Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Já usamos funções em C antes! Entrada e Saída printf() scanf() Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Poderíamos já ter criado funções? Exercícios O uso de funções nos exercícios certamente facilitaria a nossa compreensão e a clareza do nosso código Mesmo que os exercícios até agora tenham sido simples Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo 1 i n t quadrado ( i n t x ) 2 { 3 i n t quad = x ∗ x ; 4 return ( quad ) ; 5 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Algumas considerações As variáveis x e quad são acessíveis apenas dentro da função ou em qualquer parte de nosso programa? O cálculo do quadrado poderia ter sido feito junto com o retorno? (return x ∗ x) Sim! Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Algumas considerações As variáveis x e quad são acessíveis apenas dentro da função ou em qualquer parte de nosso programa? O cálculo do quadrado poderia ter sido feito junto com o retorno? (return x ∗ x) Sim! Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Escopo Pense em camadas As variáveis de uma função são �vistas� apenas pela própria função e pelos outros escopos criados dentro da função. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Passagem por valor Na passagem de parâmetros por valor, que é o que vimos até agora, é passado o nome da variável para função, que faz uma cópia da mesma para uso dentro de seu escopo (variável local). Neste caso não é possível alterar o valor do parâmetro. Se quisermos alterar a variável original de dentro da função chamada? Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Passagem por referência Consiste em passar o endereço da variável como parâmetro. Dessa forma, qualquer alteração que acontecer na função com a variável repercutirá também no escopo em que foi passada como parâmetro. Muito utilizado para diminuir a prática não recomendada de variáveis globais (visíveis em todo o programa). Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo 1 #inc lude <s t d i o . h> 2 void t r o c a_ f a l s a ( i n t v1 , i n t v2 ) { 3 i n t aux ; 4 aux = v1 ; 5 v1 = v2 ; 6 v2 = aux ; 7 p r i n t f ( " 2) v1 = %d , v2 = %d\n" , v1 , v2 ) ; 8 } 9 i n t main ( ) { 10 i n t a = 5 , b = 7 ; 11 p r i n t f ( " 1) a = %d , b = %d\n" , a , b ) ; 12 t r o c a_ f a l s a ( a , b ) ; 13 p r i n t f ( " 3) a = %d , b = %d\n" , a , b ) ; 14 return ( 0 ) ; 15 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Função Troca - Errada! Quando passamos os valores v1 e v2, estamos apenas utilizando-os dentro da função. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Função Troca - Errada! Quando passamos os valores v1 e v2, estamos apenas utilizando-os dentro da função. Não há qualquer tipo de retorno da função, nem modi�cação do valor diretamente no seu endereço de memória. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Função Troca - Errada! Quando passamos os valores v1 e v2, estamos apenas utilizando-os dentro da função. Não há qualquer tipo de retorno da função, nem modi�cação do valor diretamente no seu endereço de memória. Como reti�car o código deforma a alterar os valores também fora do escopo da função? Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo 1 #inc lude <s t d i o . h> 2 void t r o c a ( i n t ∗v1 , i n t ∗v2 ) { 3 i n t aux ; 4 aux = ∗v1 ; 5 ∗v1 = ∗v2 ; 6 ∗v2 = aux ; 7 } 8 i n t main ( ) { 9 i n t a = 5 , b = 7 ; 10 p r i n t f ( "a = %d , b = %d\n" , a , b ) ; 11 t r o c a (&a ,&b ) ; 12 p r i n t f ( "a = %d , b = %d\n" , a , b ) ; 13 return ( 0 ) ; 14 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Calcula XY Escrever um programa que lê dois números inteiros e chama uma função que retorna o resultado do 1o número elevado ao 2o número. O programa principal deve chamar essa função e imprimir o retorno. Por exemplo, se forem informados os valores 2 e 3 a função deverá retornar o valor 8. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Resposta 1 #inc lude <s t d i o . h> 2 i n t expon ( i n t n1 , i n t n2 ) 3 { 4 i n t i , aux = n1 ; 5 i f ( n2 == 0) 6 return ( 1 ) ; 7 f o r ( i =1; i<n2 ; i++) 8 aux = aux ∗ n1 ; 9 return ( aux ) ; 10 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo Resposta 1 i n t main ( ) 2 { 3 i n t a , b , r e s u l ; 4 p r i n t f ( " I n t e i r o 1 : " ) ; 5 s c a n f ( "%d" ,&a ) ; 6 p r i n t f ( " I n t e i r o 2 : " ) ; 7 s c a n f ( "%d" ,&b ) ; 8 r e s u l = expon ( a , b ) ; 9 p r i n t f ( " Resu l t ado : %d" , r e s u l ) ; 10 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão De�nição De�nição de Recursão em C A recursão ocorre em C quando uma função chama ela mesma. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão De�nição De�nição de Recursão em C A recursão ocorre em C quando uma função chama ela mesma. Basta alterar a variável quando novamente ela é passada para a função. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão De�nição De�nição de Recursão em C A recursão ocorre em C quando uma função chama ela mesma. Basta alterar a variável a cada vez que é passada para a função. Precisa existir um ponto de parada (valor de retorno). Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo - Fatorial Recursivo 1 i n t f a t o r i a l ( i n t num) 2 { 3 i f (num < 1) //caso de parada 4 return 1 ; 5 e l s e 6 return num ∗ f a t o r i a l (num−1); 7 } 8 9 i n t main ( ) 10 { 11 i n t f a t = f a t o r i a l ( 4 ) ; 12 p r i n t f ( " F a t o r i a l de 4 : %d" , f a t ) ; 13 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato De�nição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exemplo - Máximo Divisor Comum Recursivo (MDC) 1 i n t mdc( i n t x , i n t y ){ 2 i f ( x == y ) 3 return x ; 4 e l s e 5 i f ( x > y ) 6 return mdc( x−y , y ) ; 7 e l s e 8 return mdc( x , y−x ) ; 9 } 10 i n t main ( ){ 11 i n t resu l t_mdc = mdc(8 , 4 ) ; 12 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Exercícios Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Exercícios Média harmônica Faça uma função que retorne a média harmônica de três numeros passados como parâmetro. Fórmula: H = N / (1/A1 + 1/A2 + ... + 1/AN), onde N é a quantidade de números e Ai é o valor de cada número. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Resposta 1 #inc lude <s t d i o . h> 2 f l o a t media_harmonica ( f l o a t v1 , f l o a t v2 , f l o a t v3 ){ 3 f l o a t media ; 4 media = 3 / (1/ v1 + 1/v2 + 1/v3 ) ; 5 return ( media ) ; 6 } 7 i n t main ( ) { 8 f l o a t a , b , c ; 9 p r i n t f ( " D i g i t e t r e s i n t e i r o s : " ) ; 10 s c a n f ( "%f " ,&a ) ; 11 s c a n f ( "%f " ,&b ) ; 12 s c a n f ( "%f " ,&c ) ; 13 p r i n t f ( "MH: %f " , media_harmonica ( a , b , c ) ) ; 14 return ( 0 ) ; 15 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Exercícios Incremento duplo Faça uma função que incremente dois inteiros passados como parâmetro. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Resposta 1 #inc lude <s t d i o . h> 2 void i n c r ementa_do i s ( i n t ∗v1 , i n t ∗v2 ) { 3 ∗v1 = ∗v1 + 1 ; 4 ∗v2 = ∗v2 + 1 ; 5 } 6 i n t main ( ) { 7 i n t a , b ; 8 p r i n t f ( " D i g i t e d o i s i n t e i r o s : " ) ; 9 s c a n f ( "%d" ,&a ) ; 10 s c a n f ( "%d" ,&b ) ; 11 i n c r ementa_do i s (&a ,&b ) ; 12 p r i n t f ( "a = %d , b = %d" , a , b ) ; 13 return ( 0 ) ; 14 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Exercícios Potência Faça uma função que, dada uma base e um expoente, devolva a potência usando recursividade. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Resposta 1 #inc lude <s t d i o . h> 2 i n t potenc i a_rec ( i n t v1 , i n t v2 ) { 3 i f ( v2 == 0) 4 return 1 ; 5 e l s e i f ( v2 == 1) 6 return v1 ; 7 e l s e return v1 ∗ potenc i a_rec ( v1 , v2−1); 8 } 9 i n t main ( ) { 10 i n t a , b ; 11 p r i n t f ( " D i g i t e d o i s i n t e i r o s : " ) ; 12 s c a n f ( "%d" ,&a ) ; s c a n f ( "%d" ,&b ) ; 13 p r i n t f ( "%d\n" , po t enc i a_rec ( a , b ) ) ; 14 return ( 0 ) ; 15 } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Exercícios Contato Dúvidas, Sugestões, Críticas www.inf.ufrgs.br/pet pet@inf.ufrgs.br Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Funções e Operações Definição Exemplos Motivações Funções em C Passagem de parâmetros Recursão Exercícios Contato