projeto de programação

16
Projeto de Programação Departamento de Informática – CT XVII Engenharia de Computação Programação I - 2009/1 Maria Claudia Boeres MOONLANDER Hudson Martins da Silva ([email protected]) Matricula: 2008101155 Lucian Borges Corteletti ([email protected]) Matricula: 2008101135

Upload: libba

Post on 20-Mar-2016

32 views

Category:

Documents


0 download

DESCRIPTION

Projeto de Programação. Departamento de Informática – CT XVII Engenharia de Computação Programação I - 2009/1 Maria Claudia Boeres. MOONLANDER. Hudson Martins da Silva ([email protected]) Matricula: 2008101155 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Projeto de Programação

Projeto de ProgramaçãoDepartamento de Informática – CT XVII

Engenharia de ComputaçãoProgramação I - 2009/1

Maria Claudia Boeres

MOONLANDER

Hudson Martins da Silva ([email protected]) Matricula: 2008101155Lucian Borges Corteletti ([email protected]) Matricula: 2008101135

Page 2: Projeto de Programação

Algumas primitivas novas que foram utilizadas:

Primitiva Map:

Função de ordem superior que aplica uma função ao longo de uma lista.

somaUm xs = map f xs ou somaUm xs = map f xs where f x = x + 1

f x = x + 1

Teste:

Main> somaUm [1,2,3,4,5][2,3,4,5,6] :: [Integer](112 reductions, 220 cells)

Page 3: Projeto de Programação

Algumas primitivas novas que foram utilizadas:

Primitiva Filter :

E uma função de ordem superior que filtra os elementos de uma lista que verificam um dado predicado.

filtraPares xs = filter f xs ou filtraPares xs = filter even xs where f x = even x

Teste:

Main> filtraPares [2,6,5,7,89,45,5,6,1,2][2,6,6,2] :: [Integer](317 reductions, 539 cells)

Page 4: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

Fornece como resposta uma lista de áreas válidas de pouso existentesno terreno ordenado pela menor distância do ponto onde a nave está posicionada

ordenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno = foldl insereOrdenado [ ] (areaPouso (x,y,vx,vy,fx,fy,c) terreno)

Page 5: Projeto de Programação

Funções Auxiliares Utilizadas: A funcao "areaPouso" tem como argumentos uma nave e um terreno essa funcao mapeia os elementos da lista "distNaveReta" e tem como saida uma lista de tuplas-2 em que o primeiro elemento e uma lista com os dois vertices do segmento de um triangulo e o segundo e a distancia da nave a esse segmento Obs: essa lista de saida da funcao "areaPouso" nao esta necessariamente ordenada pelocriterio distancia

areaPouso (x,y,vx,vy,fx,fy,c) terreno = map fAux (distNaveReta (x,y,vx,vy,fx,fy,c) terreno) where fAux ((x1,y1),(x2,y2),i,dpr) = ([(x1,y1),(x2,y2)],dpr)

Elaboração do script:# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

Page 6: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

Funções Auxiliares Utilizadas:

A função "insereOrdenado" tem como argumentos uma tupla-2 da forma ([Ponto],Numero) e uma lista da forma [([Ponto],Numero)], essa função tem como objetivo inserir essa tupla-2 ordenadamente (em ordem crescente) na lista seguindo o critério distancia que e representado pelo segundo elemento da tupla. Obs: nessa função a lista dada como argumento já esta em ordem crescente

insereOrdenado ys (xs,x) = menoresIguais ++ [(xs,x)] ++ maiores where menoresIguais = [ (zs,y) | (zs,y) <- ys, y <= x ] maiores = [ (zs,y) | (zs,y) <- ys, y > x ]

Page 7: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

A função distNaveReta tem como parâmetros uma nave e um terreno. Ela retorna uma lista de tuplas-4 com os dois vértices do lado de um trianguloa inclinação, dentro da permitida, e a distancia da nave do ponto onde essa se encontra ao segmento em questão que possui a inclinação dentro da permitida

