1
resposta

Controlando o orçamento mensal

limite_gastos = 3000.0
gastos = float(input("Digite seu gasto: ").replace(",", "."))
if gastos > 3000.0:
    print(f"Atenção! Você ultrapassou o limite do orçamento.")
    print(f"Limite de gastos: R${limite_gastos:.2f} | Gasto total: R${gastos:.2f}")
else:
    print("Parabéns! Você está dentro do orçamento.")
    print(f"Limite de gastos: R${limite_gastos:.2f} | Gasto total: R${gastos:.2f}")

# USANDO FUNÇÃO
limite_gastos = 3000.0
def verificar_gastos(gasto: float) -> str:
    """Validar o gasto atual em relação ao limite estabelecido."""
    if gasto > limite_gastos:
        return (
            "Atenção! Você ultrapassou o limite do orçamento.\n"
            f"Limite de gastos: R${limite_gastos:.2f} | Gasto total: R${gasto:.2f}"
            
        )
    return (
        "Parabéns! Você está dentro do orçamento.\n"
        f"Limite de gastos: R${limite_gastos:.2f} | Gasto total: R${gasto:.2f}"
    )
try:
    entrada = input("Digite seu gasto: ").replace(",", ".")
    gasto_total = float(entrada)
    if gasto_total < 0:
        print("ERRO: O valor das despesas não pode ser negativo.")
    else:
        print(verificar_gastos(gasto_total))
except ValueError:
    print("ERRO: Entrada inválida! Por favor, digite apenas números.") 
1 resposta

Olá, Luísa. Como vai?

O seu projeto ficou espetacular! É muito bacana ver a evolução de um mesmo código dentro do post: você começou com a estrutura sequencial básica e depois evoluiu para uma solução altamente profissional utilizando funções, tipagem de dados (type hints), documentação com docstrings e, o mais importante, tratamento de exceções.

Gostaria de destacar excelentes decisões técnicas que você tomou na segunda versão do código:

  • O uso do .replace(",", "."): Essa é uma sacada sensacional de Experiência do Usuário (UX). No Brasil, as pessoas usam a vírgula para separar os centavos. Sem esse tratamento, se alguém digitasse 2500,50, o Python geraria um erro imediatamente.
  • Validação de valores negativos: Prever que um gasto não pode ser menor que zero impede dados corrompidos no seu sistema de orçamento.
  • Bloco try/except: Capturar o ValueError blinda o seu programa contra travamentos caso o usuário digite letras ou caracteres inválidos.

Para agregar ainda mais valor aos seus estudos sobre a estrutura if/else, vale a pena observar um detalhe sobre a manutenibilidade do código.

Na sua função verificar_gastos, você utilizou a variável global limite_gastos diretamente lá dentro. Na engenharia de software, o ideal é que uma função seja totalmente independente do mundo externo. Se no futuro você quiser usar essa mesma função para verificar o orçamento de uma viagem que tem um limite diferente (por exemplo, R$ 5.000,00), você teria problemas.

Para resolver isso, a melhor prática é passar o limite como um parâmetro opcional (com um valor padrão) dentro da própria função. Veja como o seu código ganharia flexibilidade:

# A função agora recebe o gasto e, se ninguém informar o limite, ela assume 3000.0 por padrão
def verificar_gastos(gasto: float, limite: float = 3000.0) -> str:
    """Validar o gasto atual em relação ao limite estabelecido."""
    if gasto > limite:
        return (
            "Atenção! Você ultrapassou o limite do orçamento.\n"
            f"Limite de gastos: R${limite:.2f} | Gasto total: R${gasto:.2f}"
        )
    return (
        "Parabéns! Você está dentro do orçamento.\n"
        f"Limite de gastos: R${limite:.2f} | Gasto total: R${gasto:.2f}"
    )

try:
    entrada = input("Digite seu gasto: ").replace(",", ".")
    gasto_total = float(entrada)
    
    if gasto_total < 0:
        print("ERRO: O valor das despesas não pode ser negativo.")
    else:
        # Chamada limpa da função (usando o limite padrão de 3000.0)
        print(verificar_gastos(gasto_total))
        
        # Exemplo de reutilização para outro limite se precisasse no futuro:
        # print(verificar_gastos(gasto_total, limite=5000.0))
        
except ValueError:
    print("ERRO: Entrada inválida! Por favor, digite apenas números.")

Essa pequena alteração isola completamente o comportamento da função, tornando o seu código modular, reutilizável e com um padrão de arquitetura digno de sistemas de grande porte.

Parabéns pelo excelente nível de dedicação, organização e clareza no desenvolvimento da atividade!

Espero que possa ter lhe ajudado!