Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Aplicativo: Simulação simples de conta bancária


Aplicativo: Conta bancária/Caixa eletrônico simples em Java

Crie um protótipo de caixa eletrônico na linguagem de programação Java. No início, ele pede seu nome e valor $$ inicial que tem na conta. O programa deve fornecer um número de até 4 dígitos - número da conta - para o usuário (use Random). Esses dados serão usados para criar um objeto da classe "Conta.java"

A seguir, mostra um menu com as opções (esse menu deverá ser um método):
- Extrato: exibe o nome, número da conta, saldo e quantos saques já foram realizados
- Sacar: recebe o valor a ser sacado, informa se pode ser sacado (não pode ficar negativo) e mostra o saldo
- Depositar: recebe o valor a ser depositado e mostra o novo saldo
- Sair

Esse menu aparece até o usuário escolher sair. As outras opções são métodos que devem fazer parte da "Conta.java" (setters e getters). Note que o usuário pode sacar no máximo 5 vezes por dia.


Nesse exercício não vamos usar explicitamente as palavras 'set' e 'get' nos nomes dos métodos. Mas isso não é necessário. O que vamos usar é sua ideia: a ideia por trás do 'set' é a de alterar valores de variáveis, pra isso vamos usar os métodos 'sacar' e 'depositar', que altera o valor do saldo ; a ideia por trás do 'get' é de simplesmente obter informações das variáveis, como é o caso do método 'extrato'.

Use a main só para iniciar o aplicativo

Inicialmente, no nosso arquivo "Caixa.java", que contém a 'main', criamos uma conta, pedindo um nome e um valor inicial.
Através do comando: 1 + numero.nextInt(9999) nós sorteamos um número de conta de até 4 dígitos (nextInt(9999) gera números de 0 até 9998, somando 1 gera de 1 até 9999).
Com esses dados, criamos uma conta, que na verdade é o objeto 'minhaConta' da classe "Conta.java".
Iniciamos nosso banco ou caixa eletrônico através do método 'iniciar()'.

Note que tentamos enxugar a 'main', pois é uma boa prática. No geral, ela é usada apenas como 'gatilho', pra começar o programa e não pra ser enchida de variáveis e linhas de código.
Vamos pra classe "Conta.java".


Sistema bancário simples em Java

Nossos atributos (variáveis) são: nome, saldo, conta e saques.
Aqui vamos usar a real função do construtor: inicializar as variáveis. Nesse caso é obrigatório, pois não tem como, em um sistema bancário, criar uma conta sem ter - no mínimo - esses dados.

Vamos ver agora os principais métodos desse sistema bancário:
extrato()
Método simples, que exibe todas as informações do usuário.

sacar(int valor)
Esse método altera a variável 'saldo'. No caso, ele reduz ela.
Porém, só faz sentido reduzir (tirar dinheiro), se 'valor' for menor que  o 'saldo', por isso é feito um tratamento através do teste condicional if.
Caso seja possível realizar o saque, devemos incrementar a variável 'saques', para termos controle do número de saques realizados. Caso não seja possível, exibimos uma mensagem informando o problema e nada ocorre.
Ou seja, é um belo exemplo de como usar o método set.

depositar(int valor)
Simplesmente adiciona um valor ao saldo atual.

iniciar()
Aqui é a tela inicial de nosso Caixa Eletrônico Progressivo Java.
Ele usa um laço do while que irá rodar o mini-sistema bancário enquanto o usuário não selecionar a opção de sair, que é o número 4 ( while(opcao != 4 ) ).
A cada iteração é exibido o menu através do método exibeMenu(), é pedido uma entrada (número) ao usuário e esse número é enviado para o método que vai direcionar o programa para a opção escolhida pelo usuário, o escolheOpcao().

exibeMenu()
Um método simples desse sistema bancário é o 'exibeMenu()', que não recebe nenhum argumento nem retorna nenhuma variável. Como o nome diz, ele simplesmente exibe a lista de opções de nosso sistema.

