Implemente programas para os problemas descritos a seguir.
Crie um programa para simular uma aplicação bancária. O banco possui clientes com contas bancárias (Conta). Além disso, existem outros dois tipos de contas que compartilham informações da conta base, mas que possuem suas próprias peculiaridades: conta especial (ContaEspecial) e conta poupança (ContaPoupanca). As funcionalidades de cada uma são descritas a seguir, mas caso seja necessário, novos atributos e métodos podem ser adicionados.
Conta ContaPoupanca ContaEspecial
Atributos Cliente: Nome completo <br> Saldo: Saldo da conta Taxa: Taxa de rendimento <br> fixada pelo banco para todos os <br> clientes Limite: Cada cliente <br> possui um limite especial, <br> limitado emno máximo <br> R$10.000,00
Métodos Sacar: Retirar do saldo <br> (não pode deixar a conta <br> negativa) <br> Depositar: Colocar no <br> saldo Atualizar: Atualiza o saldo <br> baseado na taxa definida Sacar: Reimplementar a <br> funcionalidade levando <br> em consideração o novo <br> limite
O programa deve prover as seguintes funcionalidades:
  • Abrir contas de qualquer tipo para novos clientes
  • Exibir informações de uma determinada conta com o saldo (busca deverá ser feita pelo nome do cliente)
  • Atualizar o saldo da conta poupança de todos os clientes
  • Sacar ou depositar valores em uma determinada conta
    Dica: Na classe que contiver o método principal crie 3 Arrays que

Passo 1

Beleza, vamos lá! Você quer criar um programa que simula uma aplicação bancária. O banco tem clientes com contas básicas e dois tipos especiais de contas: Conta Poupança e Conta Especial. Vamos usar conceitos de Programação Orientada a Objetos (POO) como classes e herança para organizar tudo isso. Precisaremos definir as classes com seus atributos e métodos, além de implementar funcionalidades como abrir contas, exibir informações, atualizar saldos e realizar saques ou depósitos.

Passo 2

Primeiro, vamos criar a classe Conta, que será a base para os outros tipos de contas. Ela vai ter dois atributos principais: cliente (nome completo do cliente) e saldo (o saldo da conta). Além disso, vamos adicionar os métodos sacar e depositar.
class Conta:
    def __init__(self, cliente, saldo=0):
        self.cliente = cliente
        self.saldo = saldo

    def sacar(self, valor):
        if self.saldo >= valor:
            self.saldo -= valor
            print(f"Saque de R${valor:.2f} realizado com sucesso.")
        else:
            print("Saldo insuficiente para o saque.")

    def depositar(self, valor):
        self.saldo += valor
        print(f"Depósito de R${valor:.2f} realizado com sucesso.")
Aqui, criamos o construtor __init__ para inicializar o nome do cliente e o saldo (que começa em 0 por padrão). O método sacar verifica se há saldo suficiente antes de descontar o valor, e o método depositar simplesmente adiciona o valor ao saldo.

Passo 3

Agora, vamos criar a classe ContaPoupanca que herda da Conta. Além dos atributos da classe base, ela tem uma taxa de rendimento. Também vamos adicionar o método atualizar para atualizar o saldo com base nessa taxa.
class ContaPoupanca(Conta):
    def __init__(self, cliente, saldo=0, taxa=0.01):
        super().__init__(cliente, saldo)
        self.taxa = taxa  # Taxa de rendimento, por exemplo, 1%

    def atualizar(self):
        rendimento = self.saldo * self.taxa
        self.saldo += rendimento
        print(f"Saldo atualizado com rendimento de R${rendimento:.2f}. Novo saldo: R${self.saldo:.2f}")
Usamos super().__init__ para aproveitar o construtor da classe base. A taxa é definida como 1% por padrão, mas pode ser alterada se necessário. O método atualizar calcula o rendimento e atualiza o saldo.

Passo 4

