A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 Projeto de Programação Departamento de Informática – CT XVII Engenharia de Computação Programação I /1 Maria Claudia Boeres MOONLANDER Hudson Martins da Silva Matricula: Lucian Borges Corteletti Matricula:

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

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

4 Elaboração do script: # OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno Fornece como resposta uma lista de áreas válidas de pouso existentes no 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)

5 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 pelo criterio 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

6 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) x ]

7 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 triangulo a 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

8 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 triangulo e a respectiva inclinação deste lado segmentosCandidatos terreno = concat (map segmentoInclinacao terreno)

9 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 = 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))]

10 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

11 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 nave da 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"

12 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:

13 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

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

15 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 + x2 b = y1 + y2


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google