Pular para o conteúdo principal

Teste 07/08 {Resolução }

Enunciado em >>

{-
Atenção ao copy\paste uma vez que os tabs não estão atribuidos, e como se sabe o haskell é sensivel à Indentation...xD
-}

module Teste where

import IO ()

--Tipos e classes necessarias para a resolução do teste
type Filme = (Titulo,Realizador,[Actor],Genero,Ano)
type Titulo = String
type Realizador = String
type Actor = String
type Ano = Integer

type Filmes = [Filme]

data Genero = Comedia | Drama | Ficcao | Accao | Animacao | Documentario
deriving (Eq,Show)

data Avaliacao = NaoVi | Pontos Int
deriving (Ord,Eq,Show,Read)

type FilmesAval = [(Filme,[Avaliacao])]

data Abin a = Vazia | Node Int (Abin a) (Abin a)
deriving (Show,Eq,Ord)

-- Dados para testar
actores=["act1","act2","act3"]
filme1=("Resolucao do Teste de PF","Miguel Correlo",actores,Documentario,2009)
filme2=("Um","Desconhecido",actores,Comedia,2003)
filme3=("Genero = Um Quanquer","Desconhecido",actores,Documentario,2001)
filmes=[filme1,filme2,filme3]
avaliacao1= [NaoVi,Pontos 3, Pontos 4,Pontos 2, NaoVi]
avaliacao2= [NaoVi,Pontos 3, Pontos 4,Pontos 5, NaoVi, Pontos 2,Pontos 1, NaoVi]
avaliacao3= [NaoVi,Pontos 3, Pontos 4,Pontos 5, NaoVi, Pontos 2,Pontos 1, NaoVi, Pontos 2,Pontos 1, NaoVi]
filmesAvaliacao=[(filme1,avaliacao2),(filme2,avaliacao3),(filme3,avaliacao1)]
---------------------------------
--pg1
parte::Int->[Int]->([Int],[Int],[Int])
parte n [] = ([],[],[])
parte n l = ((filter (n) l)

--pg2
merge::[Float]->[Float]->[Float]
merge [] [] = []
merge [] r = r
merge l [] = l
merge (x:xs) (y:ys) | (x>y) = y:(merge (x:xs) ys)
| otherwise = x:(merge xs (y:ys))

--pg3
semMin::Abin Int->Int->(Int,Abin Int)
semMin ntree n = let arv = calcArv ntree n
;num = calcVal ntree n
in
(num,arv)
where
calcArv (Node val Vazia dir) n = Vazia
calcArv (Node val esq dir) n = (Node val (calcArv esq n) dir)
calcVal (Node val Vazia dir) n = val
calcVal (Node val esq dir ) n = calcVal esq n
-- funcoes auxiliares para teste

--lista -> arvore balanceada
toTree::[Int]->Abin Int->Abin Int
toTree [] Vazia = Vazia
toTree [] (Node n esq dir) = (Node n esq dir)
toTree (x:xs) ntree = (toTreeAux (toTree xs ntree) x)
where
toTreeAux Vazia n = (Node n Vazia Vazia)
toTreeAux (Node val esq dir) n | (n > val) = (Node val esq (toTreeAux dir n))
| (n < n ="=" valores="toTree"> Realizador -> Filmes
doRealizador l rea = (filter (\(_,r,_,_,_)->(r==rea)) l)

-- pg 4 a)
doActor :: Filmes -> Actor -> [Titulo]
doActor [] _ = []
doActor ((t,r,lactores,g,a):xs) act | (elem act lactores) = t:doActor xs act
| otherwise = doActor xs act
-- pg 4 a)
consulta :: Filmes -> Genero -> Realizador -> [(Ano, Titulo)]
consulta bd gen rea = map aux (filter (teste gen rea) bd)
where
teste :: Genero -> Realizador -> Filme -> Bool
teste g r (_,x,_,y,_) = g==y && r==x

aux::Filme->(Ano,Titulo)
aux (t,r,lac,g,a) = (a,t)

--PARTE II

--pg1 Avaliacao como instância da classe Ord, em comentario porque cria conflitos com o Preload

