Prazo de entrega recomendado:
Nesta tarefa, vamos exercitar a utilização de coleções de dados. Para isso, será necessário abstrair objetos e escolher uma representação adequada para os dados.
Um banco acaba de contratar você e deseja renovar o sistema bancário para separar as operações básicas de sua lógica de negócio das interfaces de usuário. Assim, as suas diversas formas de interação com os clientes (caixa-eletrônico, internet e aplicativo) podem acessar o mesmo conjunto de operações bancárias de uma maneira uniforme.
1. Representação em memória
Nesta etapa, sua responsabilidade é decidir sobre como representar as contas de usuário na memória para implementar algumas operações bancárias fundamentais sobre o conjunto de contas bancárias e sobre as movimentações financeiras de uma conta bancária. Como você já aprendeu, para fazer isso, é necessário estudar quais operações serão realizadas sobre os conjuntos de dados. Essas operações estão descritas nos próximos itens do enunciado.
Primeiro, você precisa descobrir quais dados devem ser armazenados para representar uma conta e cada uma das movimentações de uma conta. Depois, você deve definir como será representada as duas abstrações principais: conta e movimentação. Escolha uma representação que achar mais adequada para cada abstração (uma classe, um dicionário, ou uma tupla) e especifique quais campos e tipos armazenam cada dado associado.
Faça um desenho da representação em memória de sua estrutura de dados. O seu desenho deve exemplificar como está armazenada a coleção de contas e o conjunto de movimentações de cada conta. A sua resposta deve estar em uma imagem contas.png
ou contas.jpg
contendo o desenho da memória, que pode ser elaborado no computador ou pode ser uma fotografia. Certifique-se de deixar claro na imagem se você está utilizando classe, dicionário ou tupla em cada abstração. Deixe claro também quais campos representam cada um dos dados associados a um elemento.
2. Operações básicas
As operações sobre as contas devem estar implementadas em um arquivo contas.py
. No seu repositório, já há um arquivo de exemplo com stubs de funções de exemplo que realizam algumas operações. Você deve adaptar esse arquivo de forma adequada para a sua representação dos dados. Se tiver escolhido representar suas abstrações como classes, você pode converter funções em métodos. Além das funções sugeridas, você deve adicionar outras operações sobre as contas bancárias que forem necessárias.
a) Criar conta bancária
O módulo é responsável por criar uma nova conta. As contas são identificadas por um único elemento: o número da conta.
b) Realizar movimentação financeira
O módulo deve ser capaz de realizar uma movimentação financeira, que pode ser um depósito, um saque, um pagamento, etc. Cada movimentação tem uma data
, que é o dia em que ocorreu (e.g., representado por uma tupla com os valores do ano, mês e dia); um valor
, que é um número real positivo ou negativo dependendo do tipo de movimentação; e uma descricao
, que é um texto explicando a movimentação.
Suponha que o banco não permita que contas tenham saldo negativo, assim essa operação é realizada apenas quando o saldo resultante após a movimentação for positivo. Além disso, não é possível registrar movimentações retroativas, isso é, a data não pode ser anterior à última movimentação.
c) Consultar o saldo
Deve ser possível descobrir o saldo atual de uma conta.
3. Interface de teste
Embora o banco implementará diversos tipos de interação com os clientes, num primeiro momento, para fins de teste, será criada apenas uma interface de linha de comando, que recebe comandos a partir da entrada padrão e mostra os resultados na tela. Assim, você não precisa guardar as informações ao sair do programa.
Crie um programa interativo interface.py
que recebe uma sequência de operações. Cada operação contém uma linha com o nome da ação a ser executada e é opcionalmente seguida de uma ou mais linhas com os parâmetros da ação correspondente. As operações estão descritas em seguida.
a) Abrir uma nova conta
Para uma linha com a ação abrir
, a próxima linha possui um número de conta. Se uma conta com esse número já existir, deve-se mostrar Número de conta já existe
. Do contrário, deve-se mostrar Conta aberta com sucesso
.
b) Depositar
Para uma linha com a ação depositar
, a próxima linha possui um número de conta, o valor do depósito, uma data completa no formato DD/MM/AAAA
e a descrição da operação, que é um texto arbitrário. Deve-se contabilizar o depósito e mostrar Depósito realizado com sucesso
.
c) Sacar
Para uma linha com a ação sacar
, a próxima linha possui um número de conta, o valor do saque, uma data completa e a descrição da operação. Deve-se contabilizar o saque e mostrar Saque realizado com sucesso
. Caso o saldo da conta não seja suficiente, o programa deve mostrar Saldo insuficiente
.
d) Consultar saldo
Para uma linha com a ação saldo
, a próxima linha possui um número de conta. Deve-se computar o saldo e mostrar O saldo da conta é R$ <saldo>
, onde saldo deve ter duas casas decimais.
e) Emitir extrato
Para uma linha com a ação extrato
, a próxima linha possui um número de conta e uma data de início. O programa deve mostrar o extrato das movimentações da conta a partir desta data e mostrar uma sequência de linhas com as movimentações em ordem de realização. Para cada movimentação, devem-se mostrar três linhas:
<movimento> de valor R$ <valor> realizado em <dia>/<mes>/<ano>
Descrição adicional: <descricao>
Saldo após movimentação: R$ <saldo_apos>
onde <movimento>
deve ser Depósito
ou Saque
dependendo do tipo de movimentação, <valor>
é valor absoluto da movimentação e <saldo_apos>
corresponde ao saldo da conta logo após a movimentação.
f) Fechar conta
Para uma linha com a ação fechar
, a próxima linha possui um número de conta. Uma conta só pode ser fechada se tiver saldo zero. Se esse não for o caso, deve-se mostrar A conta não pode ser fechada
. Do contrário, deve-se mostrar Conta fechada com sucesso
.
g) Sair do programa
Para uma linha com a ação sair
, o programa deve terminar em seguida.
Controle de erros
Durante a execução das ações podem ocorrer alguns erros. Se o número da conta sendo consultada não existir, deve-se cancelar a operação atual e mostrar uma mensagem de erro Esta conta não existe
. Ainda, quando uma movimentação tiver uma data retroativa à última movimentação naquela conta, então deve-se mostrar a mensagem Movimentação tem data retroativa
.
Entrada
-
Operações básicas:
abrir 999 depositar 999 100.00 10/01/2021 Primeiro depósito depositar 999 105.00 01/10/2021 Segundo depósito saldo 999 sacar 999 180.00 03/11/2021 Pagamento abrir 123 saldo 123 sair
-
Operações arbitrárias:
abrir 111 depositar 111 500.00 10/10/2021 Depósito num. 2 depositar 111 150.00 09/10/2021 Depósito num. 1 sacar 111 151.00 12/12/2021 Pagamento saldo 1111 sacar 111 500.00 12/12/2021 Transferência PIX extrato 111 01/03/2021 sacar 111 349.00 31/12/2021 Último saque fechar 111 saldo 111 sair
Saída
-
Operações básicas:
Conta aberta com sucesso Depósito realizado com sucesso Depósito realizado com sucesso O saldo da conta é R$ 205.00 Saque realizado com sucesso Conta aberta com sucesso O saldo da conta é R$ 0.00
-
Operações arbitrárias:
Conta aberta com sucesso Depósito realizado com sucesso Movimentação tem data retroativa Saque realizado com sucesso Esta conta não existe Saldo insuficiente Depósito de valor R$ 500.00 realizado em 10/10/2021 Descrição adicional: Depósito num. 2 Saldo após movimentação: R$ 500.00 Saque de valor R$ 151.00 realizado em 12/12/2021 Descrição adicional: Pagamento Saldo após movimentação: R$ 349.00 Saque realizado com sucesso Conta fechada com sucesso Esta conta não existe
Dicas
-
Para dividir uma linha em um número limitado de partes separadas por espaço, você pode usar a função
split
com o parâmetromaxsplit
. Experimente:nome_completo = 'Arlette Pinheiro da Silva Torres' nome, segundo, sobrenome = nome_completo.split(maxsplit=2)
-
Esforce-se para que o módulo
interface.py
seja responsável apenas por manipular a entrada e saída do usuário, lendo o que ele digita e mostrando os resultados ou mensagens de erro. O motivo para isso é que o banco ainda irá implementar diversas outras interfaces (na internet, no aplicativo, no telefone, etc.) e cada uma delas deverá realizar o mesmo conjunto de operações.Por esse motivo, podemos criar funções que realizam operações auxiliares sobre as contas diretamente no arquivo
contas.py
(ou, para os mais animados, em um módulo separado chamadocontrolador.py
). Essas funções nos ajudam a processar e transformar a entrada lida na interface em elementos mais estruturados, assim como devolvendo saídas ainda bem estruturadas mas que podem ser facilmente visualizadas por qualquer interface que venhamos a implementar.No futuro, você ainda irá aprender que estamos sugerindo um padrão arquitetural chamado MVC. Nem sempre é trivial decidir quais funções devem ficar na interface, então não se preocupe tanto com isso agora, mas tente fazer o melhor.
Correção
Esta tarefa será avaliada pelo corretor automático e por um monitor, mas sem apresentação do aluno. As questões 1 e 2 serão corrigidas apenas pelo monitor. Para passar na tarefa, você precisa resolver corretamente as questões 1 e 2 e passar pelo menos nos casos de teste básicos. Os casos de teste não arbitrários não possuem erros. Lembre-se de que seu programa deverá estar organizado em funções adequadamente, cada uma com uma responsabilidade bem definida. Crie uma função principal e não execute instruções no nível global. Não serão aceitos programas desorganizados ou ilegíveis.
A pasta da tarefa no seu repositório vem inicialmente com um arquivo nao_corrigir.txt
que serve para indicar que você ainda está trabalhando nesta tarefa. Você pode realizar quantos pushes quanto forem necessários. O monitor só irá corrigir sua tarefa quando esse arquivo for removido do repositório.