escolheOpcao(int opcao)
Vamos realmente escolher a opção que queremos no método 'escolheOpcao', que recebe um número.
Mas que número é esse?
Ora, é o referente ao menu. Você vê as opções, entra com o número e esse método serve pra escolher a opção desejada.
Escolher opção...isso te lembra algo? Sim, o comando switch.
Caso tenha escolhido a opção 1, eles nos envia para o método 'extrato()'.
Caso seja a 2, deveria ir para o método 'sacar()', porém não é sempre que podemos sacar. Só podemos se tivermos realizado menos de 3 saques.
Caso seja possível realizar o saque, tanto o caso 2 com o caso 3 devem receber um valor do usuário, que é o montante que vai ser sacado ou depositado.
O case 4 é para encerrar o sistema e qualquer outra opção cai na default que acusa como erro.


Código fonte Java do Aplicativo

Caixa.java
import java.util.Scanner;
import java.util.Random;

public class Caixa {
    
    
    public static void main(String[] args){
        // Declarando as variáveis, Scanner e Random
        String nome;
        double inicial;
        Scanner entrada = new Scanner(System.in);
        Random numero = new Random();
        int conta = 1 + numero.nextInt(9999);
    
        //Obtendo os dados iniciais do Cliente
        System.out.println("Cadastrando novo cliente.");
        System.out.print("Ente com seu nome: ");
        nome = entrada.nextLine();
        
        System.out.print("Entre com o valor inicial depositado na conta: ");
        inicial = entrada.nextDouble();
        
        //Criando a conta de um cliente
        Conta minhaConta = new Conta(nome, conta, inicial);
        minhaConta.iniciar();
    }
    
}

Conta.java
import java.util.Scanner;

public class Conta {
    private String nome;
    private int conta, saques;
    private double saldo;
    Scanner entrada = new Scanner(System.in);
    
    public Conta(String nome, int conta, double saldo_inicial){
        this.nome=nome;
        this.conta=conta;
        saldo=saldo_inicial;
        saques=0;
    }
    
    public void extrato(){
        System.out.println("\tEXTRATO");
        System.out.println("Nome: " + this.nome);
        System.out.println("Número da conta: " + this.conta);
        System.out.printf("Saldo atual: %.2f\n",this.saldo);
        System.out.println("Saques realizados hoje: " + this.saques + "\n");
        
    }
    
    public void sacar(double valor){
        if(saldo >= valor){
            saldo -= valor;
            saques++;
            System.out.println("Sacado: " + valor);
            System.out.println("Novo saldo: " + saldo + "\n");
        } else {
            System.out.println("Saldo insuficiente. Faça um depósito\n");
        }
    }
    
    public void depositar(double valor)
    {
        saldo += valor;
        System.out.println("Depositado: " + valor);
        System.out.println("Novo saldo: " + saldo + "\n");
    }
    
    public void iniciar(){
        int opcao;

        do{
            exibeMenu();
            opcao = entrada.nextInt();
            escolheOpcao(opcao);
        }while(opcao!=4);
    }
    
    public void exibeMenu(){
        
        System.out.println("\t Escolha a opção desejada");
        System.out.println("1 - Consultar Extrato");
        System.out.println("2 - Sacar");
        System.out.println("3 - Depositar");
        System.out.println("4 - Sair\n");
        System.out.print("Opção: ");
        
    }
    
    public void escolheOpcao(int opcao){
        double valor;
        
        switch( opcao ){
            case 1:    
                    extrato();
                    break;
            case 2: 
                    if(saques<3){
                        System.out.print("Quanto deseja sacar: ");
                        valor = entrada.nextDouble();
                        sacar(valor);
                    } else{
                        System.out.println("Limite de saques diários atingidos.\n");
                    }
                    break;
                    
            case 3:
                    System.out.print("Quanto deseja depositar: ");
                    valor = entrada.nextDouble();
                    depositar(valor);
                    break;
                    
            case 4: 
                    System.out.println("Sistema encerrado.");
                    break;
                    
            default:
                    System.out.println("Opção inválida");
        }
    }
}

Treinamento Hacker:
Encontre falhas, brechas e erros no aplicativo acima.
As respostas estão em cor branca, logo abaixo, bastando selecionar o texto para visualizar.
Porém, não olhe antes de tentar pensar bastante.




Não foi feito tratamento de erros, para adivinhar as bobagens que os usuários podem digitar.

