2
respostas

"Bug" no valor do limite

Olá pessoal! Eu tomei a liberdade de alterar o código original da aula, fazendo uma verificação na hora de realizar o saque, sendo que, quando o saldo chegasse a 0, então os próximos saques iriam subtrair o valor do limite, Ex.: saldo = 200.0, limite = 1000.0 / saque(300) / saldo = -100.0, limite = 900.0

Eu fiz vários testes no programa, e se eu realizar um saque grande de uma vez, por exemplo 800.0, o programa aceita. Mas quando eu tentei realizar vários saques de 200 em 200, ou de 100 em 100, ele diz que não tenho limite suficiente, mesmo quando ainda tinha cerca de 500.0 Vou deixar meu código aqui para vocês verem obs: Ignorem os comentários hahaha

class Conta:
    def __init__(self, numero, titular, saldo, limite):
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite


    def extrato(self):
        print(f'O saldo de {self.__titular} é de R${self.__saldo}.')

    def deposita(self, valor):
        self.__saldo += valor
        print (f'Houve um depósito de {valor}')
        return self.__saldo

    """def __pode_sacar(self, valor_do_saque):
        valor_disponivel_a_sacar = self.saldo + self.limite
        return valor_do_saque <= valor_disponivel_a_sacar"""


    def saca(self, valor):
        if valor <= (self.saldo + self.limite):
            self.__saldo -= valor
            print(f'Houve um saque de {valor}')
            if self.__saldo <0:
                self.__limite -= valor
        else:
            print("Você não tem limite suficiente!")
        #return self.saldo

    def transfere(self, valor, destino):
        self.destino = destino
        self.saca(valor)
        destino.deposita(valor)
    @property
    def saldo(self):#Get é usado para ter o retorno de algo, sempre!
        return self.__saldo

    @property
    def titular(self):
        return self.__titular.title()

    @property
    def limite(self):
        return self.__limite

    @limite.setter
    def limite(self, limite):# Set é usado para acessar um attibuto, e modificá-lo
        self.__limite = limite
# Apenas criar os métodos GET E SET quando forem realmente necessários...
    @staticmethod# São métodos pertencentes à classe, não ao objeto. Podemos acessá-los sem a necessidade
                 # de instanciarmos um objeto.
    def codigos_dos_bancos():
        return {'BB': '001', 'Caixa': '104', 'Bradesco':'237'}
    @staticmethod
    def codigo_do_banco():
        return "001"
2 respostas

Olá! Tudo bem? O problema está na condicional do método saca, porque como o saldo pode ficar negativo, a condição valor <= (self.saldo + self.limite) acaba não sendo feita como desejado, já que quando o saldo fica negativo o limite acaba sendo subtraído, então mesmo você tendo limite suficiente para fazer o saque, se a dívida no saldo for maior que o valor que você quer sacar, o saque não vai ser feito. Uma solução é adicionar uma condicional para cada caso, uma para quando é suficiente o saldo, outra para quando o saldo está positivo mas não vai ser suficiente, mais uma para quando o saldo está negativo mas ainda tem limite disponível e a última quando nem com o limite vai ser suficiente:

def saca(self, valor):

        # saldo suficiente
        if valor <= self.__saldo:
            self.__saldo -= valor
            print(f'Houve um saque de {valor}')

        # saldo está positivo, mas não vai ser suficiente
                            # garante que o saldo está positivo para não interferir na soma com o limite
        elif valor > self.__saldo  and self.__saldo > 0 and valor <= (self.__saldo + self.__limite):
            diferenca = valor - self.__saldo
            self.__saldo -= valor
            self.__limite -= diferenca
            print(f'Houve um saque de {valor}, porém seu saldo ficou negativo, então seu limite foi reduzido.')

        # saldo negativo mas limite suficiente
        elif self.__saldo < 0 and valor <= self.__limite:
            self.__limite -= valor
            self.__saldo -= valor
            print(f'Houve um saque de {valor}, como seu saldo está negativo, seu limite foi reduzido')

        # nem saldo nem limite suficientes
        else:
            print("Você não tem limite suficiente!")

O código acima vai funcionar, mas fique a vontade para fazer algumas refatorações para deixar o código melhor, principalmente nas condições, onde dá para extrair algumas delas para variáveis e também na hora de construir a mensagem exibida, já que tem trechos que se repetem nela. Espero ter ajudado!

Muitooo obrigado, funcionou!