Jump to content

Recommended Posts

Posted (edited)

Oi 🙂

O exercício, é o seguinte:  Adicionar um determinado número de minutos a uma dada hora.´

Então, no sublime, coloquei:

int_horas :: Hora -> Bool
int_horas (h,m)= if (h<= 23) && (h>=0) && (m<=59) && (m>=0) then True else False

soma_min:: Hora -> Int -> Hora
soma_min (a,b) c = if (int_horas (a,b)== True) then (a, b+c)

Mas no terminal, aparece isto e não percebo porquê:

s.hs:28:62:
    parse error (possibly incorrect indentation or mismatched brackets)
Failed, modules loaded: none.
Prelude> 

Obrigada 

Edited by pwseo
blocos de código, etc.
Posted (edited)
1 hora atrás, pwseo disse:

Qual é a linha 28 do teu código?

Outra questão: sabias que em Haskell não podes ter if .. then sem else?

Socorrão, esqueci-me. Mas mesmo assim, está-me a fazer alguma confusão porque se forem adicionados, por exemplo, 70min, a hora também vai mudar. Vou tentar adicionar a conversão de minutos para horas primeiro.

 

Acabei por tentar resolver o problema assim:

soma_min:: Hora -> Int -> Hora
soma_min (a,b) c =  if b+c<=59 then (a, b+c)
                    else if b+c==60 && a<=23 then (a+1,0)
                    else if b+c>60 then (a+ div c 60, b+ mod c 60)
                    else (0,0)

Só que quando tento soma_min (10,40) 30 dá (10,70) 😞 

Edited by pwseo
mais uma vez, syntax highlight.
Posted

@Rafaela Soares,

Este é na realidade um problema mais do domínio da matemática do que da programação. A chave aqui é perceber que há duas operações matemáticas que te simplificam muito a vida: quot e rem (neste caso equivalentes a div e mod). Assim deixa de ser necessário andar com condições para tentar perceber se é ou não necessário aumentar a hora ou não.

Por exemplo, imagina que eu quero adicionar 30 minutos a (10,40) e quero evitar obter o resultado de (10,70):

Prelude> let hora = (10, 40)
Prelude> snd hora + 30
70
Prelude> let qr = quotRem 70 60
Prelude> qr
(1,10)
Prelude> (fst hora + fst qr, snd qr)
(11,10)

Nota: a função quotRem é um atalho para a aplicação separada de quot e rem; eu poderia ter feito simplesmente qr = (quot 70 60, rem 70 60).

Conseguiste perceber o raciocínio?

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
×
×
  • Create New...

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.