Por exemplo, se digitar letra onde é pedido número, o sistema irá colapsar.

Note que os valores recebidos pelos métodos 'sacar' e 'depositar' devem ser positivos. Porém, não fizemos nada para checar isso, sendo portanto, possível burlar esse 'banco'.
Por exemplo, saque um valor negativo, de  -1 milhão de reais e terá 1 milhão de reais em sua conta ;)
Deve ser por isso que não existe o botão com o símbolo '-' no teclado dos bancos...

Do mesmo modo, podemos depositar valores negativos em nossa conta. Mas quem faria isso?

23 comentários:

José Guilherme disse...

Gostei muito! É um aplicativo simples e muito bom para quem está iniciando. Valeu!

Anônimo disse...


Outras falhas...
1 - Clientes com caracteres invisíveis...

2- aceita deposito com valor negativo.

3- posteriormente o saldo nunca zera....

Muito bom parabéns !!!

Unknown disse...

como faz pra aparecer a hora do levamtamento???

Anônimo disse...

Em um sistema bancário teria que registrar vários usuários. Como posso fazer para cadastrar e armazenar os dados de cada usuário, e então recorrer a esses dados quando fornecidos o número da conta e uma senha, por exemplo?

Apostila Java Progressivo disse...

Bom,

O exemplo Java mostrado nesse exemplo é bem básico mesmo. Para cadastro e armazenamento de usuários, e seus dados, teria que se usar Banco de Dados.

Uma maneira simples para fazer isso, é ir armazenando os dados em arquivo de texto, por exemplo.

Felipe Chierice disse...

Muito bom esse Java Progressivo... Estou aprendendo java de verdade! Eu até consegui fazer esse sistema de banco, dêem uma olhada para ver oque acharam: http://pastebin.com/Ak6DQhXa

E outra coisa, eu tenho uma dúvida, alguem pode me fala como que faz para que, ao invez do systema colapsar ao colocar uma letra ou palavra no lugar que é pra por numeros, como no caso de colocar valor inicial da conta bancária, mostrar uma menságem que só é permitido números? Obrigado galera! :D

Apostila Java Progressivo disse...

Olá Felipe, obrigado pelos elogios e por compartilhar com todos seu código.

Você poderá fazer uma aplicação mais robusta usando as classes sobre Strings (String e StringBuilder) e sobre caracteres (Character).

O que é mais usado é uma coisa chamada Expressões Regulares, ou Regex, que é universal, existe em todas as linguagens e são muito usadas.

Tulio.xcrtf disse...

Olá a todos, quero inicialmente parabenizar o(s) criador(es) do JavaProgressivo, está sendo bastante proveitoso acompanhar as aulas e seus exercícios e também venho fazer um pedido aos que cuidam das aulas e dos conteúdos, seria possível abordar o tema de deslocamento de bits ? Ficarei muito grato caso sim, e creio que outras pessoas também.

No Treinamento Hacker, tenho uma sugestão a fazer, no Random entre 1 - 9999, poderá ocasionar na geração de um número com apenas um digito, dois ou três, assim não seguindo a informação de 4 digitos na conta, uma possível solução seria:

int random = r.nextInt(9999);
while(random < 1000)
random = r.nextInt(9999);

Assim gerando um novo número caso o número gerado não possua os 4 dígitos.

Apostila Java Progressivo disse...

Olá Tulio, obrigado pelos elogios.
Anotamos seu pedido.

Quanto a sua sugestão, nós dissemos que a conta poderia ser de até 4 dígitos (se for 1, 2 ou 3 dígitos, poderíamos dizer os os dígitos iniciais eram 0, por exemplo).

Se quisermos sortear contas com 4 dígitos, a sua ideia seria uma boa saída.
Outra ideia seria sortear 4 números entre 0 e 9 (se certificando que o primeiro não seria 0), pra formar a conta com 4 dígitos.

Outra seria sortear números entre 0 e 8999, usando nextInt(9000).
Aí somaríamos 1000, e teríamos resultados entre 1000 e 9999.

Bom, programação é isso aí, criatividade, há sempre várias maneiras de se fazer uma coisa (e de se burlar também).

Tulio.xcrtf disse...

