Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Controle de acesso ao escritório

import os

def ponto_de_assesso():
    while True:
        os.system("cls" if os.name == "nt" else "clear")

        try:
            hora_atual = int(input("Digite a hora atual (formato 24 horas): "))
            
            if hora_atual == -1:
                break
            elif 8 <= hora_atual < 18:
                print("Acesso permitido.")
            elif 0 <= hora_atual <= 23:
                print("Acesso negado.")
            else:
                print("Hora inválida.")
                
        except ValueError:
            print("Erro: Por favor, digite apenas números inteiros.")

        input("\nPressione Enter para continuar...")

ponto_de_assesso()

Fiquei com uma dúvida: se o código recebesse a informação direto de um terminal para bater ponto, e essa informação fosse "12:30", ela não seria nem um número inteiro e nem um fracionado (float).

Nesse caso, qual seria a melhor abordagem para tratar esse dado?

2 respostas
solução!

Olá, Vinicius. Como vai?

Excelente pergunta! Essa é uma dúvida muito comum quando saímos dos exercícios de lógica básica e começamos a desenhar sistemas que simulam o mundo real (como uma catraca física ou um sistema de ponto de um escritório).

No dia a dia do desenvolvimento, dados de horários vindos de terminais, APIs ou relógios de ponto chegam quase sempre como um texto (String), exatamente no formato "12:30".

Tentar converter "12:30" direto para int() ou float() vai disparar o bloco except ValueError que você programou, porque o caractere de dois-pontos (:) não pertence a esses tipos numéricos.

Existem duas abordagens excelentes no Python para tratar esse cenário. Vamos entender como cada uma funciona.


Abordagem 1: Usando a biblioteca nativa datetime (Recomendada)

A melhor prática de mercado em Python é utilizar o módulo nativo datetime. Ele possui uma função fantástica chamada strptime (abreviação de string parse time), que serve especificamente para ler um texto e transformá-lo em um objeto de horário que o Python entende nativamente.

Veja como o seu código pode ser adaptado usando essa abordagem:

import os
from datetime import datetime, time

def ponto_de_acesso():
    # Definindo os limites de horário usando objetos do tipo time (Hora, Minuto)
    abertura = time(8, 0)
    fechamento = time(18, 0)

    while True:
        os.system("cls" if os.name == "nt" else "clear")

        entrada = input("Digite a hora atual (ex: 12:30) ou -1 para sair: ").strip()
        
        if entrada == "-1":
            break

        try:
            # Converte a string "12:30" em um objeto de horário baseado no formato %H:%M
            hora_atual = datetime.strptime(entrada, "%H:%M").time()
            
            # Agora a comparação avalia tanto as horas quanto os minutos de forma precisa
            if abertura <= hora_atual < fechamento:
                print("Acesso permitido.")
            else:
                print("Acesso negado.")
                
        except ValueError:
            print("Erro: Por favor, digite o horário no formato correto de 24h (ex: 08:30, 17:45).")

        input("\nPressione Enter para continuar...")

ponto_de_acesso()

Por que essa é a melhor abordagem?
O objeto time do Python já cuida de todas as validações difíceis para você. Se o usuário digitar um horário impossível como "25:70", o próprio strptime percebe a inconsistência e joga o programa direto para o seu except ValueError, exibindo a mensagem de erro amigável sem quebrar o sistema.


Abordagem 2: Quebrando a String com .split() (Abordagem de pura lógica)

Se você preferir resolver o problema apenas usando estruturas básicas de manipulação de texto e operadores matemáticos (sem importar bibliotecas), você pode usar o método .split(":").

Ele "corta" a string onde houver dois-pontos e devolve uma lista com duas partes textuais: a hora e o minuto. A partir daí, você converte as duas partes para números inteiros.

Veja como ficaria a lógica do tratamento:

entrada = "12:30"

# O split transforma "12:30" em uma lista: ["12", "30"]
partes = entrada.split(":")

if len(partes) == 2:
    hora = int(partes[0])
    minuto = int(partes[1])
    
    # Validação manual das fronteiras do relógio
    if 0 <= hora <= 23 and 0 <= minuto <= 59:
        # Cria um valor numérico comparável (ex: 12h e 30min vira 12.5)
        hora_com_minuto = hora + (minuto / 60)
        
        if 8 <= hora_com_minuto < 18:
            print("Acesso permitido.")
        else:
            print("Acesso negado.")
    else:
        print("Horário inválido (valores fora do padrão de 24h).")

Qual escolher?

No mercado, a Abordagem 1 com datetime é amplamente preferida. Além de deixar o seu código mais limpo, ela evita que você precise escrever validações manuais gigantescas para verificar se os minutos estão entre 0 e 59 ou se as horas estão entre 0 e 23.

Seu código original está excelente, muito bem estruturado com o tratamento de exceções e a limpeza de terminal. Adicionar o tratamento de strings vai deixar ele pronto para um cenário real!

Espero que possa ter lhe ajudado!

Olá, Evandro! Muito obrigado pela explicação bem detalhada.

As abordagens usando datetime e .split() vão me ajudar bastante nos meus projetos de prática e também a entender melhor esse tipo de tratamento de dados.

Novamente, muito obrigado pelas dicas e pelo feedback!