Questão 4: Um trem de longa distância parte de uma estação inicial em um determinado horário
(hora e minuto) e chega à estação final em um determinado horário
. Faça um programa em Haskell que leia os horários de partida e chegada do trem e informe o tempo total de viagem (em hora e minuto). Assumindo que a velocidade média do trem é de
, informe também a estimativa da distância percorrida entre as estações. Assuma ainda que as viagens sempre iniciam e terminam no mesmo dia. Não se esqueça de definir funções separadas para realizar os cálculos necessários.
Exemplo:
Entre com a hora de partida: 10
Entre com o minuto de partida: 35
Entre com a hora de chegada: 11
Entre com o minuto de chegada: 25
O trem partiu as 10:35 e chegou as 11:25.
Tempo de viagem: 00:50
Distancia percorrida: 83.3 km
Entre com a hora de partida: 10
Entre com o minuto de partida: 35
Entre com a hora de chegada: 11
Entre com o minuto de chegada: 25
O trem partiu as 10:35 e chegou as 11:25.
Tempo de viagem: 00:50
Distancia percorrida: 83.3 km
Passo 1
Neste exercício vamos ler horário de partida (hora e minuto) e de chegada (hora e minuto), calcular o tempo total de viagem e, sabendo que a velocidade média é de 100 km/h, estimar a distância percorrida. Para isso vamos definir funções separadas, conforme pede o enunciado.
Passo 2
Definimos uma função para converter hora e minuto em minutos totais usando a fórmula total =
:
$$
timeToMinutes :: Int -> Int -> Int
\timeToMinutes h m = h * 60 + m
$$Passo 3
Criamos uma função para calcular a diferença entre horários, em que primeiro transformamos partida e chegada em minutos totais, subtraímos e depois voltamos a horas e minutos:
Passo 4
Definimos a função que calcula a distância sabendo que a duração em minutos totais é
, e que distância = (duração em horas)
:
Passo 5
Para formatar sempre com dois dígitos (por exemplo “:05” em vez de “:5”), criamos:
$$
format2 :: Int -> String
\format2 x = if x < 10 then '0':show x else show x
$$Passo 6
Finalmente montamos
main
que lê os valores, chama as funções acima e imprime na tela no formato pedido.Resposta
import Text.Printf (printf)
timeToMinutes :: Int -> Int -> Int
timeToMinutes h m = h * 60 + m
timeToMinutes h m = h * 60 + m
diffTime :: Int -> Int -> Int -> Int -> (Int, Int)
diffTime h1 m1 h2 m2 =
let start = timeToMinutes h1 m1
end = timeToMinutes h2 m2
d = end - start
in (d
diffTime h1 m1 h2 m2 =
let start = timeToMinutes h1 m1
end = timeToMinutes h2 m2
d = end - start
in (d
div
60, d mod
60)distance :: Int -> Int -> Double
distance h m = fromIntegral (h * 60 + m) / 60 * 100
distance h m = fromIntegral (h * 60 + m) / 60 * 100
format2 :: Int -> String
format2 x = if x < 10 then ‘0’:show x else show x
format2 x = if x < 10 then ‘0’:show x else show x
main :: IO ()
main = do
putStrLn “Entre com a hora de partida:”
h1 <- readLn
putStrLn “Entre com o minuto de partida:”
m1 <- readLn
putStrLn “Entre com a hora de chegada:”
h2 <- readLn
putStrLn “Entre com o minuto de chegada:”
m2 <- readLn
main = do
putStrLn “Entre com a hora de partida:”
h1 <- readLn
putStrLn “Entre com o minuto de partida:”
m1 <- readLn
putStrLn “Entre com a hora de chegada:”
h2 <- readLn
putStrLn “Entre com o minuto de chegada:”
m2 <- readLn
let (th, tm) = diffTime h1 m1 h2 m2
dist = distance th tm
dist = distance th tm
printf “O trem partiu as %d:%s e chegou as %d:%s.\n” h1 (format2 m1) h2 (format2 m2)
printf “Tempo de viagem: %s:%s\n” (format2 th) (format2 tm)
printf “Distancia percorrida: %.1f km\n” dist
printf “Tempo de viagem: %s:%s\n” (format2 th) (format2 tm)
printf “Distancia percorrida: %.1f km\n” dist