Introduo Programao uma Abordagem Funcional PD I Engenharia
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, m 1, levaria o cavalo para a posição (7, 5).
Os movimentos do cavalo 8 7 6 m 3 5 m 2 m 4 m 1 4 C 3 m 5 2 m 8 m 6 m 7 1 1 2 3 4 5 6 7 8
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.
Instâncias de pmov INST NCIA RESULTADO pmov 5 4 True pmov 8 1 False pmov 1 1 True pmov 1 8 False
Solução pmov x y = (x + 2 <= 8 ) && (y + 1 <= 8)
Testando a solução 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8
Estendendo o problema pmov xy = (x + 2 <= 8 ) && (y + 1 <= 8) smov xy = (x + 1 <= 8 ) && (y + 2 <= 8) tmov x y = (x - 1 >= 1 ) && (y + 2 <= 8) qmov xy = (x - 2 >= 1 ) && (y + 1 <= 8) qtmov xy = (x - 2 >=1 ) && (y - 1 >= 1) sxmov xy = (x - 1 >= 1 ) && (y - 2 >= 1) stmov xy = (x + 1 <= 8 ) && (y - 2 >= 1) omov xy = (x + 2 <= 8 ) && (y - 1 >= 1)
Identificando abstrações pmov x y = smov x y = tmov x y = qtmov x y = f (x + 2 ) && f( y + 1) f (x + 1) && f (y + 2) g (x - 2) && f (y + 1) g (x - 2) && g (y – 1) sxmov x = y g (x - 1) && g (y – 2) stmov x y = f (x + 1 ) && g (y – 2) omov x y = fw = f (x + 2) && g (y – 1) w <= 8
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.
Qual o menor índice de movimento possível? 8 m 4 m 1 7 6 C 3 m 5 5 C 1 m 8 m 6 m 7 4 3 m 2 2 1 m 3 m 1 m 4 C 4 1 C 2 2 3 4 5 6 7 8
Instâncias de qualmov Instância resultado qualmov 8 1 3 qualmov 8 8 5 qualmov 3 7 1 qualmov 1 1 1
Solução
Codificando a solução qualmov x y = if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 else if qmov x y then 4 else if qtmov x y then 5 else if sxmov x y then 6 else if stmov x y then 7 else if omov x y then 8 else 0
Análise da solução qualmov x y = if not (pert x 1 8) || not (pert y 1 8) then 0 else if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 else if qmov x y then 4 else if qtmov x y then 5 else if sxmov x y then 6 else 7 where pert x a b = a = b && x >= a && x <= b
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?
Melhorando a interface pmov xy smov xy tmov xy qtmov xy sxmo vx y stmov xy omov xy mov mx y
Exemplo de avaliação da função mov ? mov 734 True ?
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 if m == 1 then pmov else if m == 2 then smov else if m == 3 then tmov else if m == 4 then qmov else if m == 5 then qtmov else if m == 6 then sxmov else if m == 7 then stmov else omov where pmov =. . . smov =. . . tmov =. . .
Análise da solução nova solução <1 1 2 3 4 5 6 7 8 >8
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 if m <= 4 then if m<= 2 then if m== 1 then pmov else smov else if m==3 then tmov else qmov else if m<= 6 then if m==5 then qtmov else sxmov else if m == 7 then stmov else omov where pmov =. . . smov =. . . tmov =. . .
Número de comparações númer o de val ore s esquema linear (número médio) esquema binário (número máximo) 8 4 4 100 50 7 1000 500 10 10000 00 500000 20
Exemplo da aula anterior O ponto P(x, y) pertence a qual região? F y 2 B 1 A 5 3 C E D y 1 x 2
Solução qual. Regiao x y x 1 y 1 x 2 y 2 = if pertence. Losango x y a 1 b 1 a 2 b 2 then 'E' else if pertence. Retangulo x y x 1 y 1 x 2 y 2 then if x < xc then if y > yc then 'B' else 'C' else if y > yc then 'A' else 'D' else 'F' where a 1 = x 1 b 1 = (y 1 + y 2)/2 a 2 = (x 1 + x 2)/2 b 2 = y 2 xc = a 2 yc = b 1
Continuação do script pert x a b = a <= b && x >=a && x <= b pertence. Retangulo x y a b c d = pert x a c && pert y b d pertence. Losango x y a b c d = acima. Reta x y a b e f && acima. Reta x y e f g h && abaixo. Reta x y a b c d && abaixo. Reta x y c d g h where e=c f = 2*b-d g = 2*c-a h=b
Final do script acima. Reta x y a b c d = y >= m * (x-a) + b where m = (d-b)/(c-a) abaixo. Reta x y a b c d = y <= m * (x-a) + b where m = (d-b)/(c-a)
Quais instâncias escolher? F P 2 4 B A E C P 1 D 1 1 5
Quais valores devemos escolher? x y resultado esperado resultado obtido diagnóstico 3 3 ‘E’ ok 1 2. 5 ‘B’ ok 2 4 ‘B’ Ok 1 5 ‘F’ ok Pontos representantes de classes de equivalência
Processo de teste
Exercício : faça um script para determinar se um ponto pertence à area cinza. Faça um plano de teste. r C r r r
O ponto P (x, y) pertence a qual das áreas 1, 2, 3 e 4? 4 P (x, y) ? 1 C (x 1, y 1) a/2 2 3 a
- Slides: 32