distNaveReta (x, y, vx, vy, fx, fy, c) terreno = [ ((a,b),(c,d),i,distPontoReta (x,y) (a,b) (c,d)) | ((a,b),(c,d),i) <- (segmentosPouso terreno)]

Dado um ponto (x1,y1) a função "distPontoReta" calcula a distancia desse ponto a reta determinada passando por (x2, y2) e (x3, y3), que e um lado do triangulo

distPontoReta (x1, y1) (x2, y2) (x3, y3) = (abs ( a*x1 + b*y1 + c))/(sqrt (a*a + b*b)) where a = y2-y3 b = x3-x2 c = x2*y3 - x3*y2

Page 8: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

A função segmentosPouso tem como argumento um terreno e, filtra os elementos da lista "segmentosCandidatos terreno" de tal maneira que o terceiro elemento da tupla de cada tupla esteja dentro do intervalo da inclinacao permitida

segmentosPouso terreno = filter ip (segmentosCandidatos terreno) where

ip (_, _, x) = if x >= (-0.1) && x <= 0.1

A função segmentosCandidatos tem como argumento um terreno e tem como saída uma lista de tuplas-3 com os dois vértices de um trianguloe a respectiva inclinação deste lado

segmentosCandidatos terreno = concat (map segmentoInclinacao terreno)

Page 9: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

Dados dois pontos a função inclinacao calcula a inclinação do segmento formado pelos respectivos pontos inclinacao (x1,y1) (x2,y2) | x1 == x2 = 1.234567890 -- Segmento vertical

| y1 == y2 = 0.0 | otherwise = (y2 - y1)/(x2 - x1)

Dado um triangulo ( tupla-3) a função segmentoInclinacao devolve uma lista de tuplas-3 com dois vértices do triangulo e a respectiva inclinação desse segmento

segmentoInclinacao ((a,b),(c,d),(e,f)) = [((a,b),(c,d), inclinacao (a,b) (c,d)),((a,b),(e,f), inclinacao (a,b) (e,f)),((c,d),(e,f), inclinacao (c,d) (e,f))]

Page 10: Projeto de Programação

Elaboração do script:

# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno

Exemplo:

Resultado Esperado:ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((-1.0,-1.0),(0.0,0.0),(0.0,-0.5)),((1.0,-1.0),(0.0,0.0),(0.0,-0.5))] = [ ]

Resultado Obtido:Main> ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((-1.0,-1.0),(0.0,0.0),(0.0,-0.5)),((1.0,-1.0),(0.0,0.0),(0.0,-0.5))] [](264 reductions, 542 cells)

Resultado Esperado:ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((1.0,0.0),(-1.0,0.0),(0.0,-1.0)),((1.0,-1.0),(-1.0,-1.0),(0.0,0.5))] = [ ( [ ( 1.0 , 0.0 ) , ( -1.0 , 0.0 ) ] , 0.0 ) , ( [ ( 1.0 , -1.0 ) , ( -1.0 , -1.0 ) ] , 1.0 ) ]

Resultado Obtido:Main> ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((1.0,0.0),(-1.0,0.0),(0.0,-1.0)),((1.0,-1.0),(-1.0,-1.0),(0.0,0.5))][([(1.0,0.0),(-1.0,0.0)],0.0),([(1.0,-1.0),(-1.0,-1.0)],1.0)](498 reductions, 1125 cells)

Page 11: Projeto de Programação

A funcao "contagem" possui como argumentos uma nave e um terreno e tem como saida a pontuacao obtida pela nave ao seguir a trajetoria.

Elaboração do script:

# contagem (x,y,vx,vy,fx,fy,c) terreno:

contagem (x,y,vx,vy,fx,fy,c) terreno = if psu == 1 then 100-p

else 0 where p = (100*combustivelGasto)/c

Page 12: Projeto de Programação