Ah é verdade, peço desculpas pela falta de atenção. A forma de incrementar em mais 1000 é bem mais prática do que utilizar um while, então novamente obrigado pela atenção e parabéns!

Ester DIY disse...

Bom, você disse que se o usuário digitar letras em campos de número o sistema irá colapsar...
Bem,eu já tinha notado isto desde o nível básico do curso. Procurei algo na internet,mas não achei algo que fosse explicativo o suficiente (só vi o código pronto, mas não estava explicado)
Como fazer para não acontecer isso??

Ester DIY disse...

Bom,você falou que se digitar números em campos de letras (e vice-versa) o sistema irá colapsar...
Desde o nível básico estou com esta dúvida, afinal, como faço para o sistema não entrar em colapso, como fazer a máquina apenas gerar uma mensagem de erro??
Pesquisei em fóruns e encontrei apenas códigos prontos, mas gostaria de uma resposta explicativa...
Agradeço a sua atenção.

Claudio Neves disse...

no caso vc criou nesse formato como Caixa.java e Conta.java mas se eu quiser montar num unico arquivo como ficaria

Anônimo disse...

Primeiramente muito bom o Curso vocês estão de parabéns!

Uma dúvida, eu fiz a entrada de dados no meu construtor


public Conta(){

this.codigo = r.nextInt(9999);
System.out.println("Digite seu Nome: ");
this.nome = s.nextLine();
System.out.println("Digite o saldo Inicial: ");
this.saldo = s.nextDouble();
System.out.println();


}

e no MAIN só Instancie o Objeto. Tem algum problema em fazer isso ? Existe algum manual de Boas Praticas para esta situação? o que realmente precisa ficar no MAIN?

Desde já agradeço!
Obrigado.

leandroevan disse...

Boa Tarde a todos!

Eu não entendi o porquê não são utilizados os métodos get e set nesse exercício e no exemplo anterior foi utilizado. Acredito que as duas situações são bem semelhantes e as variáveis são private do mesmo jeito.

Desde já agradeço!

Anônimo disse...

sou iniciante, tentei nao colar, aceito críticas, segue código:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package banco;

import java.util.Random;
import java.util.Scanner;

/**
*
* @author Ariel Espindola
*/
public class Conta {

private String nome;
private double saldo, saque;
int numeroRandomico, opcao, contador;
int[]conta=new int[4];

public Conta(){};

public Conta(String nome, double saldo){
setNome(nome);
setSaldo(saldo);
conta = geraNumeroDaConta(conta);
imprimeNumeroDaConta(conta);
System.out.print(" Nome: "+getNome());
System.out.println(" Saldo: "+getSaldo());
do{
opcao = menu();
switch (opcao){
case 1:extrato();break;
case 2:saque();break;
case 3:deposito();break;
case 4:;break;
}
}while(opcao!=4);
}
private int geraNumeroRandomico(){
Random random = new Random();
numeroRandomico = random.nextInt(10);
return numeroRandomico;
}
private int []geraNumeroDaConta(int conta[]){
for (int x=0;x0){
if (getSaldo()>=valorDoSaque){
setSaldo(getSaldo()-valorDoSaque);
contador++;
System.out.println("Saldo: "+getSaldo());
}else{
System.out.println("Saldo insuficiente!");
}
}else{
System.out.println("O valor do saque não pode ser negativo!");
}
}else{
System.out.println("Limite de saque excedido!");
}

}
private void deposito(){
System.out.print("Informe quanto deseja depositar...");
double valorDoDeposito = sc.nextDouble();
if (valorDoDeposito>0){
setSaldo(getSaldo()+valorDoDeposito);
System.out.println("Saldo: "+getSaldo());
}else{
System.out.println("O valor do depósito não pode ser negativo!");
}
}

}
public class TesteConta {
public static void main(String[] args) {
Conta conta = new Conta("waldir", 1000);

}
}


Arrowster disse...

Encontrei um erro, o valor em dinheiro que o usuário deve fornecer precisa estar em centavos. Pois ao tratar dados como inteiros, diminui a vulnerabilidade do sistema e o consumo de memória, bem como melhora o desempenho. Se não me engano a maioria dos sistemas bancários atualmente utilizam esse padrão.

Modon disse...

Olá Pessoasl

