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 valida_renda_mensal_minima(renda_mensal: float, renda_mensal_minima: float) -> bool:
"""
Verifica se a renda mensal informada é maior do que a renda mínima exigida.
Args:
renda_mensal: O valor da renda mensal do solicitante.
renda_mensal_minima: O valor mínimo de renda exigido para aprovação.
Returns:
True: Se a `renda_mensal` for maior que a `renda_mensal_minima`.
False: Caso contrário.
Raises:
ValueError: Se `renda_mensal` ou `renda_mensal_minima` for menor ou igual a zero.
"""
if not renda_mensal > 0:
raise ValueError('"renda_mensal" deve ser, obrigatóriamente, maior que zero.')
if not renda_mensal_minima > 0:
raise ValueError('"renda_mensal_minima" deve ser, obrigatóriamente, maior que zero.')
if renda_mensal > renda_mensal_minima:
return True
return False
def valida_parcela_mensal(parcela: float, renda_mensal: float, aliquota_maxima: float) -> bool:
"""
Verifica se o valor da parcela mensal desejada está dentro do limite máximo
permitido, baseado na renda mensal e em uma alíquota máxima.
O limite é calculado como: (renda_mensal * (aliquota_maxima / 100)).
Args:
parcela: O valor da parcela mensal desejada.
renda_mensal: O valor da renda mensal do solicitante.
aliquota_maxima: O percentual máximo da renda que pode ser comprometido com a parcela.
Returns:
True: Se a `parcela` for menor ou igual ao limite de comprometimento da renda.
False: Caso contrário.
Raises:
ValueError: Se `parcela`, `renda_mensal` ou `aliquota_maxima` for menor ou igual a zero.
"""
if not parcela > 0:
raise ValueError('"parcela" deve ser, obrigatóriamente, maior que zero.')
if not renda_mensal > 0:
raise ValueError('"renda_mensal" deve ser, obrigatóriamente, maior que zero.')
if not aliquota_maxima > 0:
raise ValueError('"aliquota_maxima" deve ser, obrigatóriamente, maior que zero.')
if parcela <= (renda_mensal * (aliquota_maxima / 100)):
return True
return False
def main() -> None:
"""
Função principal que simula a validação de um pedido de empréstimo.
O processo envolve:
1. Coletar a renda mensal e o valor da parcela desejada.
2. Validar se a renda é maior que o mínimo exigido (RENDA_MENSAL_MINIMA).
3. Validar se a parcela não excede o percentual máximo da renda (ALIQUOTA_MAXIMA).
4. Exibir o resultado da aprovação ou negação.
"""
RENDA_MENSAL_MINIMA: float = 2000.0
ALIQUOTA_MAXIMA: float = 30.0
renda_mensal: float = 0
parcela_mensal: float = 0
while True:
try:
renda_mensal = pega_float('\nDigite o valor da sua renda mensal: ')
if not renda_mensal > 0:
print('A renda mensal precisa ser maior que zero.')
continue
break
except ValueError as e:
print(e)
while True:
try:
parcela_mensal = pega_float('\nDigite o valor da parcela desejada: ')
if not parcela_mensal > 0:
print('A parcela mensal precisa ser maior que zero.')
continue
break
except ValueError as e:
print(e)
if not valida_renda_mensal_minima(renda_mensal, RENDA_MENSAL_MINIMA):
print('Empréstimo negado: renda mensal insuficiente.')
elif not valida_parcela_mensal(parcela_mensal, renda_mensal, ALIQUOTA_MAXIMA):
print(f'Empréstimo negado: parcela acima de {ALIQUOTA_MAXIMA}% da renda')
else:
print('Empréstimo aprovado!')
if __name__ == '__main__':
main()