introdução à programaçãoclaudiaboeres.pbworks.com/w/file/fetch/106151007/aula3-progi.pdf ·...
TRANSCRIPT
Introdução à Programação uma Abordagem Funcional
Programação IProf.ª Claudia Boeres
CT VII - Sala 34
Departamento de InformáticaCentro Tecnológico
Universidade Federal do Espírito Santo
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çãoEscreva 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çãoPorque 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çãoUma 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
b
c
d
e
Modularização
Modularização
a
b
c
d
e
areaTotal a b c d e = areaRetangulo a b+ areaRetangulo (hipotenusa a d) e+ areaAzul a c d
whereareaAzul a c d = areaRetangulo c d +
areaTrianguloRetangulo d aareaTrianguloRetangulo x y = (x * y)/2
areaRetangulo x y = x * yareaAzul a c d = d*c +
areaTrianguloRetangulo d aareaTrianguloRetangulo x y = (x * y)/2
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.