Alguém pode me ajudar com este enunciado??


Escreva um progrma em java respeitando os detalhes seguinte:
Um filcheiro unico, contem UMA CLASSE CONTA CLENTE tem os
Atributos:
Nº conta
Nome Completo
Saldo
e os Metodos:
Debitar conta (Levantar)
Creditar conta (Depositar)

E uma sub classe que herda a classe CONTA CLENTE e permitir realizar todas
operações da mesma.
a) Armazena os dados clientes e a soma dos valores depositados usando scnner.
uma cliente pode depositar uma ou várias vezes
b) Armazena os dados dos clentes e a soma dos valores retirados da conta ao momento
levantamento
c) Um cliente pode sacar uma ou varias vezes
Para debitar(levantar) uma conta, as condições seguintes devem ser respeitadas:
- a conta tem que exisitir e ser exata
- o valor a levantar <= saldo
se não Mostrar erro

Mostras as operacções de 3 clientes que depositaram e levantaram com os seus dados:
Nº conta, nome completo, total do deposito, total de saque e saldo corrente.


Modon disse...

Olá pessoal!
Alguem ai para ajudar a resolver este enunciado?


Escreva um progrma em java respeitando os detalhes seguinte:
Um filcheiro unico, contem UMA CLASSE CONTA CLENTE tem os
Atributos:
Nº conta
Nome Completo
Saldo
e os Metodos:
Debitar conta (Levantar)
Creditar conta (Depositar)

E uma sub classe que herda a classe CONTA CLENTE e permitir realizar todas
operações da mesma.
a) Armazena os dados clientes e a soma dos valores depositados usando scnner.
uma cliente pode depositar uma ou várias vezes
b) Armazena os dados dos clentes e a soma dos valores retirados da conta ao momento
levantamento
c) Um cliente pode sacar uma ou varias vezes
Para debitar(levantar) uma conta, as condições seguintes devem ser respeitadas:
- a conta tem que exisitir e ser exata
- o valor a levantar <= saldo
se não Mostrar erro

Mostras as operacções de 3 clientes que depositaram e levantaram com os seus dados:
Nº conta, nome completo, total do deposito, total de saque e saldo corrente.


Vinícius Andrade disse...

PS: Acrescente o sinal de igual depois do sinal de maior no "saldo > valor",caso contrário não será permitido o saque do valor exato que consta no saldo.

Uma opção para evitar que burlem o saque através de valores negativos,sem a utilizar tratamento de exceções :

if(valor < 0){
System.out.println("Valores negativos não são permitidos.");
}else if (saldo >= valor) {
saldo -= valor;
saques++;
System.out.println("Sacado: " + valor);
System.out.println("Novo saldo: " + saldo + "\n");
}else {
System.out.println("Saldo insuficiente.");
}
}catch(InputMismatchException error){
System.out.println("O erro do 'catch' aparece aqui!!!");
entrada.nextLine();

}finally{
System.out.println("Execução do finally.");
}

Unknown disse...

Um pergunta: porque no método extrato e no construtor foi usada a auto-referência com this.atributo, e nos outros métodos foi usado apenas o nome do atributo?

Anônimo disse...

Boa tarde!


Está dando erro nesse trecho de código, ao solicitar o extrato, mesmo postado pelo site: public void extrato(){
System.out.println("\tEXTRATO");
System.out.println("Nome: " + this.nome);
System.out.println("Número da conta: " + this.conta);
System.out.printf("Saldo atual: %.2f\n",this.saldo);
System.out.println("Saques realizados hoje: " + this.saques + "\n");

}

A linha que possui o this.saldo, eu coloquei um '+' pra concatenar e continua dando erro. Quando tento exibir o extrato ele dá exception..

Unknown disse...

Criei os dois arquivos Caixa.java e Conta.java, quando executo o Caixa.java que tem o método main aparece um erro

Cadastrando novo cliente.
Entre com seu nome: Paulo
Entre com o valor inicial depositado na conta: 5900
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: class Conta
location: class caixa.Caixa
at caixa.Caixa.main(Caixa.java:33)
C:\Users\Clariant SA\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 21 segundos)

Não consigo rodar o aplicativo, o que estou fazendo de errado?

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java