Universidade Federal do Espírito Santo Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres [email protected] CT VII - Sala 32 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Co-Autoria: Veruska Zamborlini e Clebson Oliveira A arte de resolver problemas • Só se aprende a resolver problemas através da experiência; • A ajuda do professor não deve vir através da apresentação pura e simples de uma solução; • É muito importante não se conformar com uma única solução; A arte de resolver problemas Na busca pela solução de um problema, nossa ferramenta principal é o questionamento; ● Aprenda desde cedo a buscar um aprimoramento da sua técnica para resolver problemas; Crie uma sistematização. A arte de resolver problemas Compreensão do problema Planejamento Desenvolvimento: construção da solução; planejamento do teste; execução do teste; codificação da solução; teste com o uso do computador. Avaliação do processo e seus resultados A arte de resolver problemas Deseja-se escrever um programa que permita determinar a menor quantidade de cédulas necessárias para pagar uma dada quantia em Reais. A arte de resolver problemas Compreensão do problema: Cédulas de 1, 5, 10, 50 e 100 Planejamento Desenvolvimento: ncedulas q = (div q 100) + (div (mod q 100) 50) + (div (mod (mod q 100) 50) 10) + (div (mod (mod (mod q 100) 50) 10) 5)+ (div (mod (mod (mod (mod q 100) 50) 10) 5) 1) A arte de resolver problemas ● ● Avaliação do processo e seus resultados: ➔ Há uma outra forma de resolver o problema? ➔ Pode-se deixar a solução mais clara? ➔ Melhore seu código ➔ Crie uma base de testes Outra versão: nMinCedulas2 q = n100 + n50 + n10 + n5 + n1 where n100 = div q 100 r100 = mod q 100 n50 = div r100 50 r50 = mod r100 50 n10 = div r50 10 r10 = mod r50 10 n5 = div r10 5 r5 = mod r10 5 n1 = div r5 1 Princípios para resolução de problemas Abstração Generalização Instanciação Modularização Abstração Escreva a expressão que determina a hipotenusa de um triângulo de lados 4 e 10. Hugs> sqrt((10 * 10) + (4 * 4)) Hugs> 10.770329614269007 E se quisermos chamar várias vezes essa mesma expressão? hipotenusa = sqrt((10 * 10) + (4 * 4)) Generalização Porque escrever uma definição de hipotenusa que retorna sempre o mesmo valor, ao invés de generalizá-la? hipotenusa x y = sqrt((x * x) + (y * y)) Instanciação Uma vez definida a função genérica para cálculo da hipotenusa, podemos instanciá-la para diferente valores de catetos: Hugs> hipotenusa 10 4 10.770329614269007 Hugs> hipotenusa 35 18 39.357337308308857 Hugs> hipotenusa 9 12 15.0 Modularização Modularização a e b c d Modularização Modularização areaTotal a b c d e = areaRetangulo a b + areaRetangulo (hipotenusa a d) e + areaAzul a c d where areaAzul a c d = areaRetangulo c d + areaTrianguloRetangulo d a areaTrianguloRetangulo x y = (x * y)/2 areaRetangulo x y = x * y areaAzul a c d = d*c + areaTrianguloRetangulo d a areaTrianguloRetangulo x y = (x * y)/2 a e b c d Exercício Descreva o algoritmo para calcular o volume das peças a seguir; Implemente esse algoritmo em Haskell; Crie uma bateria de testes e teste seu programa.