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 calcula_pedagio(distancia_percorrida: float) -> float:
"""
Calcula o valor do pedágio com base na distância percorrida em km.
O valor é fixo por faixa de distância:
- R$ 10,00 para distâncias até 100.0 km.
- R$ 20,00 para distâncias entre 100.0 km e 200.0 km (exclusive > 100.0, inclusive <= 200.0).
- R$ 30,00 para distâncias acima de 200.0 km.
Args:
distancia_percorrida: A distância percorrida em quilômetros.
Returns:
O valor do pedágio em Reais (`float`).
Raises:
ValueError: Se a `distancia_percorrida` for menor ou igual a zero.
"""
if distancia_percorrida <= 0.0:
raise ValueError('"distancia_percorrida" precisa ser, obrigatoriamente, maior que zero.')
if distancia_percorrida <= 100.0:
return 10.0
elif distancia_percorrida > 100.0 and distancia_percorrida <= 200.0:
return 20.0
else:
return 30.0
def main() -> None:
"""
Função principal que solicita a distância percorrida ao usuário,
calcula o valor do pedágio e exibe o resultado.
A função repete a solicitação de entrada até que um valor numérico
válido e maior que zero seja fornecido.
"""
distancia: float = 0.0
pedagio: float = 0.0
while True:
try:
distancia = pega_float('\nDigite a distância percorrida (em km): ')
if not distancia > 0:
print('A distância percorrida precisa, obrigatóriamente, ser maior do que zero.')
continue
break
except ValueError as e:
print(e)
pedagio = calcula_pedagio(distancia)
print(f'Valor do pedágio: R$ {pedagio:.2f}')
if __name__ == '__main__':
main()