Em seguida, vamos criar a classe ContaEspecial, que também herda da Conta. Ela possui um atributo adicional limite, que é o limite especial da conta, com máximo de R$10.000,00. Precisamos reimplementar o método sacar para considerar esse limite.
class ContaEspecial(Conta):
    def __init__(self, cliente, saldo=0, limite=10000):
        super().__init__(cliente, saldo)
        self.limite = limite  # Limite especial, até R$10.000,00

    def sacar(self, valor):
        if self.saldo + self.limite >= valor:
            self.saldo -= valor
            print(f"Saque de R${valor:.2f} realizado com sucesso.")
            print(f"Saldo atual: R${self.saldo:.2f}")
        else:
            print("Saldo e limite insuficientes para o saque.")
No método sacar, verificamos se o valor do saque está dentro do saldo mais o limite. Se sim, permite o saque mesmo que o saldo fique negativo, respeitando o limite.

Passo 5

Agora, vamos implementar as funcionalidades principais do programa:
  1. Abrir contas de qualquer tipo para novos clientes
  2. Exibir informações de uma conta pelo nome do cliente
  3. Atualizar o saldo das contas poupança
  4. Sacar ou depositar valores em uma conta específica
Vamos organizar as contas em três listas separadas: contas, contas_poupanca e contas_especial.
def main():
    contas = []
    contas_poupanca = []
    contas_especial = []

    while True:
        print("\n--- Banco Simples ---")
        print("1. Abrir Conta")
        print("2. Exibir Informações da Conta")
        print("3. Atualizar Contas Poupança")
        print("4. Sacar/Depositar")
        print("5. Sair")

        escolha = input("Escolha uma opção: ")

        if escolha == '1':
            tipo = input("Tipo de conta (1 - Conta, 2 - Conta Poupança, 3 - Conta Especial): ")
            nome = input("Nome do cliente: ")
            saldo = float(input("Saldo inicial: "))
            if tipo == '1':
                conta = Conta(nome, saldo)
                contas.append(conta)
                print("Conta criada com sucesso!")
            elif tipo == '2':
                taxa = float(input("Taxa de rendimento (ex: 0.01 para 1%): "))
                conta_poupanca = ContaPoupanca(nome, saldo, taxa)
                contas_poupanca.append(conta_poupanca)
                print("Conta Poupança criada com sucesso!")
            elif tipo == '3':
                limite = float(input("Limite especial (até R$10.000,00): "))
                if limite > 10000:
                    print("Limite excede o máximo permitido de R$10.000,00.")
                else:
                    conta_especial = ContaEspecial(nome, saldo, limite)
                    contas_especial.append(conta_especial)
                    print("Conta Especial criada com sucesso!")
            else:
                print("Opção inválida.")

        elif escolha == '2':
            nome = input("Nome do cliente para busca: ")
            encontrada = False
            for conta in contas:
                if conta.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta ---\nCliente: {conta.cliente}\nSaldo: R${conta.saldo:.2f}")
                    encontrada = True
            for cp in contas_poupanca:
                if cp.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta Poupança ---\nCliente: {cp.cliente}\nSaldo: R${cp.saldo:.2f}\nTaxa de Rendimento: {cp.taxa*100:.2f}%")
                    encontrada = True
            for ce in contas_especial:
                if ce.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta Especial ---\nCliente: {ce.cliente}\nSaldo: R${ce.saldo:.2f}\nLimite Especial: R${ce.limite:.2f}")
                    encontrada = True
            if not encontrada:
                print("Conta não encontrada.")

        elif escolha == '3':
            for cp in contas_poupanca:
                cp.atualizar()
            print("Todas as contas poupança foram atualizadas.")

        elif escolha == '4':
            nome = input("Nome do cliente: ")
            operacao = input("Operação (1 - Sacar, 2 - Depositar): ")
            valor = float(input("Valor: "))
            encontrada = False
            # Verificar em Conta
            for conta in contas:
                if conta.cliente.lower() == nome.lower():
                    if operacao == '1':
                        conta.sacar(valor)
                    elif operacao == '2':
                        conta.depositar(valor)
                    encontrada = True
            # Verificar em Conta Poupança
            for cp in contas_poupanca:
                if cp.cliente.lower() == nome.lower():
                    if operacao == '1':
                        cp.sacar(valor)
                    elif operacao == '2':
                        cp.depositar(valor)
                    encontrada = True
            # Verificar em Conta Especial
            for ce in contas_especial:
                if ce.cliente.lower() == nome.lower():
                    if operacao == '1':
                        ce.sacar(valor)
                    elif operacao == '2':
                        ce.depositar(valor)
                    encontrada = True
            if not encontrada:
                print("Conta não encontrada.")

        elif escolha == '5':
            print("Encerrando o programa. Até mais!")
            break

        else:
            print("Opção inválida. Tente novamente.")
