Ir ao conteúdo

Posts recomendados

Postado

Sou iniciante no java e criei um pequeno simulador de caixa eletrônico.O único probleminha é que ele não conserva o valor do saldo depois que eu deposito um novo valor. Quando eu volto pra consultar o saldo o valor que depositei desaparece. Gostaria que alguém  mais experiente olhasse com carinho meu code e me ajudasse.Desde já agradeço.

// Método principal




import java.util.Scanner;

public class Caixa {

   
    public static void main(String[] args) {
        
        Scanner tec = new Scanner(System.in);
        Operador M = new Operador();
        int senha = 12345;
        int money;
            System.out.print("Digite sua senha : ");
                senha = tec.nextInt();
                
      if(senha == 12345){
                M.tela();
      }else{
          
          System.out.println("Senha incorreta! tente novamente!");
      }
   

    }
}
   
//Métodos a serem chamados (Classe Operador )


import java.util.Scanner;//importação para leitura de dados

// Métodos operadores

public class Operador { //mostra saldo na tela
   
   
    
    public void saldo(){
        
        int valor =  1000;
    
        System.out.println(" Seu saldo é "+ valor);
    
    }
    

    public void tela (){//tela de escolha
         
        
    Scanner tec = new Scanner(System.in);
    Operador S = new Operador();
   
    
    String escolha;
        System.out.println(" a- consultar saldo\n b- Depositar\n c- Sacar ");
                escolha = tec.nextLine();
                if("a".equals(escolha)){
                    S.saldo();
               
                }
                if("b".equals(escolha )){
    
                    S.depositar();
                
                }
                if ("c".equals(escolha)){
                    S.saque();
                
                }
            


    }
    public void depositar( ){//exige do usuário valores para deposito
        int Vdeposito; 
        int valor =  1000;
        Scanner tec = new Scanner(System.in);
        Operador  box = new Operador();
        
         
            System.out.print("Digite um valor para depósito : ");
             Vdeposito = tec.nextInt();
             
            
            valor = valor + Vdeposito;
            
    
            System.out.println("Seu novo saldo é "+valor );
      
            box.inter();
        
        
    
    
    
   }
   public void inter(){
       Scanner tec = new Scanner(System.in);
       Operador R = new Operador();
       String exite ;
         System.out.println(" e- voltar\n f - sair ");
                 exite = tec.nextLine();
                 if (exite.equals("e")){
          R.tela();}
                 if(exite.equals("f")){
                     System.exit(0);
                 
                 }
                    
        
   } 
   public void saque (){
       int valor =  1000;
       Scanner tec = new Scanner(System.in);
       Operador  box = new Operador();
       
       System.out.println("Digite o valor do seu saque: ");
        int Vsaque = tec.nextInt();
        valor = (valor -Vsaque);
        if(valor <Vsaque){
            System.out.println("você não possui mais  fundos suficientes! ");
            valor = 0;
        }
        
        System.out.println("seu novo saldo é :"+valor);
            box.inter();
   
   }
    
}

 

Postado

Olá, bom dia.

 

Antes de explicar o problema, queria te dar uma sugestão: faça uma rotina específica que controle o menu. A cada ação que você executa sempre é instanciada uma nova classe Operador, sem necessidade, para fazer controle de tela e voltar ao menu.

 

Sobre o problema do valor do depósito, ele sempre vai resetar porque a cada vez que você instancia a classe Operador, o valor da variável depósito sempre é inicializado com o mesmo valor pois você deixou a variável valor como sendo uma variável interna da classe.

 

Para resolver isso existem duas possibilidades:

  • A variável valor ser global, ou seja, uma variável da aplicação 
  • Alterar drasticamente seu código, fazendo uma classe que controle o menu e instanciar a classe Operador apenas uma vez e fazer todas as operações em cima dela. Dessa forma, as variáveis internas não serão inicializadas com o valor default de 1000 que você especificou a cada vez que o usuário resolver fazer uma nova operação no caixa eletrônico

Minha recomendação? A segunda opção. Dá muito mais trabalho, porém, o código fica limpo, menor e muito, mas muito mais fácil de ler.

 

Eu não posso fazer o código pra você, mas posso te dar dicas e  mostrar alguns trechos de códigos a medida que você for fazendo e postando suas dúvidas aqui.

 

Abraço

  • Curtir 1
Postado

O que eu poderia fazer depois daqui ??? :huh: (Coloquei uma variável global agora do tipo float. Criei uma classe menu. Não sei como instanciar a classe Operador apenas uma vez. Dessa vez tô trazendo somente o Método depositar para ficar mais limpo e ir na raiz do meu problema que é o fato de "valor" não conservar a soma.)

//Classe Principal

package contabancaria;

import java.util.Scanner;


public class ContaBancaria {

   
    public static void main(String[] args) {
         Scanner tec = new Scanner(System.in);
        Menu M = new Menu();
        int senha = 12345;
        int money;
            System.out.print("Digite sua senha : ");
                senha = tec.nextInt();
                
      if(senha == 12345){
                M.tela();
      }else{
          
          System.out.println("Senha incorreta! tente novamente!");
      }
   
    }
    
}


//classe Menu
package contabancaria;

import java.util.Scanner;


public class Menu {
    
    
      public void tela (){//tela de escolha
         
        
    Scanner tec = new Scanner(System.in);
    OperadorJ S = new OperadorJ();
   
    
    String escolha;
   
        System.out.println(" a- consultar saldo\n b- Depositar\n c- Sacar ");
                escolha = tec.nextLine();
               /* if("a".equals(escolha)){
                    S.setsaldo(c);
               
                }*/
                if("b".equals(escolha )){
    
                    S.depositar();
                
                }
             /* if ("c".equals(escolha)){
                    S.saque();
                
                }*/
            


    }
    
}
//classe Operador

