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

Hallow

Dúvida em trabalho de Haskell

5 mensagens neste tópico

Boas Portugal-a-Programarianos. Antes de mais quero dizer que não quero que me façam o trabalho, mas se puderem dar umas luzes, seria óptimo. Devia ter feito como muitos dos meus colegas e fazer o projecto individual em grupo, mas acho que aí não se aprende muito, porque se nos vimos enrascados com um problema durante mais de 5 minutos pedimos logo a resposta, removendo completamente o processo penoso de usar os nossos neurónios. Consegui aprender C e Java desta maneira, mas aí tinha bons livros com centenas de sites à disposição. Algo que Haskell infelizmente não tem...

Aluguei 3 livros na biblioteca, mas até agora não têm sido muito úteis...

Mas quem programa, sabe que fazê-lo sozinho pode ser frustrante, cansativo e irritante. Especialmente quando estamos a resolver um problema que sabemos que é fácil, mas não chegamos lá.  :thumbdown:

Apesar da Universidade permitir que muitos dos projectos se façam em grupos, creio que é preferível sofrer na universidade e aprendermos a desenrascar-nos sozinhos, do que graduar-nos, arranjarmos emprego e depois andar sempre preocupado porque o nosso amigo que sempre nos ajudou a programar na universidade já não se encontra lá para nos fazer a papinha toda.

Dito isto, aqui vai a minha questão.  :P

Talvez seja melhor mostrar um bocado do enunciado, porque às vezes as minhas explicações são confusas. :)

(…) 27.  Isto é tudo muito interessante, mas é claro que o que gostamos de conferir quando vamos pagar o estacionamento é a hora de chegada ao parque e a hora de partida, com as quais depois calculamos a duração, e não a duração directamente. Pois bem, queremos uma função calcular dessa forma. Vamos representar as horas de chegada e de partida ou, melhor, os instantes de chegada e partida, por números inteiros: por exemplo 1200 representa o meio-dia; 845 representa um quarto para as 9 da manhã; 2355 representa 5 para a meia-noite; 20 representa meia-noite e 20. O intervalo dos instantes vai de 0 a 2359, mas nem todos são válidos: por exemplo 1289 não faz sentido e nunca aparecerá. O problema agora é: programar uma função duration que, dados dois números representado a hora de chegada e a hora de partida ao parque de estacionamento, calcula a duração do estacionamento, expressa em minutos. Temos a complicaçãozita adicional de que o podemos chegar num dia e sair no dia seguinte (o que quer dizer que a hora de partida pode ser inferior à de chegada), mas sabemos que a duração de estacionamento não pode ser superior a 24 horas nem inferior a 1 minuto.

28.  Sugestão: programe uma função minutes, que dada uma hora, calcula o número de minutos que passaram desde a meia-noite desse dia. Por exemplo: minutes 845 vale 525, minutes 1201vale 721, minutes 15 vale 15, minutes 2359 vale 1439. Depois, use esta função na definição da função duration.

29.  Outra sugestão, ainda que não para ser utilizada já (mas fica guardada para mais logo): programe a função inversa de função minutes, invMinutes, que calcula a hora, dados os minutos que passaram desde a meia noite.

--  muda horas para minutos
minutos :: Int -> Int
minutos x = (div x 100)*60 + (mod x 100)

-- função inversa da minutos
invMinutos :: Int-> Int
invMinutos x = (div x 60)*100 + (mod x 60)

A pergunta é para criar outra função, duracao, onde colocamos a hora de chegada ao parque (x), e a hora partida deste (y).

Fiz isto:

duracao :: Int -> Int -> Int
duracao x y
|y < x = 1440 - (minutes(x) - minutes(y)) 
|otherwise = -(minutes(x) - minutes(y)) – para impedir que fiquemos com minutos negativos

:hmm:

Corri inúmeros testes e os valores bateram sempre certo (apesar de existir a possibilidade de me ter enganado algures porque fiz os testes às 3 da manhã da noite passada), contudo quando submeti o trabalho para o Mooshka, este deu-me mensagem de erro.  :mad:

O professor da cadeira disse para nós assumirmos que a pessoa que vai usar o programa vai colocar valores válidos à partida, o que exclui a necessidade de criarmos código adicional para lidar com erros, do género colocar mensagens de erro que não respeitem os limites (0…2359). Não faz sentido tirar o nosso carrinho do parque às 25h87m, quando sabemos que um dia tem 24 horas, e as horas 60 minutos.

Só que neste caso em particular acho que sou obrigado a colocar um conjunto de regras/limitações, embora não tenha sido preciso fazê-lo até agora, o que me faz duvidar da ideia. Vou mandar um e-mail ao professor para me esclarecer neste ponto, mas a resposta pode demorar a vir e o tempo é precioso.

Estou completamente às aranhas e esgotaram-se-me as ideias. Nunca vim a um fórum pedir ajuda, mas não posso avançar para as outras funções porque dependem desta, que é o mais frustrante.

:wallbash:

Obrigado por lerem isto.

Já agora alguém pode recomendar alguns bons livros ou sites (além do haskell.org)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A mim assim de repente parece estar tudo bem. Tenta falar com o prof para ver se dá algumas dicas. Já que ele tem acesso aos logs do Mooshak e vê em que situação está a dar erro.

Em relação aos livros para Haskell. Eu aprendi com um livro, acho que era Fundamentos da Computação II, Programação Funcional, do José Bernado Barros, professor da Universidade do Minho, português e com vários exercícios. Depois em Inglês os mais populares são o The Haskell School of Expression e o Haskell: The Crafting of Functional Programming. Acho que saiu um este ano que é conciderado muito bom, mas já não me lembro do título, se entretanto me lembrar eu ponho aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obg pela a resposta.

Pois, tb bate tudo certo, mas obviamente não testei para todos os milhares de possíveis combinações.

Os profs não dão ajuda, mas eu compreendo a posição deles.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando dás dois valores iguais está a devolver 0, mas, segundo o enunciado, devias devolver 1 dia.

[...] mas sabemos que a duração de estacionamento não pode ser superior a 24 horas nem inferior a 1 minuto.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, obrigado Rui. Li a papelada dezenas de vezes, linha por linha e não sei como é que deixei escapar isso...

0

Partilhar esta mensagem


Link 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