def pega_float(pergunta: str, opcoes: list[float] = []) -> float:
"""
Solicita uma entrada do usuário, garantindo que seja um número de ponto
flutuante (float) e, opcionalmente, que esteja dentro de uma lista de opções válidas.
A função converte automaticamente vírgulas (',') para pontos ('.') antes
de tentar a conversão para float.
Args:
pergunta: A mensagem (prompt) a ser exibida ao usuário.
opcoes: Uma lista de floats válidos. Se a lista estiver vazia
(padrão), qualquer número de ponto flutuante é aceito.
Returns:
O número de ponto flutuante digitado pelo usuário.
Raises:
ValueError: Se a entrada não puder ser convertida para `float`
ou se o float digitado não estiver na lista de opções válidas.
"""
resposta: float = 0.0
try:
resposta = float(input(pergunta).replace(',', '.'))
except ValueError:
raise ValueError('Entrada inválida!')
if opcoes == []:
return resposta
if resposta in opcoes:
return resposta
raise ValueError('Opção inválida!')
def main() -> None:
"""
Função principal do programa para calcular e classificar o Índice de Massa Corporal (IMC).
Solicita ao usuário o peso (kg) e a altura (m) usando a função `pega_float`
para garantir entradas numéricas válidas. Calcula o IMC e imprime a
classificação (abaixo do peso, peso ideal ou acima do peso).
"""
NORMAL_IMC: float = 18.5
ALTO_IMC: float = 25
imc: float = 0.0
peso: float = 0.0
altura: float = 0.0
while True:
try:
peso = pega_float('\nDigite seu peso (kg): ')
altura = pega_float('\nDigite sua altura (m): ')
break
except ValueError as e:
print(e)
continue
imc = peso / (altura ** 2)
print(f"Seu IMC é: {imc:.2f}")
if imc < NORMAL_IMC:
print(f'Você está abaixo do peso.')
elif imc >= NORMAL_IMC and imc < ALTO_IMC:
print(f'Você está no peso ideal.')
elif imc >= ALTO_IMC:
print(f'Você está acima do peso.')
else:
print(f'Erro ao encontrar categoria de IMC.')
if __name__ == '__main__':
main()