-- class Ord a where
-- max::a->a->a
-- instance Eq Avaliacao where
-- (Pontos a) == (Pontos b) = a == b
-- instance Ord Avaliacao where
-- (Pontos a) > (Pontos b) = a > b
-- (Pontos a) < (Pontos b) = a <>= (Pontos b) = (a > b) || (a==b)
-- (Pontos a) <= (Pontos b) = (a < a="=" b =" Pontos"> FilmesAval -> String

--pg2
grafico tit fil = let ava = snd (head (filter (\((x,_,_,_,_),y)->(x==tit)) fil))
in
trata (calcNuns (removeNao ava) 1) 1
where
trata::[Int]->Int ->String -- convert cada numero da lista em n estrela (*)
trata [] _= ""
trata l 6 = ""
trata (x:xs) n =(show n)++" " ++ newLine x ++ trata xs (n+1)

newLine ::Int-> String--recebe um Int convert em n estrilinhas
newLine 0 = "\n"
newLine n = "*"++ newLine (n-1)

calcNuns::[Avaliacao]->Int->[Int]--devolve uma lista com os repectivas classificacoes de pontos
calcNuns l 6 = []
calcNuns [] _ = []
calcNuns l n =(length ((filter (\(Pontos x)->(x==n)) l)) ) : calcNuns l (n+1)

--pg3

listaPorGeneros :: FilmesAval -> [(Genero,[(Titulo,Avaliacao)])]
listaPorGeneros l = let comedia = (calcMedia Comedia l)
;drama = (calcMedia Drama l)
;ficcao = (calcMedia Ficcao l)
;accao = (calcMedia Accao l)
;animacao= (calcMedia Animacao l)
;documentario = (calcMedia Documentario l)
in
(comedia:drama:accao:animacao:documentario:[])
where
calcMedia::Genero->FilmesAval->(Genero,[(Titulo,Avaliacao)])
calcMedia g [] = (g,[])
calcMedia g l = let genero = filter (\((_,_,_,gen,_),ava)->(g==gen)) l
in
media genero g

media::FilmesAval ->Genero-> (Genero,[(Titulo,Avaliacao)])
media [] g = (g,[])
media l gen = let nl = map (\((t,_,_,_,_),lava)->(t,lava)) l
in
(gen,auxMedia nl)

auxMedia::[(Titulo,[Avaliacao])] -> [(Titulo,Avaliacao)]
auxMedia [] = []
auxMedia [(t,[])] = [(t,NaoVi)]
auxMedia ((t, ava):xs) = (t,(cmedia ava)):auxMedia xs

cmedia::[Avaliacao]->Avaliacao
cmedia [] = Pontos 0
cmedia l= (Pontos (div ((foldr (+) 0 (toInt (removeNao l)))) (length (removeNao l))))

toInt::[Avaliacao]->[Int]
toInt [] = []
toInt l = map (\(Pontos n)->(n)) (filter (\(Pontos n)->(n > 0)) l)

removeNao::[Avaliacao]->[Avaliacao]
removeNao []=[]
removeNao (x:xs) | (x==NaoVi) = removeNao xs
| otherwise = x:removeNao xs
--pg4

avalia :: FilmesAval -> IO FilmesAval
avalia nfilmes= do {
putStr "Introduza o nome de um Filme:\n"
;ntit <- getLine ;putStr "Introduza o uma Avaliacao para esse Filme {Pontos x | NaoVi}:\n" ;nAva <- getAvaliacao ;return(addAva nfilmes ntit nAva) } addAva::FilmesAval->Titulo->Avaliacao->FilmesAval
addAva [] ti ava= []
addAva (((tit,e,r,t,y),a):xs) ti ava | (tit==ti) = ((tit,e,r,t,y),(ava:a)):xs
| otherwise = ((tit,e,r,t,y),(a)):addAva xs ti ava

getAvaliacao :: IO Avaliacao
getAvaliacao = do line <- getLine ;return (read line :: Avaliacao)

Comentários

Postagens mais visitadas deste blog

A gente e a alma

Falo uma língua tão antiga Que trago as mãos em calos Nascem letras para uma cantiga Nos enxertos dos teus bardos Amo-te mulher em todas as prosas Sou o maior dos perversos Não despedaço corações, nem faço mossas mas nascem-me espinhos nos versos Tua alma espreita-me na poda É mosto a fermentar os segredos vício de vinho que não sai de moda Por isso esmago com os pés os medos Por isso sou farinha nesta roda E o pão cresce no teu corpo de vinhedos

Exame 07/08 {Resolucao}

Enunciado aqui module Exame where data Tree a = Empty | Node a (Tree a) (Tree a) type Extracto = [Movimento] type Movimento = (Descricao, Tipo, Data, Montante) type Descricao = String data Tipo = Credito | Debito deriving (Eq,Show) type Ano = Int type Mes = Int type Dia = Int data Data = D Ano Mes Dia deriving (Eq,Ord,Show) type Montante = Double -- valor positivo -- Dados para teste movimento1=("Compra", Debito, (D 1999 12 01), 123.0) movimento2=("EuroMilhoes", Credito, (D 2009 08 23), 155.5) movimento3=("EDP", Debito, (D 2009 01 26), 32.0) extracto = [movimento1,movimento2,movimento3] ------------------------------- --pg1 menoresMaiores :: Float -> Tree Float -> ([Float],[Float]) menoresMaiores n Empty = ([],[]) menoresMaiores n arv = let l = toList arv in ((filter (n>) l),(filter (n String -> Bool ePrefixo [] r = True ePrefixo l [] = True ePrefixo (x:xs) (y:ys) | (x==y)= True && e...

Esperas não activas

Algumas definições e conceitos Variável Lock – diz se está alguém a executar o while. Garante que o wait() e o signal() são atômicos e que só está um processo de cada vez na zona critica. Wait(condiction_variable, lock) – põe o processo actual numa lista (FIFO) em espera e liberta o lock. Aguarda por um sinal do sistema operativo para poder pôr os processos guardados na FIFO da variável de condição prontos a executar. Signal(condiction_variable) – vai a lista de processos bloqueados (FIFO) faz pop da lista e põem o processo bloqueado na fila de processos prontos a executar pelo sistema operativo. Funcionamento do psedo-código Psedo-Código: Lock lock ; Condition vazio , cheio ; int a[N], nitems, ...; int tirar(){ acquire( lock ); //está alguem apartir desta linha? while (nitems == 0) wait( vazio , lock ); //  Não tenho nada para fazer. Espero! … {algoritmo que faz coisas} … signal( cheio ); //  Bem! Quem estava à espera do meu trabalho para con...