*Explicamos cada funcionalidade dentro do loop principal:
  • Abrir Conta: Pergunta o tipo de conta e cria a respectiva instância, adicionando à lista correspondente.
  • Exibir Informações: Busca o cliente nas três listas e exibe as informações se encontrar.
  • Atualizar Contas Poupança: Chama o método atualizar para cada conta poupança.
  • Sacar/Depositar: Busca a conta pelo nome e realiza a operação escolhida.
  • Sair: Encerra o programa.*

Resposta

Aqui está o código completo para a simulação da aplicação bancária:
class Conta:
    def __init__(self, cliente, saldo=0):
        self.cliente = cliente
        self.saldo = saldo

    def sacar(self, valor):
        if self.saldo >= valor:
            self.saldo -= valor
            print(f"Saque de R${valor:.2f} realizado com sucesso.")
        else:
            print("Saldo insuficiente para o saque.")

    def depositar(self, valor):
        self.saldo += valor
        print(f"Depósito de R${valor:.2f} realizado com sucesso.")

class ContaPoupanca(Conta):
    def __init__(self, cliente, saldo=0, taxa=0.01):
        super().__init__(cliente, saldo)
        self.taxa = taxa  # Taxa de rendimento, por exemplo, 1%

    def atualizar(self):
        rendimento = self.saldo * self.taxa
        self.saldo += rendimento
        print(f"Saldo atualizado com rendimento de R${rendimento:.2f}. Novo saldo: R${self.saldo:.2f}")

class ContaEspecial(Conta):
    def __init__(self, cliente, saldo=0, limite=10000):
        super().__init__(cliente, saldo)
        self.limite = limite  # Limite especial, até R$10.000,00

    def sacar(self, valor):
        if self.saldo + self.limite >= valor:
            self.saldo -= valor
            print(f"Saque de R${valor:.2f} realizado com sucesso.")
            print(f"Saldo atual: R${self.saldo:.2f}")
        else:
            print("Saldo e limite insuficientes para o saque.")

