1
resposta

[Sugestão] Calculando a gorjeta em um restaurante

# Criado por: MLS ***.235.***-53
import sys
import os

SEPARADOR = "=" * 40


def obter_entrada_numerica(mensagem, minimo=0, tentativas_max=3, permite_zero=False):
    """
    Função genérica para obter e validar entrada numérica.
    
    Args:
        mensagem (str): Mensagem a exibir para o usuário.
        minimo (float): Valor mínimo aceito.
        tentativas_max (int): Número máximo de tentativas.
        permite_zero (bool): Se True, aceita valores zero.
        
    Returns:
        float: Valor numérico validado.
    """
    tentativas = tentativas_max
    
    while tentativas > 0:
        try:
            valor = float(input(mensagem))
            if (valor <= minimo and not permite_zero) or (valor < minimo and permite_zero):
                print(f"Erro: O valor deve ser maior que {minimo}.")
            else:
                return valor
        except ValueError:
            print("Erro: Digite um valor numérico válido.")
        
        tentativas -= 1
        if tentativas > 0:
            print(f"Você tem {tentativas} tentativas restantes.\n")
    
    print("Número de tentativas esgotado. Encerrando o programa.")
    sys.exit(1)


def obter_total_a_pagar():
    """
    Solicita e valida o total a pagar com até 3 tentativas.
    
    Returns:
        float: Valor do total a pagar validado.
    """
    return obter_entrada_numerica("Digite o total a pagar: ")


def obter_porcentagem_personalizada():
    """
    Solicita o percentual personalizado de gorjeta.
    
    Returns:
        float: Percentual de gorjeta personalizado.
    """
    return obter_entrada_numerica("Digite a porcentagem de gorjeta: ", permite_zero=True)


def calcular_gorjeta(total, porcentagem=10):
    """
    Calcula a gorjeta baseado no percentual informado.
    
    Args:
        total (float): Valor base para calcular a gorjeta.
        porcentagem (float): Percentual de gorjeta (padrão 10%).
        
    Returns:
        float: Valor da gorjeta calculada.
    """
    return total * porcentagem / 100


def obter_opcao_gorjeta():
    """
    Solicita ao usuário se deseja pagar gorjeta padrão ou personalizada.
    Limita a 3 tentativas.
    
    Returns:
        bool: True para padrão, False para personalizada.
    """
    tentativas = 3
    
    while tentativas > 0:
        opcao = input("Deseja pagar a gorjeta padrão de 10%? (s/n): ").strip().lower()
        if opcao in ['s', 'n']:
            return opcao == 's'
        
        tentativas -= 1
        if tentativas > 0:
            print(f"Opção inválida. Você tem {tentativas} tentativas restantes.\n")
        else:
            print("Número de tentativas esgotado. Encerrando o programa.")
            sys.exit(1)


def exibir_resumo(total_a_pagar, porcentagem, gorjeta):
    """
    Exibe o resumo do pagamento com gorjeta.
    
    Args:
        total_a_pagar (float): Valor total sem gorjeta.
        porcentagem (float): Percentual de gorjeta aplicado.
        gorjeta (float): Valor da gorjeta.
    """
    total_com_gorjeta = total_a_pagar + gorjeta
    print(f"\n{SEPARADOR}")
    print(f"Total a pagar: R$ {total_a_pagar:>10.2f}")
    print(f"Gorjeta ({porcentagem}%): R$ {gorjeta:>10.2f}")
    print("-" * 40)
    print(f"TOTAL: R$ {total_com_gorjeta:>10.2f}")
    print(f"{SEPARADOR}\n")


def processar_gorjeta(total_a_pagar):
    """
    Processa a escolha e cálculo da gorjeta.
    
    Args:
        total_a_pagar (float): Valor total para calcular gorjeta.
        
    Returns:
        tuple: (gorjeta, porcentagem)
    """
    usar_padrao = obter_opcao_gorjeta()
    
    if usar_padrao:
        porcentagem = 10
    else:
        porcentagem = obter_porcentagem_personalizada()
    
    gorjeta = calcular_gorjeta(total_a_pagar, porcentagem)
    print(f"Gorjeta calculada ({porcentagem}%): R$ {gorjeta:.2f}\n")
    
    return gorjeta, porcentagem


def iniciar_sistema():
    """
    Função principal que inicia o sistema de cálculo de gorjeta.
    """
    print(SEPARADOR)
    print("Sistema Inicializado com Sucesso!")
    print(f"Versão do Python: {sys.version.split()[0]}")
    print(f"Diretório de Trabalho: {os.getcwd()}")
    print(f"{SEPARADOR}\n")
    
    total_a_pagar = obter_total_a_pagar()
    gorjeta, porcentagem = processar_gorjeta(total_a_pagar)
    exibir_resumo(total_a_pagar, porcentagem, gorjeta)


if __name__ == "__main__":
    iniciar_sistema()
1 resposta

Oi, Marinaldo, como vai?

O seu código está excelente, apresentando uma estrutura extremamente organizada, modularizada com funções bem definidas e com boas práticas de programação, como o tratamento de exceções com try-except e a inclusão de docstrings para documentação. Você foi além da proposta inicial da atividade e desenvolveu um sistema completo e robusto, incluindo controle de tentativas de entrada e suporte para gorjetas personalizadas ou no valor padrão de 10%.

Parabéns pelo excelente projeto desenvolvido e por compartilhar sua solução detalhada aqui no fórum, que certamente serve de inspiração para outros estudantes. Lembre-se de que o fórum está sempre à disposição para você compartilhar suas evoluções e tirar dúvidas.

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