A função "trajetoria" tem como argumentos uma nave e um terreno e fornece como saída uma tupla-3 com a lista de pontos seguidos pela naveda sua posição inicial até seu ponto de pouso, a distancia total percorrida e um valor booleano indicando se a nave pousou ou não

Elaboração do script:

# trajetoria (x,y,vx,vy,fx,fy,c) terreno:

trajetoria (x,y,vx,vy,fx,fy,c) terreno = (trajetoNave,dist,psu) where

trajetoNave = if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)

then trajeto1 (x,y,vx,vy,fx,fy,c) terreno else trajeto2 (x,y,vx,vy,fx,fy,c) terreno

dist = if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno) then dist1 (x,y,vx,vy,fx,fy,c) terreno else dist2 (x,y,vx,vy,fx,fy,c) terreno psu = "X"

Page 13: Projeto de Programação

O trajeto1 e aplicado quando a nave esta em cima do ponto de pouso trajeto1 (x,y,vx,vy,fx,fy,c) terreno = [(x,y),(xm,ym)] where (xm,ym) = pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno

O trajeto2 e aplicado quando a nave esta a esquerda ou a direita do ponto de pouso trajeto2 (x,y,vx,vy,fx,fy,c) terreno = [(x,y),(x1,y),(x2,y2)] where x1 = fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno) (x2,y2) = pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno

dist1 (x,y,vx,vy,fx,fy,c) terreno = abs (y1 - y2) where

y1 = snd (head (trajeto1 (x,y,vx,vy,fx,fy,c) terreno))y2 = snd (last( trajeto1 (x,y,vx,vy,fx,fy,c) terreno))

dist2 (x,y,vx,vy,fx,fy,c) terreno = (distPontoPonto k1 k2) + (distPontoPonto k2 k3) where k1 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!0

k2 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!1 k3 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!2

Elaboração do script:# trajetoria (x,y,vx,vy,fx,fy,c) terreno:

Page 14: Projeto de Programação

Elaboração do script:

# pilotar (x,y,vx,vy,fx,fy,c) terreno:

A função "pilotar" define como será a movimentação da nave uma vez que se sabe onde se encontra o ponto de pouso

pilotar (x,y,vx,vy,fx,fy,c) terreno = if segmentosPouso terreno == [ ] then (1,1)

else if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)

then pilotarPontoAbaixo (x,y,vx,vy,fx,fy,c) terreno

else if x < fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)

then pilotarPontoDireito (x,y,vx,vy,fx,fy,c) terreno

else pilotarPontoEsquerdo (x,y,vx,vy,fx,fy,c) terreno

Page 15: Projeto de Programação

Elaboração do script:

# pilotar (x,y,vx,vy,fx,fy,c) terreno:

pilotarPontoAbaixo define a estratégia de movimentação da nave se o ponto de pouso estiver abaixo da posição atual da nave

Funções Auxiliares Utilizadas

pilotarPontoDireito define a estratégia de movimentação da nave se o ponto de pouso estiver do lado direito da posição atual da nave

pilotarPontoEsquerdo define a estrategia de movimentacao da nave se o ponto de pouso estiver do lado esquerdo da posicao atual da nave

pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno = (hAux(gAux(head(ladoPousoCandidato (x,y,vx,vy,fx,fy,c) terreno))))

Page 16: Projeto de Programação

Elaboração do script:

# pilotar (x,y,vx,vy,fx,fy,c) terreno:

A função "gAux" é uma função auxiliar que possui como argumento uma tupla-4 e tem como saída os dois primeiros elementos dessa tupla

gAux ((x1,y1),(x2,y2),_,_) = ((x1,y1),(x2,y2))

A função auxiliar "hAux" tem como parâmetros uma tupla-2 de pontos e tem como saída uma tupla-2 com o ponto médio do segmento determinado pelos pontos passados como parâmetros

hAux ((x1,y1),(x2,y2)) = (a/2,b/2) where

a = x1 + x2b = y1 + y2