image

Access unlimited bootcamps and 650+ courses forever

60
%OFF
Luis Ramos
Luis Ramos02/10/2024 16:46
Share

3° Desafio de Projeto: Modelando o Sistema Bancário em POO com Python

  • #Python

Este artigo irá explicar, de maneira simples e passo a passo, como funciona o código feito para o Desafio Modelando o Sistema Bancário em POO com Python. O código foi feito utilizando a linguagem Python e serve como um excelente exemplo de programação orientada a objetos (POO).

Objetivo

O programa permite que um banco gerencie **usuários** e **contas bancárias**. O usuário pode realizar operações como:

- Criar novos usuários.

- Criar novas contas.

- Fazer depósitos e saques.

- Consultar o extrato.

- Listar todas as contas.

Vamos analisar cada parte do código para entender seu funcionamento.

1. Importação de Módulos

import textwrap

O módulo textwrap é utilizado para formatar texto, removendo indentação e deixando as saídas do programa mais bonitas e fáceis de ler.

2. Classe Usuario

A classe Usuario define os dados básicos de um cliente no banco, como nome, CPF, data de nascimento e endereço.

class Usuario:
  def __init__(self, nome, data_nascimento, cpf, endereco):
    self.nome = nome
    self.data_nascimento = data_nascimento
    self.cpf = cpf
    self.endereco = endereco

O método __init__ é o construtor da classe, responsável por inicializar um novo usuário. Quando um objeto Usuario é criado, esse método define suas informações básicas (nome, CPF, etc.).

Função criar_usuario



def criar_usuario(usuarios):
  cpf = input("Informe o CPF (somente número): ")
  if Usuario.filtrar_usuario(cpf, usuarios):
    print("\n@@@ Já existe usuário com esse CPF! @@@")
    return None

Essa função permite a criação de novos usuários. Ela recebe a lista de usuarios como parâmetro e verifica se já existe um usuário com o CPF informado. Caso contrário, coleta as demais informações e adiciona um novo usuário à lista.

Função filtrar_usuario

def filtrar_usuario(cpf, usuarios):
  for usuario in usuarios:
    if usuario.cpf == cpf:
      return usuario
  return None

Essa função faz a busca de um usuário baseado no CPF, retornando o objeto correspondente ou None se o CPF não for encontrado.

3. Classe Conta

A classe Conta representa a conta bancária de um usuário, armazenando informações como saldo, número da conta, limite de saque, extrato e o titular da conta (que é um objeto Usuario).

class Conta:
  def __init__(self, agencia, numero_conta, usuario):
    self.agencia = agencia
    self.numero_conta = numero_conta
    self.usuario = usuario
    self.saldo = 0
    self.limite = 500
    self.extrato = ""
    self.numero_saques = 0
    self.LIMITE_SAQUES = 3

Aqui o construtor da classe inicializa a conta com uma agência, número, saldo e define um limite de saques e de saldo.

Função depositar

def depositar(self, valor):
  if valor > 0:
    self.saldo += valor
    self.extrato += f"Depósito:\tR$ {valor:.2f}\n"
    print("\n=== Depósito realizado com sucesso! ===")
  else:
    print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

Essa função adiciona um valor ao saldo da conta e registra a transação no extrato.

Função sacar

def sacar(self, valor):
  if valor > self.saldo:
    print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")
  elif valor > self.limite:
    print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")
  elif self.numero_saques >= self.LIMITE_SAQUES:
    print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")
  elif valor > 0:
    self.saldo -= valor
    self.extrato += f"Saque:\t\tR$ {valor:.2f}\n"
    self.numero_saques += 1
    print("\n=== Saque realizado com sucesso! ===")
  else:
    print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

Essa função realiza um saque, verificando várias condições, como se o valor do saque é maior que o saldo, se excede o limite ou se o número de saques diários foi ultrapassado.

Função exibir_extrato

def exibir_extrato(self):
  print("\n================ EXTRATO ================")
  print("Não foram realizadas movimentações." if not self.extrato else self.extrato)
  print(f"\nSaldo:\t\tR$ {self.saldo:.2f}")
  print("==========================================")

Essa função exibe o extrato da conta, mostrando todas as transações realizadas e o saldo atual.

4. Classe Banco

A classe Banco é a responsável por gerenciar as contas e os usuários.

class Banco:
  def __init__(self):
    self.usuarios = []
    self.contas = []
    self.AGENCIA = "0001"

Aqui, o banco possui uma lista de usuários e contas, além de definir uma agência padrão.

Função criar_conta

def criar_conta(self):
  cpf = input("Informe o CPF do usuário: ")
  usuario = Usuario.filtrar_usuario(cpf, self.usuarios)
  if usuario:
    numero_conta = len(self.contas) + 1
    conta = Conta(self.AGENCIA, numero_conta, usuario)
    self.contas.append(conta)
    print("\n=== Conta criada com sucesso! ===")
    return conta
  print("\n@@@ Usuário não encontrado! @@@")
  return None

Essa função cria uma nova conta associada a um usuário existente.

Função listar_contas

def listar_contas(self):
  for conta in self.contas:
    linha = f"""\ 
      Agência:\t{conta.agencia}
      C/C:\t\t{conta.numero_conta}
      Titular:\t{conta.usuario.nome}
    """
    print("=" * 100)
    print(textwrap.dedent(linha))

Essa função lista todas as contas cadastradas no banco, exibindo a agência, número da conta e o nome do titular.

5. Função Principal main

def main():
  banco = Banco()
  while True:
    opcao = menu()
    if opcao == "d":
      numero_conta = int(input("Informe o número da conta: "))
      conta = banco.contas[numero_conta - 1]
      valor = float(input("Informe o valor do depósito: "))
      conta.depositar(valor)

A função main() controla o fluxo principal do programa, exibindo o menu e executando as ações conforme a escolha do usuário.

Conclusão

Este código oferece uma base sólida para entender como funciona a **orientação a objetos** em Python. O conceito de classes, métodos e a interação entre elas é fundamental para projetos maiores e mais complexos.

Share
Comments (0)