def main():
    contas = []
    contas_poupanca = []
    contas_especial = []

    while True:
        print("\n--- Banco Simples ---")
        print("1. Abrir Conta")
        print("2. Exibir Informações da Conta")
        print("3. Atualizar Contas Poupança")
        print("4. Sacar/Depositar")
        print("5. Sair")

        escolha = input("Escolha uma opção: ")

        if escolha == '1':
            tipo = input("Tipo de conta (1 - Conta, 2 - Conta Poupança, 3 - Conta Especial): ")
            nome = input("Nome do cliente: ")
            saldo = float(input("Saldo inicial: "))
            if tipo == '1':
                conta = Conta(nome, saldo)
                contas.append(conta)
                print("Conta criada com sucesso!")
            elif tipo == '2':
                taxa = float(input("Taxa de rendimento (ex: 0.01 para 1%): "))
                conta_poupanca = ContaPoupanca(nome, saldo, taxa)
                contas_poupanca.append(conta_poupanca)
                print("Conta Poupança criada com sucesso!")
            elif tipo == '3':
                limite = float(input("Limite especial (até R$10.000,00): "))
                if limite > 10000:
                    print("Limite excede o máximo permitido de R$10.000,00.")
                else:
                    conta_especial = ContaEspecial(nome, saldo, limite)
                    contas_especial.append(conta_especial)
                    print("Conta Especial criada com sucesso!")
            else:
                print("Opção inválida.")

        elif escolha == '2':
            nome = input("Nome do cliente para busca: ")
            encontrada = False
            for conta in contas:
                if conta.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta ---\nCliente: {conta.cliente}\nSaldo: R${conta.saldo:.2f}")
                    encontrada = True
            for cp in contas_poupanca:
                if cp.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta Poupança ---\nCliente: {cp.cliente}\nSaldo: R${cp.saldo:.2f}\nTaxa de Rendimento: {cp.taxa*100:.2f}%")
                    encontrada = True
            for ce in contas_especial:
                if ce.cliente.lower() == nome.lower():
                    print(f"\n--- Informações da Conta Especial ---\nCliente: {ce.cliente}\nSaldo: R${ce.saldo:.2f}\nLimite Especial: R${ce.limite:.2f}")
                    encontrada = True
            if not encontrada:
                print("Conta não encontrada.")

        elif escolha == '3':
            for cp in contas_poupanca:
                cp.atualizar()
            print("Todas as contas poupança foram atualizadas.")

        elif escolha == '4':
            nome = input("Nome do cliente: ")
            operacao = input("Operação (1 - Sacar, 2 - Depositar): ")
            valor = float(input("Valor: "))
            encontrada = False
            # Verificar em Conta
            for conta in contas:
                if conta.cliente.lower() == nome.lower():
                    if operacao == '1':
                        conta.sacar(valor)
                    elif operacao == '2':
                        conta.depositar(valor)
                    encontrada = True
            # Verificar em Conta Poupança
            for cp in contas_poupanca:
                if cp.cliente.lower() == nome.lower():
                    if operacao == '1':
                        cp.sacar(valor)
                    elif operacao == '2':
                        cp.depositar(valor)
                    encontrada = True
            # Verificar em Conta Especial
            for ce in contas_especial:
                if ce.cliente.lower() == nome.lower():
                    if operacao == '1':
                        ce.sacar(valor)
                    elif operacao == '2':
                        ce.depositar(valor)
                    encontrada = True
            if not encontrada:
                print("Conta não encontrada.")

        elif escolha == '5':
            print("Encerrando o programa. Até mais!")
            break

        else:
            print("Opção inválida. Tente novamente.")

if __name__ == "__main__":
    main()
Para rodar o programa, simplesmente execute o script Python. Ele apresentará um menu interativo onde você pode escolher as opções desejadas, como abrir contas, exibir informações, atualizar saldos das contas poupança e realizar saques ou depósitos. As contas são armazenadas em listas separadas conforme o tipo, facilitando a gestão das diferentes funcionalidades.

Exercícios relacionados

Para cada um dos problemas abaixo, desenhe uma hierarquia de classes que as represente. Não deve-se implementar nenhum código.
a) Considere uma universidade com alunos. Os alunos podem ser de graduação e de pós-graduação. Os alunos de graduação podem ser calouros, intermediários ou formandos. Os alunos de pós-graduação podem ser de mestrado ou de doutorado.
Implemente:
b) Uma subclasse de MeioDeTransporte chamada Carro. Carro deve ter os atributos marca (String), nome (String) e quilometragem (tipo int) e os métodos necessários para ler os atributos e alterá-los (get e set). A quilometragem não pode ser negativa, nem ultrapassar o valor 999999. A velocidade do Carro não pode ser negativa, nem ultrapassar 200.
Para cada um dos problemas abaixo, desenhe uma hierarquia de classes que as represente. Não deve-se implementar nenhum código.
b) Considere as várias formas existentes no universo. As formas podem ser bidimensionais ou tridimensionais. Quadrilateral, elíptica e triangular são formas bidimensionais. Um trapezoidee um paralelogramo são quadrilaterais, enquanto um círculo é uma elipse. Um quadrado é um tipo de retângulo, que esse por sua vez é um tipo de paralelogramo. Já esfera, cone, cubo, cilindro, prisma são objetos tridimensionais.
Descreva os principais algoritmos envolvidos na solução proposta;