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