Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres

Preview:

DESCRIPTION

Universidade Federal do Espírito Santo. Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres boeres@inf.ufes.br CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo. Co-Autoria: Clebson Oliveira. - PowerPoint PPT Presentation

Citation preview

Introdução à Programação uma Abordagem Funcional

Programação IProf.ª Claudia Boeres

boeres@inf.ufes.br

CT VII - Sala 34 Departamento de Informática

Centro TecnológicoUniversidade Federal do Espírito Santo

Universidade Federal do Espírito Santo

Co-Autoria: Clebson Oliveira

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). 

Os movimentos do cavalo

8

7                

6       m3   m2    

5     m4       m1  

4         C      

3     m5       m8  

2       m6   m7    

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 seu parâmetro (a posição corrente) de (x, 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 (x, y) = (x + 2 <= 8 ) && (y + 1 <= 8)

smov (x, y) = (x + 1 <= 8 ) && (y + 2 <= 8)

tmov (x,y) = (x - 1 >= 1 ) && (y + 2 <= 8)

qmov (x,y) = (x - 2 >= 1 ) && (y + 1 <= 8)

qtmov (x,y) = (x - 2 >=1  ) && (y - 1 >= 1)

sxmov (x,y) = (x - 1 >= 1 ) && (y - 2 >= 1)

stmov (x,y) = (x + 1 <= 8 ) && (y - 2 >= 1)

omov (x,y) = (x + 2 <= 8 ) && (y - 1 >= 1)

Identificando abstrações

pmov (x,y) = f (x + 2 ) && f( y + 1)

smov (x,y) = f (x + 1) && f (y + 2)

tmov (x,y) = g (x - 1) && f (y + 2)

qmov (x,y) = g (x - 2) && f (y + 1)

qtmov (x,y) = 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) = f (x + 2) && g (y – 1)

f w = w <= 8

g w = w >= 1

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 m4       m1 C1

7     C3     m5    

6 m5       m8   m6  

5   m6   m7        

4                

3   m2         m3  

2     m1     m4    

1 C4             C2

  1 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 0else 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 8 wherepert 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. 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 x y

smov x y

tmov x y

qmov x y

qtmov x y

sxmov x y

stmov x y

omov x y

mov (m, x, y)

Exemplo de avaliação da função mov

> mov 7 3 4True>

Codificação da Soluçãomov (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

<1 1 2 3 4 5 6 7 8 >8

<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úmero de valores

esquema linear (número médio)

esquema binário(número máximo)

8 4 4

100 50 7

1000 500 10

1000000 500000 20

Recommended