Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
luchhozito

[Resolvido]Funcao QuickSort

Recommended Posts

luchhozito

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Tenho esta função abaixo que tem como objectivo ordenar os Inscritos pelo numero (crescente).

ordenada :: Inscritos -> Inscritos						
ordenada ((a,b,c):xs) = ordenada (filter(\(_,b,_) (< xs)) ++ [(a,b,c)] ++ ordenada (filter(\(_,b,_) -> (>=b) xs))

mas está a dar um erro.

Share this post


Link to post
Share on other sites
Baderous

A definição de quicksort é esta:

qsort [] = []
qsort (x:xs) = let mi = filter (<x) xs
	   mai = filter (>=x) xs
       in qsort mi ++ [x] ++ qsort mai

Vê lá o que é que estás a fazer mal.

Share this post


Link to post
Share on other sites
luchhozito

não estou a conseguir compilar. :confused:

ordenada :: Inscritos -> Inscritos						
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter ((\(_,b,_) -> (<b)) xs)
			           mai = filter ((\(_,b,_) -> (>=b)) xs)
			      in ordenada mi ++ [(a,b,c)] ++ ordenada mai

Share this post


Link to post
Share on other sites
Baderous

Estás a definir um tipo de dados para representar o número com uma palavra reservada: Num. Esta palavra representa uma classe de Haskell, não podes utilizar para dar nomes aos teus tipos.

Para além disso, tens aí uns parêntesis a mais no filter e a função < e >= têm tipo Ord a => a -> a -> Bool e da forma que estavas a fazer, o compilador inferia que o tipo era a -> Bool.

ordenada :: Inscritos -> Inscritos                                             
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter (\(_,t,_) -> t<b) xs
                           mai = filter (\(_,t,_) -> t>=b) xs
                       in ordenada mi ++ [(a,b,c)] ++ ordenada mai 

Share this post


Link to post
Share on other sites
luchhozito

Estás a definir um tipo de dados para representar o número com uma palavra reservada: Num. Esta palavra representa uma classe de Haskell, não podes utilizar para dar nomes aos teus tipos.

Para além disso, tens aí uns parêntesis a mais no filter e a função < e >= têm tipo Ord a => a -> a -> Bool e da forma que estavas a fazer, o compilador inferia que o tipo era a -> Bool.

ordenada :: Inscritos -> Inscritos                                             
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter (\(_,t,_) -> t<b) xs
                           mai = filter (\(_,t,_) -> t>=b) xs
                       in ordenada mi ++ [(a,b,c)] ++ ordenada mai 

eishh... pois. obrigadao

Share this post


Link to post
Share on other sites
luchhozito

Utilizando o tipo do primeiro post.

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Objectivo: Calcular a lista de alunos de um dados curso ordenada por número.

Dão isto:

listagem :: Inscritos -> Curso -> [Num]
listagem t c = ordena (filter(==c) t)

Exercicio:

Apresente uma definição para a função ordena e apresenta o seu tipo

----- minha resolução ---



-- saca apenas os numeros
da_num :: Inscritos -> [Num]
da_num [] = []
da_num ((a,b,c):xs) = [b] ++ da_num xs

-- funcao ordena
ordena :: Inscritos -> [Num]
ordena [] = []
ordena t = da_num (ordenada t) 

-- ordenar por numero
ordenada :: Inscritos -> Inscritos                                           
ordenada [] = []
ordenada ((a,b,c):xs) = filter (\(_,t,_) -> t<b) xs ++ [(a,b,c)] ++ filter (\(_,t,_) -> t>=b) xs

Share this post


Link to post
Share on other sites
AJBM

Utilizando o tipo do primeiro post.

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Objectivo: Calcular a lista de alunos de um dados curso ordenada por número.

Dão isto:

listagem :: Inscritos -> Curso -> [Num]
listagem t c = ordena (filter(==c) t)

Exercicio:

Apresente uma definição para a função ordena e apresenta o seu tipo

----- minha resolução ---



-- saca apenas os numeros
da_num :: Inscritos -> [Num]
da_num [] = []
da_num ((a,b,c):xs) = [b] ++ da_num xs

-- funcao ordena
ordena :: Inscritos -> [Num]
ordena [] = []
ordena t = da_num (ordenada t) 

-- ordenar por numero
ordenada :: Inscritos -> Inscritos                                           
ordenada [] = []
ordenada ((a,b,c):xs) = filter (\(_,t,_) -> t<b) xs ++ [(a,b,c)] ++ filter (\(_,t,_) -> t>=b) xs

Boas olha podes explicar me como e que esta funcao funciona?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.