320 likes | 419 Views
Introdução à Programação: uma Abordagem Funcional PD I – Engenharia Elétrica Prof.ª Claudia Boeres 2008/2. RESOLVENDO PROBLEMAS – Os movimentos do cavalo no xadrez.
E N D
Introdução à Programação: • uma Abordagem Funcional • PD I – Engenharia Elétrica • Prof.ª Claudia Boeres • 2008/2
RESOLVENDO PROBLEMAS – Os movimentos do cavalo no xadrez • Considere o jogo de xadrez, onde peças são movimentadas em um tabuleiro dividido em 8 linhas e oito colunas. Considere ainda os movimentos do cavalo, a partir de uma dada posição, conforme diagrama a seguir, onde cada possível movimento é designado por mi. No esquema, o cavalo localizado na posição (5, 4) pode fazer oito movimentos, onde o primeiro deles, m1, levaria o cavalo para a posição (7,5).
PROBLEMA 1 • Escreva uma função que determina se, a partir de uma dada posição, o cavalo pode ou não realizar o primeiro movimento. Vamos chamá-la de pmov, e denominar seus parâmetros (a posição corrente), de x e y.
Análise da solução • Clareza - Na medida em que agora está explicitado, que todas as oito funções para verificar os movimentos possuem estrutura semelhante e que todas estão usando funções para verificar a ultrapassagem das bordas; • Manutenção - Se nosso tabuleiro mudasse, ou seja, passasse a ter 9 linhas por nove colunas, bastaria alterar a função f e tudo estaria modificado, ao invés de termos que alterar as oito definições. • Reuso - As duas funções que testam as bordas poderiam ser usadas para construir funções para avaliar o movimento de outras peças do jogo de xadrez.
PROBLEMA 2 • Sabemos que para cada posição alguns movimentos podem ser realizados e outros não. Como ordenamos os movimentos no sentido anti-horário, gostaríamos de obter, para uma dada posição, dos movimentos que podem ser realizados, aquele que possui o menor índice.
REVISITANDO O PROBLEMA 1 • Observando a solução encontrada para o problema 1, constatamos que embora a noção de movimento do cavalo seja única, quem precisar saber se um dado movimento é válido, precisará conhecer o nome das oito funções. Embora seja cedo para falarmos de interface homem-máquina, já dá para dizer que estamos sobrecarregando nosso usuário ao darmos oito nomes para coisas tão parecidas. Será que temos como construir uma só função para tratar o problema?
Codificação da Solução mov m x y = if not (pert m 1 8) || not (pert x 1 8) || not (pert y 1 8) then False else ifm == 1 then pmov else ifm == 2 then smov else ifm == 3 then tmov else ifm == 4 then qmov else ifm == 5 then qtmovelse ifm == 6 then sxmov else if m == 7 then stmovelse omovwhere pmov = ... smov = ... tmov = ... ...
Exemplo da aula anterior O ponto P(x,y) pertence a qual região? F y2 B 1 5 3 E A C D y1 x2 x1
Solução qualRegiao x y x1 y1 x2 y2 = if pertenceLosango x y a1 b1 a2 b2 then 'E' else if pertenceRetangulo x y x1 y1 x2 y2 then if x < xc then if y > yc then 'B' else 'C' else if y > yc then 'A' else 'D' else 'F' where a1 = x1 b1 = (y1 + y2)/2 a2 = (x1 + x2)/2 b2 = y2 xc = a2 yc = b1
Continuação do script pert x a b = a <= b && x >=a && x <= b pertenceRetangulo x y a b c d = pert x a c && pert y b d pertenceLosango x y a b c d = acimaReta x y a b e f && acimaReta x y e f g h && abaixoReta x y a b c d && abaixoReta x y c d g h where e = c f = 2*b-d g = 2*c-a h = b
Final do script acimaReta x y a b c d = y >= m * (x-a) + b where m = (d-b)/(c-a) abaixoReta x y a b c d = y <= m * (x-a) + b where m = (d-b)/(c-a)
Quais instâncias escolher? F 4 P2 B A E C P1 D 1 5 1
Quais valores devemos escolher? Pontos representantes de classes de equivalência
r r r r C Exercício : faça um script para determinar se um ponto pertence à area cinza. Faça um plano de teste.
O ponto P (x, y) pertence a qual das áreas 1, 2, 3 e 4? 4 P (x, y) ? C (x1, y1) 1 2 a/2 a 3