Ir para o conteúdo
  • 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

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.