Projeto de Programação
Compra de passagens aéreas
Banco de dados
[(A,B,C,D).........]
[(Cód. identificação, companhia, data, lista de escalas)....]
[(A, B, (x,y,z), D).........]
[(A, B, (x,y,z), [(a,b,c,d)...(e,f,g,h)).......]
Lista de escalas
[(a, (ti,mi), (o,v), 0)...(e, (tf,mf), (0,0), h)]
[(Origem, (hora de saída), (ocupados,disponíveis), 0)
....(destino, (hora de chegada), (0,0), tarifa do trecho)]
1ª Questão:
VOOS FUNCAO DADO XS = FUNCAO DADO XS
A resposta dessa função será uma lista dos vôos que contém
a informação contida no argumento “dado”, de acordo com
o 'tipo' da informação.
1ª Questão :
codigo_identificacao dado xs = [(a,b,c,d)| (a,b,c,d)<- xs, a == dado]
companhia dado xs = [(a,b,c,d)| (a,b,c,d)<- xs, b == dado]
escalas dado xs = [(a,b,c,d)| (a,b,c,d)<- xs, elem dado (init (tail d))]
datas dado xs = [(a,b,c,d)| (a,b,c,d)<- xs, c == dado]
1ª Questão :
fst1 (x,y,z,w) = x
origem dado xs = [(a,b,c,d)|(a,b,c,d) <-xs, fst1 (head d) == dado]
destino dado xs = [(a,b,c,d) | (a,b,c,d) <- xs, fst1 (last d) == dado]
snd3 (a,b,c,d) = b
hora_partida dado xs = [(a,b,c,d) | (a,b,c,d) <- xs, snd3 (head d)
== dado]
hora_chegada dado xs = [(a,b,c,d) | (a,b,c,d) <- xs, snd3 (last d) ==
dado]
1ª Questão
terc (a,b,c,d) = c
assentos_disponiveis dado xs = [(a,b,c,d) | (a,b,c,d) <- xs,
x <- d, snd (terc x) == dado]
assentos_ocupados dado xs = [(a,b,c,d) | (a,b,c,d) <- xs,
x <- d, fst (terc x) == dado]
last2 (a,b,c,d) = d
tarifa dado xs = [(a,b,c,d) | (a,b,c,d) <- xs, x <- d,
(last2 x) == dado]
2ª Questão:
Lista os vôos disponíveis no período dado,
ordenados por tarifas total dos vôos:
voo_completo origem destino saida chegada xs =
[(a,b,c,d)|(x,y,z,w) <- (ordena_tarifas (calcula_tarifas ls)),
(a,b,c,d) <- xs, x == a]
where ls = voo_or_dest_per origem destino
saida chegada xs
2ª Questão:
Retira o segundo elemento da tupla de quatro elementos:
meio1 (x,y,z,w) = y
Lista os vôos que contém todas informações dadas nos
argumentos:
voo_or_dest_per origem destino saida chegada xs =
[(a,b,c,d) | (a,b,c,d) <- xs, fst1 (head d) == origem
&& fst1 (last d) == destino
&& meio1 (head d ) == saida
&& meio1 (last d ) == chegada]
2ª Questão:
Soma as tarifas de cada tupla da lista de escalas:
tarifas xs = sum [t | (a,b,c,t) <- xs]
Retorna uma lista com os vôos, onde o último
elemento da tupla foi substituído pela tarifa total de
cada vôo:
calcula_tarifas xs = [(a,b,c,tarifas d) | (a,b,c,d) <- xs]
2ª Questão:
Ordena a lista através do último elemento da tupla:
ordena_tarifas xs = if (null xs || null (tail xs))
then xs
else ordena_tarifas (filtra (< f4 pivot)
xs) ++ [pivot] ++ ordena_tarifas (filtra (>= f4 pivot) (tail xs))
where
pivot = head xs
f4 (a,b,c,d) = d
filtra p xs = [x | x <- xs, p (f4 x)]
3ª Questão
Obter os vôos de menor tarifa, através dos
dados iniciais (origem, destino e período dos
vôos):
voo_menor_tarifa origem destino datas xs =
[ (a,b,c,d) | w <- ls, (a,b,c,d)<-xs, z == (last2 w)
&& fst1 w == a]
where
z = compara_tarifas origem destino datas xs
ls = calcula_tarifas (voo_or_dest_data origem
destino datas xs )
3ª Questão
Lista os vôos que contém a origem, o destino e a data
solicitada:
voo_or_dest_data origem destino datas xs =
[(a,b,c,d) | (a,b,c,d) <- xs, fst1 (head d) == origem
&& fst1 (last d) == destino
&& c == datas]
3ª Questão
Retorna o valor da menor tarifa entre os vôos da lista
dada:
compara_tarifas origem destino datas xs = minimum (last1 ls)
where ls = calcula_tarifas
(voo_or_dest_data origem destino datas xs )
Lista os últimos elementos das tuplas de uma lista:
last1 xs = [w|(x,y,z,w)<-xs]
4ª Questão
Comprar uma passagem, no vôo de menor escala entre os
vôos da questão anterior:
compra_passagem x y z =
voocerto (alteraquantvoo(head(voocertoD)))
where
voocertoD = retiraD (menor_escala
(voo_menor_tarifa x y z bancod))
voocerto p = colocaDcomABC (menor_escala
(voo_menor_tarifa x y z bancod)) p
4ª Questão
Filtra os vôos, cujo o tamanho da lista de escalas é
igual ao menor tamanho de escala entre os vôos que
confere com o que foi solicitado na questão 3:
menor_escala xs =[(a,b,c,d)| (a,b,c,d) <- xs, length d == ls]
where ls = menor_tamanho_escala xs
Menor tamanho da lista de escalas:
menor_tamanho_escala xs =
minimum [length d| (a,b,c,d) <- xs]
4ª Questão
Agora vamos retirar a primeira escala dos
vôos que confere com o que foi solicitado.
Como só iremos comprar uma passagem,
ficamos só com a primeira (head):
retiraD xs = head([ d | (a,b,c,d)<-xs])
4ª Questão
Após retirar a escala, filtramos a primeira
tupla dela, pra efetuarmos a compra da
passagem, aplicando a seguinte função:
alteraquantvoo (a,b,(c,d),e) = (a,b,(c+1,d-1),e)
Assim, a tupla da origem da escala foi
modificada.
4ª Questão:
Para colocar a tupla (agora modificada) no vôo
original dela, aplicamos a função:
colocaDcomABC xs z = [ (a,b,c,z:(tail(retiraD
xs))) | (a,b,c,d)<-xs]
Fim
Passagem comprada!!!
Alan Silva da Paz Floriano
Glaice kelly da Silva Quirino
Download

1ª Questão