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.javaimport 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:
Gostei muito! É um aplicativo simples e muito bom para quem está iniciando. Valeu!
Outras falhas...
1 - Clientes com caracteres invisíveis...
2- aceita deposito com valor negativo.
3- posteriormente o saldo nunca zera....
Muito bom parabéns !!!
como faz pra aparecer a hora do levamtamento???
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?
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.
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
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.
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.
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).
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!
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??
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.
no caso vc criou nesse formato como Caixa.java e Conta.java mas se eu quiser montar num unico arquivo como ficaria
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.
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!
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);
}
}
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.
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.
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.
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.");
}
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?
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..
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?
Postar um comentário