package contabancaria;

import java.util.Scanner;


public class OperadorJ {
    float valor = 1000;
    
   public void depositar(){//exige do usuário valores para deposito
        float Vdeposito; 
       
        Scanner tec = new Scanner(System.in);
        Menu  box = new Menu();
        
         
            System.out.print("Digite um valor para depósito : ");
             Vdeposito = tec.nextInt();
             
            
            valor = valor + Vdeposito;
            
    
            System.out.println("Seu novo saldo é "+valor );
      
            box.tela();
        
        
    
    
    
   }
    
}

 

 

Postado

O problema está na classe Menu. Vou colocar aqui a solução pra você (que é bem simples) mas eu gostaria que você desse uma olhada no código e me diga porque o seu falhou e porque o meu deu certo.

 

public class Menu {

    public void tela() {//tela de escolha

        Scanner tec = new Scanner(System.in);
        OperadorJ S = new OperadorJ();

        String escolha;

        System.out.println(" a- consultar saldo\n b- Depositar\n c- Sacar\n s- Sair ");
        escolha = tec.nextLine();
        while (!"s".equals(escolha)) {
            if ("a".equals(escolha)) {
                S.getSaldo();

            } else if ("b".equals(escolha)) {

                S.depositar();

            } else if ("c".equals(escolha)) {
                S.saque();                         
            }
            System.out.println(" a- consultar saldo\n b- Depositar\n c- Sacar\n s- Sair ");
            escolha = tec.nextLine();
        }
      System.exit(0);
    }

}

E a classe OperadorJ também muda pois o Menu não precisas em hipótese alguma ser instanciado de novo

public class OperadorJ {

    float valor = 1000;

    public void depositar() {//exige do usuário valores para deposito
        float Vdeposito;

        Scanner tec = new Scanner(System.in);

        System.out.print("Digite um valor para depósito : ");
        Vdeposito = tec.nextInt();

        valor += Vdeposito;

        System.out.println("Seu novo saldo é " + valor);

    }
}

 

Abraço

  • Curtir 1
Postado

Continua dando o mesmo problema de não adicionar o valor ao saldo (eu só alterei a classe menu ).:mellow:

adicionado 8 minutos depois
import java.util.Scanner;


public class OperadorJ {
    float valor = 1000;
    
   public void depositar(){//exige do usuário valores para deposito
        float Vdeposito; 
       
        Scanner tec = new Scanner(System.in);
        Menu  box = new Menu();
        
         
            System.out.print("Digite um valor para depósito : ");
             Vdeposito = tec.nextInt();
             
            
            valor = valor + Vdeposito;
            
    
            System.out.println("Seu novo saldo é "+valor );
      
            box.tela();
        
        
    
    
    
   }
    
}

Essa é a classe "Operador" que eu coloquei apenas o método" depositar".Será que não tem nada a ver com a declaração da  variável? ou será que eu apenas não soube compor o código ainda?  

Postado

@IvanJava Precisa alterar a classe OperadorJ também. Se alterar o código como fiz acima, vai funcionar.

 

Perceba que você instancia um novo objeto Menu na classe OperadorJ e chama a tela desse novo objeto. Ele, por sua vez, cria uma nova instancia da classe OperadorJ, que tem seus valores zerados e assim infinitamente. Você inclusive nunca vai sair do laço while da classe Menu por causa disso.

 

Você criou um loop infinito que gera sempre um novo objeto, um após o outro. Da maneira que fiz, Menu e OperadorJ são instanciados apenas uma única vez e serão "reaproveitados" durante toda a execução, mantendo os valores de todas as suas variáveis que sofreram mudanças, no seu caso, a variável valor.

Postado

Agora deu certo, vou tentar entender e  já te digo. 

adicionado 33 minutos depois

Na classe Menu tem um laço "while". Dentro dessa estrutura de repetição há as condições para se chamar determinados métodos na classe "OperadorJ"("no caso estamos trabalhando apenas com o método depositar ). Caso nenhuma opção seja escolhida, o programa fecha com o comando"System.exit(0);".Do contrário se o usuário escolher a opção "b"  e chamar o método depositar da classe operador, o programa pedirá a ele que digite o valor do depósito  que será adicionado à variável "valor" que por sua vez está declarada no corpo da classe OperadorJ com o valor inicial de 1000.Depois que o usuário digita o valor do depósito e o programa mostra o novo valor do depósito, nós voltamos para o laço while da classe "Tela" novamente, o que faz a estrutura sempre se repetir e entrar no método depositar outra vez sem haver necessidade de instancia-lo novamente com o risco da variável "valor" ser resetada.

 

 

 

me diz se eu tô certo na minha explicação.

Postado

@IvanJava Sim, é isso mesmo. Você conseguiu entender a diferença sutil, mas primordial, do porque seu código sempre "resetava" o valor depositado para 1000?

 

Uma dica que SEMPRE dou para quem está iniciando e precisa fazer esses programas para aprendizado: comece pelo menu. Faça ele funcionar e depois vá implementando o código de cada opção que o menu especifica. Dessa forma você tem uma visão ampla do que deve ou não instanciar e como repassar, armazenar e calcular variáveis para que fiquem visíveis às classes e métodos que as utilizam.

 

Bom estudo.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!