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