Questão 4: Um trem de longa distância parte de uma estação inicial em um determinado horário H1 (hora e minuto) e chega à estação final em um determinado horário H2. 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 100 km / h, 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

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 = h times 60 + m:
$$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:
ttdiffTime :: Int -> Int -> Int -> Int -> (Int,Int) ttdiffTime h1 m1 h2 m2 = <=t start = timeToMinutes h1 m1 end = timeToMinutes h2 m2 d = end - start in (d `div` 60, d `mod` 60)

Passo 4

Definimos a função que calcula a distância sabendo que a duração em minutos totais é hd times 60 + md, e que distância = (duração em horas) times 100:
ttdistance :: Int -> Int -> Doub<= ttdistance h m = fromIntegral (h * 60 + m) / 60 * 100

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
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 div 60, d mod 60)
distance :: Int -> Int -> Double
distance h m = fromIntegral (h * 60 + m) / 60 * 100
format2 :: Int -> String
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
let (th, tm) = diffTime h1 m1 h2 m2
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

Exercícios relacionados