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

aalex

duvida em função que testa uma viagem

Recommended Posts

aalex

estou a tentar fazer uma função que testa se uma viagem esta bem construida mas não estou a conseguir :wallbash:

type Time = (Int,Int)

testh :: Time-> Bool
testh (a,b) = if a>=0 && a<=23 && b>=0 && b<=59 then True
             else False

compH :: Time->Time->Bool
compH (a,b) (c,d) = if c>a && testh (a,b) && testh (c,d) then True
                   else if c==a && d>b && testh (a,b) && testh (c,d) then True
                     else False

testaetapa :: (Int,Int)->(Int,Int)->Bool
testaetapa (x,y) (v,z) = if testh (x,y) && testh (v,z) && compH (x,y) (v,z) then True
              else False


testaviagem :: [Time]->Bool
testaviagem [(c1,c2):(c3,c4):tt] = testaetapa (c1,c2) (c3,c4) && testaetapa ((c3,c4):tt)

funçoes:

testh - testa se um para é uma hora valida (hora,min)

compH - compara duas horas e ve se uma esta depois da outras "ex: (10,55)<(12,20)"

testaetapa - faz quase o mesmo que o comph

testaviagem - era suposto darmos [(10,20),(5,2),(1,50)...] e ele testar [(10,20)<(5,2)<(1,50)<...] só que não estou a conseguir fazer, já fiz tanta função que já estou farto de pensar :wallbash:

Share this post


Link to post
Share on other sites
Baderous

Na função testaviagem, ela recebe uma lista, mas tu estás a dizer que ela recebe uma lista de listas, porque estás a usar os parêntesis rectos a envolver uma lista já construída com o operador ( : ). Para além disso, precisas de adicionar o caso de paragem da lista vazia e também o da lista só com 1 elemento, pois como fazes comparações 2 a 2 das horas, vais chegar a uma fase da recursividade em que só vais ter 1 par na lista, e tens de prever esse caso.

type Hora = Double
type Etapa = (Hora,Hora)
type Viagem = [Etapa]

v1 = [(9.5,10.25),(11.3,12.75),(13.5,14.75)] :: Viagem

testaViagem :: Viagem -> Bool
testaViagem [] = True
testaViagem (h:[]) = snd h > fst h
testaViagem (h1:h2:t) = snd h1 > fst h1 && fst h2 > snd h1 && testaViagem (h2:t)

Share this post


Link to post
Share on other sites
aalex

bem depois de muito  :wallbash:

sempre consegui, tambem com a sua ajuda barderous, muito obrigado

testeviagem :: [Time] -> Bool
testeviagem [] = error "viagem invalida"
testeviagem ((o,u):[])= True
testeviagem ((c1,c2):(c3,c4):xs)= testaetapa (c1,c2) (c3,c4) && testeviagem ((c3,c4):xs)

veja se esta correcto por favor, dessa forma já funciona como pretendia.

Share this post


Link to post
Share on other sites
Baderous

No caso de paragem da lista vazia não deves usar o error, essa função só deve ser usada em casos muito especiais, quando se quer indicar que uma função pode dar algum tipo de erro é preferível usar o tipo Maybe ou Either (embora funções do Prelude como a head, last, init, tail, etc usem o error para assinalar que são funções parciais). É preferível que no caso de paragem da lista vazia coloques a devolver True, porque quando chegar à lista vazia, a função simplesmente pega nas várias conjunções lógicas já desenvolvidas até então e faz uma outra com True (não vai afectar o que já foi calculado, porque o resultado de cond && True depende sempre do valor de cond). No caso em que só tem 1 elemento precisas de chamar a tua função testh para garantir que aquele par representa uma hora válida.

Share this post


Link to post
Share on other sites
aalex

ok muito obrigado pelas dicas, e pela grande ajuda:)

então fica assim:

testeviagem :: [Time] -> Bool
testeviagem [] = True
testeviagem ((o,u):[])= testh (o,u)
testeviagem ((c1,c2):(c3,c4):xs)= testaetapa (c1,c2) (c3,c4) && testeviagem ((c3,c4):xs)

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

×

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.