Preciso fazer um programa em Python que leia um horário(hora, minuto e segundo) de início, e a duração de um evento em segundos. O programa resultar com o novo horário(somando o horário informado com os segundos).
Respostas
O programa abaixo não conta com validação de dados ou controle/tratamento de exceções, assim espera-se que seja utilizado de forma correta, seguindo a proposta do exercício.
Se, por exemplo, enviarmos um dado em ponto flutuante ou string, será retornada uma exceção "ValueError" que interromperá o o andamento do programa.
Caso se quisesse prevenir a exceção, deveríamos adicionar uma etapa de validação dados e, para evitar interrupções, deveríamos adicionar uma etapa de tratamento de exceções para dizer ao programa o que deve ser feito na ocasião de um erro acontecer.
O exercício não deixa clara como deve ser feita a entrada de dados, a solução que será apresentada lê separadamente horas, minutos e segundos como variáveis inteiras (integer) e, também, optou-se pela não utilização de bibliotecas, já que isso tiraria quase todo desafio da tarefa.
Sem mais delongas, vamos ao código e, posteriormente, comento mais sobre a lógica adotada.
[Python 3.8]
#------------------Leitura de Dados----------------------------------
print('Preencha os campos abaixo com o horário atual')
h = int(input('Hora: '))
m = int(input('Minuto: '))
s = int(input('Segundo: '))
d = int(input('\nDuração do evento (segundos): '))
#----Determinação do Horário de Término do Evento---
s_final = (s + d) % 60
m_final = ( m + (s+d)//60 ) % 60
h_final = ( h + ( m + (s+d)//60 )//60 ) % 24
#----Apresentação do Horário de Término do Evento---
print(f'O fim do evento se dará às {h_final}h {m_final}min e {s_final} segundos')
#-----------------Fim do Programa-------------------------------------
Comentários:
--> Perceba que, nos cálculos, utilizamos várias vezes as operações "%" (resto da divisão) e "//" (divisão inteira).
--> Começamos determinando os segundos do horário final (s_final), lembre-se que 60 segundos equivalem a 1 minuto, logo apenas o resto da divisão (%) dos segundos totais por 60 nos interessa aqui, a parte inteira da divisão será "transformada" em minutos.
--> Para os minutos, lembre-se que 60 minutos equivalem a 1 hora, logo faremos algo semelhante ao que foi visto no cálculo dos segundos. Apenas o resto da divisão (%) dos minutos totais por 60 nos interessa, no entanto precisamos considerar a parte inteira dos segundos que foi "transformada" em minutos. No código essa consideração é feita em " (s+d)//60". De novo, a parte inteira da divisão será transformada em horas.
--> Nas horas, como esperado, será feito algo semelhante ao visto para o cálculo dos segundos e minutos. Temos agora que 24 horas equivalem a 1 dia, assim apenas o resto da divisão das horas totais por 24 serão de interesse. Vale ressaltar que precisamos considerar os minutos que foram transformados" em horas, essa consideração aparece no código em "( m + (s+d)//60 )//60"
Vamos à um exemplo prático do que foi falado acima.
Considere o horário inicial 22h55min32s e uma duração do evento de 7954s.
Segundos totais: 32 + 7954 = 7986s
7986 / 60 = 133 inteiros com resto 6
Segundos = 6
Minutos totais: 55 + 133 = 188min
188 / 60 = 3 inteiros com resto 8
Minutos = 8
Horas totais: 22 + 3 = 25h
25/24 = 1 inteiro com resto 1
Horas = 1
Término do Evento: 1h 8min e 6s