1
resposta

[Solução] Calculando pedágio

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()

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oi, Mozert! Como vai?

Agradeço por compartilhar.

Gostei da sua solução, principalmente pela clareza nas docstrings e pela boa estrutura de funções. O uso de tratamento de erro com ValueError está muito bem aplicado, garantindo que o programa lide bem com entradas incorretas e mantenha uma boa experiência para quem usa o código.

Continue praticando essa organização e boas práticas. Uma dica: experimente usar o método strip() na leitura da entrada, assim você remove espaços extras digitados pelo usuário antes da conversão para float.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!