Ir ao conteúdo
  • Cadastre-se

Joanderson Pereira

Membro Pleno
  • Posts

    43
  • Cadastrado em

  • Última visita

posts postados por Joanderson Pereira

  1. Temos que lembrar que String é uma coleção de caracteres análoga a ao `Array``:

    Como acontece com os Arrays o índice do primeiro caractere é o 0(zero).

    O índice do último caractere, caso haja caracteres, é o comprimento do String menos 1(um). Isso pois o índice do primeiro caractere é 0, segundo é 1, do terceiro é 2,..., o índice do enésimoelemento(N) é igual a posição ordinal do enésimo elemento menos um, o que no seu exemplo pode ser traduzido com novaString.length() - 1

    De posse da informação de que o índice do último elemento duma String é length() - 1 para remover o último elemento duma Java String dentro do método substring é apenas retirar mais um elemento do comprimento da String:

    novaString.length() - 2

    Então o case 63 pode ser reescrito da seguinte forma

     case 63 :
            // Verifica o comprimento da string para evitar o erro Index out of range(índice fora da faixa)
            novaString = (novaString.length() >= 2) ?  
    
                                   // Caso comprimento seja maior ou igual a dois retorna o substring sem o último elemento.
                                   novaString.substring(0, novaString.length() - 2) : 
    
                                   //Caso o comprimento seja menor que dois retorna um string vazio.
                                   "";
            return "] ";

    Porém esse é apenas um erro no código, se o case 63 fosse chamado esse erro ocorreria, mas não é o que está acontecendo. Percebi que na lógica que usei o programa não está conseguindo formatar o texto adequadamente para os procurar os termos no hashmap, aparentemente apenas os case 62 e 63 não estão sendo chamados. Vou ter que rever a lógica do código para corrigir o problema.

  2. O problema era um typo.

    O React possui um método chamado componentDidMount que é acessível para componentes escritos em formato de classe. Ele é invocado imediatamente após um componente ser montado (inserido na árvore). Inicializações que exijam nós do DOM devem vir aqui. Se precisar carregar data de um endpoint remoto, este é um bom lugar para instanciar sua requisição.

    Percebi que componetDidMount (conforme digitei) é um componente inexistente do react, ou seja, ele não estava realizando nada. Não havia um erro sintaxe, eu criei um método que não fazia nada, não era uma referência ao método do React. O console.log(response.data) não exibia nenhuma informação.

    O correto é componentDidMount, agora a página exibe as informações que eu quero diretamente do MongoDB, e no console.log aparece o array nos conformes.

    async componentDidMount() {
          const response = await api.get('posts');
          this.setState({ feed: response.data });  
          console.log(response.data);
      }

    O problema era apenas um typo que não me permitia usar o recurso do React. Sou iniciante em programação web e não sabia como depurar o código, algo realmente simples.

    No console: Array(8) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…} ].

     

    • Curtir 1
  3. Estou seguindo um tutorial de como fazer um instagram, já foi feito e testado o backend e o frontend separadamente. No backend consigo alterar as rotas e enviar/salvar informações para o MongoDb, no frontend consigo exibir as informações da maneira que quero. O problema está quando eu vou puxar do banco de dados, fiz um esquema para que ele percorra todos os posts do database exibindo suas informações, só que aparentemente ele não está percorrendo nenhuma posição.
    Não creio que o problema seja o mongodb pois consigo conectar e upar arquivos (mas não pegá-los?).

    Estou certo que o código está como no vídeo.

    import React, {Component} from 'react';
    import api from '../services/api';
    
    import './Feed.css';
    
    import more from '../assets/more.png';
    import tolike from '../assets/tolike.png';
    import nolike from '../assets/nolike.png';
    import comment from '../assets/comment.png';
    import send from '../assets/send.png';
    
    class Feed extends Component{
      state = {
        feed: [],
      };  
    
      async componetDidMount() {
          const response = await api.get('posts');
          
          this.setState({ feed: response.data });  
      }
    
      render() { 
        return(
          <section id="post-list">
            { this.state.feed.map(post => (
              <article>
                <header>
                  <div className="user-info">
                    <span>{post.author}</span>
                    <span className="place"> {post.place}</span>
                  </div>
                
                  <img src={more} alt= "Mais"/>
                </header>
      
                <img src= {`http://localhost:3333/files/${post.image}`} alt= "post"/>
      
                <footer>
                  <div className= "actions">
                    <img src = {nolike} alt=""/>
                    <img src = {comment} alt=""/>
                    <img src = {send} alt=""/>
                  </div>
                  <strong>{post.likes}</strong>
      
                  <p>
                    {post.description}
                    <span> {post.hashtag}</span>
                  </p>
                </footer>  
      
              </article> 
            ))}
             
          </section >
        );
      }
    }
    
    export default Feed;

    Deixarei o projeto como anexo, tenho certeza que para quem entende é algo fácil de resolver. Meus estudos com programação web estão travados por causa disso

    backend.rar frontend.rar

  4. Existe um excesso de "ifs" no seu código, bastaria isso:
     

    //pedra == 0  papel == 1 tesoura == 2 
    
    if (usuario < computador || (usuario == 2 && computador == 0)){ //se o computador tiver mais pontos ele vence
         System.out.println("O Computador é o vencedor." + "\n");//se o computador jogou pedra e o usuario tesoura ele vence
         compv += 1;
    }
    else if (usuario > computador || (computador == 0 && usuario == 2)){ //se o usuário tiver mais pontos ele vence
    	 System.out.println("Parabéns! Você venceu!" + "\n")//se o usuário jogou pedra e o computador tesoura ele vence
         userv += 1;
    }  	
    else {//Se nenhuma das situações acima funcionou, significa que foi empate
         System.out.println("Empate" + "\n");
         empt += 1;
    }

    O else if só vai rodar caso o if acima seja falso. Se o computador não tem mais pontos que o usuário (e nem jogou pedra e o usuario tesoura) o java irá ler o else if, caso contrário ele irá ignorar as novas verificações (pois são desnecessária pois o usuário já venceu.).

    No seu código o computador está checando todas as possibilidades mesmo que ele já tenha verificado que o usuário ganhou (por exemplo).

    Pelo fato de você está usando try/catch quando um erro ocorre o programa ao invés de fechar irá pular do bloco try para o bloco catch

     

    Em 14/07/2019 às 00:24, GR Carvalho disse:

    Onde pede para eu digitar uma dos três números, caso eu digite uma letra ocorre um lopping, mas caso eu aperte um número invalido o looping não ocorre. 

    System.out.println("Informe um número de acordo com a opção desejada" + "\n");

    System.out.println("Pedra = 0, papel = 1, tesoura = 2" + "\n");

    usuario = teclado.nextInt();

     

    Quando você digita uma letra nessa parte o código pula direto para o catch, ou seja, tudo depois dessa linha não é rodado.
    Você definiu opc=0  e só altera ela depois do switch. Caso você digite uma letra o código é rodado apenas uma vez, se você digita um número inválido o opc continua igual a 0.

     

    Em 14/07/2019 às 00:24, GR Carvalho disse:

    System.out.println("Deseja Jogar mais uma vez ? Então Digite '1' !");

    opc = teclado.nextInt(); }

    Aqui é onde o loop é definido, se o usuário digitar qualquer coisa que não seja 1 o código não entra em loop. Se esse trecho não for lido o programa não prossegue (pois opc continuará como 0).

    Caso o usuário digite 1 na primeira vez, o código entrará em loop com opc = 1, na segunda vez que ele chega nessa linha se o usuário digitar uma letra um novo valor não será atribuído para opc, ou seja, opc continua igual a 1 e código repete.
    Se o usuário digitar um número inteiro (que não seja 1), esse valor é atribuído para opc, que deixa de ser 1 e o código não entra em loop.

     

    Para corrigir isso você precisa iniciar a variavel opc dentro do DOWHILE, assim toda vez que o código repetir essa variável será redefinida

    do{
    	int opc = 0;
    
    //resto do código
    
    }while(opc == 1);


     

     

    • Curtir 1
  5. Criei um programa para traduzir notas musicais de um site para um formato mais legível, ele recebe e analisa cada dois dígitos de uma string procurando por eles (como chave) dentro de um hashmap<String,Integer>, caso encontre, o int que ele retorna é usado em um switch que encontrará os caracteres correspondentes que serão gravados em uma nova string.

     

    A novaString é uma variável de classe, ela é usada no método public traduzir para concatenar os caracteres traduzidos e é usada no método private traduzir quando o switch case 63 é chamado, nesse método private eu tento deletar o último caractere da novaString com substring, porém parece que estou editando uma cópia e não a variável em si porque nenhuma alteração feita nessa linha é salva.

     

    
    public class main {
    
    	public static void main(String[] args) {
    		Resources r1 = new Resources();
    		String texto = "[t8] ttt [r5] t r [r4] t y [u5] y\r\n" + 
    				"[t8] ttt [r5] t t [w4] 5\r\n" + 
    				"[t8] ttt [r5] t r [r4] t y [u5] y\r\n" + 
    				"[t8] ttt [r5] t y [w4] [w5]\r\n" + 
    				"[t8] t [y5] w [o4] i u [y5]\r\n" + 
    				"u i [u8] y t [r5] t r [e4] [w5]\r\n" + 
    				"[t8] t [y5] w [o4] i u [y5]\r\n" + 
    				"u i [u8] y t [r5] t r [r4] t y [u5] y [t8]";
    				
    		r1.c1.gravar("Titanic", r1.traduzir(texto));
    		
    	}
    	
    }

     

    import java.util.HashMap;
    import java.util.Map;
    
    public class Resources {
    
    	Map<String,Integer> example = new HashMap<String,Integer>();
    	public Conectar c1 = new Conectar();
    	
    	private String novaString = "";
    
    	public Resources() {
    		// TODO Auto-generated constructor stub
    		bancoDados();
    
    	}
    
    	private void bancoDados() {
    		example.put("1", 1); // dó
    		example.put("1|", 2); // dó sustenido
    		example.put("2", 3); // ré
    		example.put("2|", 4); // ré sustenido
    		example.put("3", 5); // mi
    		example.put("4", 6); // fá
    		example.put("4|", 7); // fá sustenido
    		example.put("5", 8); // sol
    		example.put("5|", 9); // sol sustenido
    		example.put("6", 10); // lá
    		example.put("6|", 11); // lá sustenido
    		example.put("7", 12); // si
    
    		example.put("8", 13); // dó
    		example.put("8|", 14); // dó sustenido
    		example.put("9", 15); // ré
    		example.put("9|", 16); // ré sustenido
    		example.put("0", 17); // mi
    		example.put("q", 18); // fá
    		example.put("Q", 19); // fá sustenido
    		example.put("w", 20); // sol
    		example.put("W", 21); // sol sustenido
    		example.put("e", 22); // lá
    		example.put("E", 23); // lá sustenido
    		example.put("r", 24); // si
    
    		example.put("t", 25); // dó
    		example.put("T", 26); // dó sustenido
    		example.put("y", 27); // ré
    		example.put("Y", 28); // ré sustenido
    		example.put("u", 29); // mi
    		example.put("i", 30); // fá
    		example.put("I", 31); // fá sustenido
    		example.put("o", 32); // sol
    		example.put("O", 33); // sol sustenido
    		example.put("p", 34); // lá
    		example.put("P", 35); // lá sustenido
    		example.put("a", 36); // si
    
    		example.put("s", 37); // dó
    		example.put("S", 38); // dó sustenido
    		example.put("d", 39); // ré
    		example.put("D", 40); // ré sustenido
    		example.put("f", 41); // mi
    		example.put("g", 42); // fá
    		example.put("G", 43); // fá sustenido
    		example.put("h", 44); // sol
    		example.put("H", 45); // sol sustenido
    		example.put("j", 46); // lá
    		example.put("J", 47); // lá sustenido
    		example.put("k", 48); // si
    
    		example.put("l", 49); // dó
    		example.put("L", 50); // dó sustenido
    		example.put("z", 51); // ré
    		example.put("Z", 52); // ré sustenido
    		example.put("x", 53); // mi
    		example.put("c", 54); // fá
    		example.put("C", 55); // fá sustenido
    		example.put("v", 56); // sol
    		example.put("V", 57); // sol sustenido
    		example.put("b", 58); // lá
    		example.put("B", 59); // lá sustenido
    		example.put("n", 60); // si
    
    		example.put("m", 61); // dó
    		example.put("[", 62);
    		example.put("]", 63);
    		
    	}
    
    	public String traduzir(String tr) {
    
    		
    
    		for (int i = 0; i < tr.length(); i++) {
    
    			String str;
    
    			if(tr.length() >= i + 1) {
    				str = tr.substring(0 + i, 1 + i);
    
    				if (example.get(str) == null) {
    					if (tr.length() >= i + 2) {
    						str = tr.substring(0 + i, 1 + i);
    						
    						if (example.get(str) == null) {
    							
    						}							
    						else
    							novaString += traduzir(example.get(str));
    					}
    				}					
    				else {
    					novaString += traduzir(example.get(str));
    				}
    			}
    		}
    		return novaString;
    	}
    
    	private String traduzir(int i) {
    		switch (i) {
    			case 1 :
    				return "1C "; // dó
    
    			case 2 :
    				return "1C# "; // dó sustenido
    
    			case 3 :
    				return "1D "; // ré
    
    			case 4 :
    				return "1D# "; // ré sustenido
    
    			case 5 :
    				return "1E "; // mi
    
    			case 6 :
    				return "1F "; // fá
    
    			case 7 :
    				return "1F# "; // fá sustenido
    
    			case 8 :
    				return "1G "; // sol
    
    			case 9 :
    				return "1G# "; // sol sustenido
    
    			case 10 :
    				return "1A "; // lá
    
    			case 11 :
    				return "1A# "; // lá sustenido
    
    			case 12 :
    				return "1B "; // si
    
    
    
    			case 13 :
    				return "2C "; // dó
    
    			case 14 :
    				return "2C# "; // dó sustenido
    
    			case 15 :
    				return "2D "; // ré
    
    			case 16 :
    				return "2D# "; // ré sustenido
    
    			case 17 :
    				return "2E "; // mi
    
    			case 18 :
    				return "2F "; // fá
    
    			case 19 :
    				return "2F# "; // fá sustenido
    
    			case 20 :
    				return "2G "; // sol
    
    			case 21 :
    				return "2G# "; // sol sustenido
    
    			case 22 :
    				return "2A "; // lá
    
    			case 23 :
    				return "2A# "; // lá sustenido
    
    			case 24 :
    				return "2B "; // si	
    
    
    			case 25 :
    				return "3C "; // dó
    
    			case 26 :
    				return "3C# "; // dó sustenido
    
    			case 27 :
    				return "3D "; // ré
    
    			case 28 :
    				return "3D# "; // ré sustenido
    
    			case 29 :
    				return "3E "; // mi
    
    			case 30 :
    				return "3F "; // fá
    
    			case 31 :
    				return "3F# "; // fá sustenido
    
    			case 32 :
    				return "3G "; // sol
    
    			case 33 :
    				return "3G# "; // sol sustenido
    
    			case 34 :
    				return "3A "; // lá
    
    			case 35 :
    				return "3A# "; // lá sustenido
    
    			case 36 :
    				return "3B "; // si	
    
    			case 37 :
    				return "4C "; // dó
    
    			case 38 :
    				return "4C# "; // dó sustenido
    
    			case 39 :
    				return "4D "; // ré
    
    			case 40 :
    				return "4D# "; // ré sustenido
    
    			case 41 :
    				return "4E "; // mi
    
    			case 42 :
    				return "4F "; // fá
    
    			case 43 :
    				return "4F# "; // fá sustenido
    
    			case 44 :
    				return "4G "; // sol
    
    			case 45 :
    				return "4G# "; // sol sustenido
    
    			case 46 :
    				return "4A "; // lá
    
    			case 47 :
    				return "4A# "; // lá sustenido
    
    			case 48 :
    				return "4B "; // si	
    
    
    			case 49 :
    				return "5C "; // dó
    
    			case 50 :
    				return "5C# "; // dó sustenido
    
    			case 51 :
    				return "5D "; // ré
    
    			case 52 :
    				return "5D# "; // ré sustenido
    
    			case 53 :
    				return "5E "; // mi
    
    			case 54 :
    				return "5F "; // fá
    
    			case 55 :
    				return "5F# "; // fá sustenido
    
    			case 56 :
    				return "5G "; // sol
    
    			case 57 :
    				return "5G# "; // sol sustenido
    
    			case 58 :
    				return "5A "; // lá
    
    			case 59 :
    				return "5A# "; // lá sustenido
    
    			case 60 :
    				return "5B "; // si
    				
    				
    			case 61 :
    				return "6C "; // dó
    
    			case 62 :
    				return "[";
    			
    			case 63 :
    				novaString = novaString.substring(0, novaString.length() - 1);
    				return "] ";
    
    			default:
    				return "";
    		}
    	}
    }

    Tudo que quero é quando o case 63 for chamado o caractere da última posição da novaString seja deletado.

  6. Resolvi, o problema todo estava nessa linha do código:

    new View().setVisible(true);

    Eu estava chamando o showImputDialog dentro do construtor da classe View, eu pensava que o ato de criar e colocar informações no JFrame o tornava visível. Só que não era bem assim que estava acontecendo.

     

    Em 17/05/2019 às 20:55, Joanderson Pereira disse:

    Eu quero que durante esse showImputDialog caso o usuário clique em cancelar o JFrame de View não seja exibido na tela e retorne para o JFrame do Menu.

    Tentei realizar uma lógica para que isso acontecesse porém quando o usuário clica em cancelar, o JFrame de View é aparentemente fechado porém ao voltar para o ActionListener(JButton do Menu)  o View é novamente aberto com todas as informações descarregadas.

     

    Em View( ) { de new View.setVisible(true);} o construtor da classe é chamado, o compilador "para" apenas para executar as linhas do construtor de View, ou seja, o compilador ainda não chegou em .setVisible(true); 

     

    O comando que exibe a janela na tela é setVisible(true), o que o meu showImputDialog estava fazendo era decidir se as informações da janela seriam carregadas ou não, quando usuário terminava de interagir com o showImputDialog independentemente das informações da janela serem carregadas o compilador continuava a ler a linha {new View.setVisible(true);}. E exibia o que estivesse no JFrame

     

    Ou seja com as informações carregadas ou não, o JFrame era exibido quando chegava em .setVisible(true);

     

    Então eu coloquei o setVisible(true) dentro do construtor da classe View (mas especificamente,dentro do if do showImputDialog), agora a janela só é exibida caso os dois nomes sejam informados, caso contrário o programa retorna para Menu.

     

    //Classe Menu
    btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				regra1 = true;
    				new View();
    				
    				
    				
    				
    			
    			}
    		});
    		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setBounds(246, 83, 104, 23);
    		contentPane.add(btnNewButton);
    		
    		
    		btnMelhorDe.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				regra1 = false;
    				new View();
    			
    			}
    		});
    //Construtor da Classe View
    String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
    		if (nomeJ1 != null) {			
    			String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);
    
    			if (nomeJ2 != null) {
    				j1.setNome(nomeJ1);
    				j2.setNome(nomeJ2);
    				Menu.btnNewButton.setEnabled(true);
    				Menu.btnMelhorDe.setEnabled(true);
    				setVisible(true);
    				
    				Menu.btnNewButton.setEnabled(false);
    				Menu.btnMelhorDe.setEnabled(false);

    P.S: Meus jogadores estão private novamente :) 

     

    adicionado 25 minutos depois
    Em 21/05/2019 às 19:46, r_Tray disse:

    int vez = new Random().nextInt(2); // retorna 0 ou 1

    No meu estava errado, só retornava 0, por isso que o jogador um sempre jogava primeiro, eu pensava que era apenas sorte :D

     

    Em 21/05/2019 às 19:46, r_Tray disse:

    Obs: Tem dois métodos main no seu código (!?)

    O código é gerado pelo WindowBuilder, então sim, como eu executava apenas a classe principal (Menu) que chamava as outras não estava dando problemas, não sei se um pontoJar iria dar problema. (Obs agora só tem um método main no código)

     

    Em 21/05/2019 às 19:46, r_Tray disse:

    int vez = (int) (Math.random() * 2);

    Ok, alterei aqui.

     

    Em 20/05/2019 às 16:57, Joanderson Pereira disse:

    Quero perguntar agora se a primeira maneira de resolver esse problema é mesmo errada.

    Não é correto deixar o compilador lidar com as exceções, como programadores é ideal que tratemos elas (Pelo que entendi).

    Null refere-se a uma posição vazia na memória, é comum que métodos retornem null, mas apenas em métodos que procuram algo.

    Correto:

    Um método pegarLivroNaPosicao(int posicao), se não tiver um livro naquela posição quer dizer que ela está vazia, o método retorna null e podemos tratar essa exceção, por exemplo, com uma mensagem para o usuário avisando que não tem livro naquela posição.

    Errado: 

    Um método comprarLivro(Livro livro), vejamos, o livro está aí, se esse método depender de um saldo para que a compra seja efetuada, o retorno deve ser um true ou false, ou ainda uma mensagem para o usuário. retornar null é uma má prática de programação.

     

    No meu código (maneira 1)  eu estava forçando um erro para fechar a janela indesejada, isso também é uma má prática de programação.

     

    Em 21/05/2019 às 19:46, r_Tray disse:

    Também daria para simplificar e fazer como o @AdrianoSiqueira mostrou, com algumas mudanças:

    frame.setVisible(false);
    
    while (true) {
        jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação",
                                               JOptionPane.PLAIN_MESSAGE);
    
        if (jogador1 == null) {
            frame.setVisible(true);
            break;
        }
    
        jogador2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação",
                                               JOptionPane.PLAIN_MESSAGE);
    
        if (jogador2 == null) {
            frame.setVisible(true); 
            break;
        }
    }

    Percebi que tanto você como Adriano colocaram esse if (que se verdadeiro, encerra o programa) "no meio do código", tenho o hábito de fazer o contrário. A minha maneira é uma prática ruim, ou algo do tipo?

    if (jogador != null) {
    ...continua o código com as funções que quero executar
    .
    .
    .
    .
    .
    }
    else {
    fecha o programa ou exibe o erro
    }

     

    Em 21/05/2019 às 19:46, r_Tray disse:

    Vou dar um dica, apesar de estar feliz em ver seu desempenho no Java: Invista no JavaFX!

    O Java Swing já foi descontinuado pela Oracle, ou seja, a Oracle parou de fazer qualquer tipo de investimento no Java Swing e está investindo pesado no JavaFX 😉

    Devo parar de ver Java Swing?

  7. Em 18/05/2019 às 09:54, AdrianoSiqueira disse:

    Na classe View, coloca uma condição depois de pegar cada um dos nomes:

    
    String nome1 = JOptionPane.showInputDialog(null, "Digite o primeiro nome", "Informação", JOptionPane.PLAIN_MESSAGE);
    if (nome1 == null) {
        System.exit(0);
    }
    
    String nome2 = JOptionPane.showInputDialog(null, "Digite o segundo nome", "Informação", JOptionPane.PLAIN_MESSAGE);
    if (nome2 == null) {
        System.exit(0);
    }
    
    // Continua seu código

     

    Com System.exit(0) ele encerra toda a aplicação, quero fechar apenas a janela View (impedir que ela seja exibida) e voltar para Menu.

    Acredito ter resolvido o problema:

    Em 17/05/2019 às 20:55, Joanderson Pereira disse:

    No Menu (JFrame) é possível selecionar dois modos (melhor de 3 e 18 pontos), escolhendo qualquer um dos dois criará um novo View(JFrame onde é exibido o jogo), no inicio do construtor de View coloquei dois showImputDialog que pedem que seja digitado o nome do Jogador 1 e em seguida do Jogador 2.

    Maneira 1 -

    O View é instanciado no momento que o usuário clica em um dos dois botões, parte das informações do JFrame estavam sendo carregadas antes do showImputDialog ser exibido (estavam fora do if que verificava o nome do usuário), coloquei elas dentro do if, mas acho verdadeiro problema estava no new View().setVisible(true) dentro da classe Menu, que configura a janela como visivel.

     

    Criei um objeto View (chamado frame) não instanciado dentro da classe View, quando o usuário clica em cancelar (no showImputDialog) o programa vai tentar um frame.dispose(); Como frame não está instanciado o programa gera um NullPointerException e encerra a aplicação relacionada com a classe View. Voltando para Menu (que continua aberto).

     

    Maneira 2 - 

    Eu achei que essa maneira não é a correta para resolver o problema, então eu recortei os showImputDialog do construtor da classe View para os Jbuttons da classe Menu, tornei os dois jogadores de View public e realizei a verificação dentro desses Jbuttons, se o usuário clica em cancelar View.setVisible(true) não é rodado.

    O problema é que o Java carrega toda a janela sem necessidade e meus jogadores agora são public :(

     

    Quero perguntar agora se a primeira maneira de resolver esse problema é mesmo errada.

     

    Segue o código da maneira 2, não quero meus jogadores public ;-;

    public class View extends JFrame {
    
    	private JPanel contentPane;
    	private int rodadas = 0;
    	private int objetivo = 18;
    	private Dado dado = new Dado();
    	int vez = new Random().nextInt(1);
    	Jogador j1 = new Jogador();
    	Jogador j2 = new Jogador();

     

    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.ImageIcon;
    import javax.swing.UIManager;
    import java.awt.Font;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.Toolkit;
    import java.awt.Color;
    
    public class Menu extends JFrame {
    
    	private JPanel contentPane;
    
    	static boolean regra1 = true;
    	static JButton btnNewButton = new JButton("18 pontos");
    	static JButton btnMelhorDe = new JButton("Melhor de 3");
    	
    	View view;
    	
    	
    
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					Menu frame = new Menu();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public Menu() {
    		setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png")));
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("Dados Arcade");
    		lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow"));
    		lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18));
    		lblNewLabel.setBounds(236, 39, 138, 33);
    		contentPane.add(lblNewLabel);
    		
    		
    		btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				regra1 = true;
    				view = new View();
    				String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
    				if (nomeJ1 != null) {
    					view.j1.setNome(nomeJ1);
    					String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);
    
    					if (nomeJ2 != null) {
    						view.j2.setNome(nomeJ2);
    						btnNewButton.setEnabled(true);
    						btnMelhorDe.setEnabled(true);
    						view.setVisible(true);
    					}
    					else {
    						btnNewButton.setEnabled(true);
    						btnMelhorDe.setEnabled(true);
    					}
    					
    				}
    				else {
    					btnNewButton.setEnabled(true);
    					btnMelhorDe.setEnabled(true);
    				}
    				
    			
    			}
    		});
    		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setBounds(246, 83, 104, 23);
    		contentPane.add(btnNewButton);
    		
    		
    		btnMelhorDe.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				regra1 = false;
    				view = new View();
    				String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
    				if (nomeJ1 != null) {
    					view.j1.setNome(nomeJ1);
    					String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);
    
    					if (nomeJ2 != null) {
    						view.j2.setNome(nomeJ2);
    						
    						view.setVisible(true);
    					}
    					
    					else {
    						btnNewButton.setEnabled(true);
    						btnMelhorDe.setEnabled(true);
    					}
    									
    				}
    				else {
    					btnNewButton.setEnabled(true);
    					btnMelhorDe.setEnabled(true);
    				}
    			}
    		});
    		btnMelhorDe.setForeground(Color.BLACK);
    		btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground"));
    		btnMelhorDe.setBounds(246, 124, 104, 23);
    		contentPane.add(btnMelhorDe);
    		
    		JLabel label = new JLabel("");
    		label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg")));
    		label.setBounds(10, 0, 277, 192);
    		contentPane.add(label);
    		
    		JLabel label_1 = new JLabel("");
    		label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png")));
    		label_1.setBounds(0, 0, 434, 261);
    		contentPane.add(label_1);
    	}
    }

     

     

  8. Criei um jogo, a caráter de estudo, de lançar dados para dois jogadores onde um número aleatório(1-6) é gerado representando o dado e dependendo do número que sair pontos são adicionados para o jogador que efetuou a jogada.

    No Menu (JFrame) é possível selecionar dois modos (melhor de 3 e 18 pontos), escolhendo qualquer um dos dois criará um novo View(JFrame onde é exibido o jogo), no inicio do construtor de View coloquei dois showImputDialog que pedem que seja digitado o nome do Jogador 1 e em seguida do Jogador 2.

     

    Eu quero que durante esse showImputDialog caso o usuário clique em cancelar o JFrame de View não seja exibido na tela e retorne para o JFrame do Menu.

    Tentei realizar uma lógica para que isso acontecesse porém quando o usuário clica em cancelar, o JFrame de View é aparentemente fechado porém ao voltar para o ActionListener(JButton do Menu)  o View é novamente aberto com todas as informações descarregadas. 

     

    Não sei o que está acontecendo, segue aí o código (parcialmente gerado pelo WindowBuilder do Eclipse)

     

    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import java.awt.event.ActionEvent;
    import java.awt.Font;
    import java.awt.Toolkit;
    import java.awt.Color;
    
    public class View extends JFrame {
    
    	private JPanel contentPane;
    	private int rodadas = 0;
    	private int objetivo = 18;
    	private Dado dado = new Dado();
    	int vez = new Random().nextInt(1);
    	private Jogador j1 = new Jogador();
    	private Jogador j2 = new Jogador();
    
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					View frame = new View();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public View() {
    		setIconImage(Toolkit.getDefaultToolkit().getImage(View.class.getResource("/imagem/view/icons8-dado-24.png")));
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBackground(Color.WHITE);
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    
    		Menu.btnNewButton.setEnabled(false);
    		Menu.btnMelhorDe.setEnabled(false);
    
    		String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
    		if(nomeJ1 != null) {
    			j1.setNome(nomeJ1);
    			String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);
    			
    			if(nomeJ2 != null) {
    				j2.setNome(nomeJ2);
    
    				JLabel lblNewLabel = new JLabel("");
    				lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (8).jpg")));
    				;
    				lblNewLabel.setBounds(197, 11, 227, 222);
    				contentPane.add(lblNewLabel);
    
    				//nomes
    				JLabel jogador_1_Pontos = new JLabel("");
    				jogador_1_Pontos.setBounds(10, 109, 153, 23);
    				jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos");
    				contentPane.add(jogador_1_Pontos);
    
    				JLabel jogador_2_Pontos = new JLabel("");
    				jogador_2_Pontos.setBounds(10, 196, 153, 23);
    				jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos");
    				contentPane.add(jogador_2_Pontos);
    
    				JLabel jogador_1_Nome = new JLabel(j1.getNome());
    				jogador_1_Nome.setBounds(10, 78, 153, 23);
    				contentPane.add(jogador_1_Nome);
    
    				JLabel jogador_2_Nome = new JLabel(j2.getNome());
    				jogador_2_Nome.setBounds(10, 165, 153, 23);
    				contentPane.add(jogador_2_Nome);
    
    				JLabel vezJogador = new JLabel("");
    				vezJogador.setBounds(10, 230, 153, 23);
    				contentPane.add(vezJogador);
    
    				JLabel rodadasLbl = new JLabel("Prepare-se para o duelo!");
    				rodadasLbl.setFont(new Font("Times New Roman", Font.BOLD | Font.ITALIC, 14));
    				rodadasLbl.setBounds(232, 236, 167, 14);
    				contentPane.add(rodadasLbl);
    
    
    
    
    
    
    
    				JButton btnNewButton = new JButton("Jogar Dado");
    				btnNewButton.addActionListener(new ActionListener() {
    					public void actionPerformed(ActionEvent e) {
    						if(Menu.regra1) {
    							if (j1.getPontos() < objetivo && j2.getPontos() < objetivo) {
    								int i = dado.jogarDado();						
    
    								if (vez == 0) {
    									j1.aumentarPontos(i);
    									jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos.");
    									vezJogador.setText("Vez de " + j2.getNome());
    									vez = 1;
    								}
    								else {
    									j2.aumentarPontos(i);
    									jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos.");
    									vezJogador.setText("Vez de " + j1.getNome());
    									vez = 0;
    								}
    
    
    								dado.showImagem(i, lblNewLabel);
    
    								rodadas++;
    								rodadasLbl.setText("Rodada " + String.valueOf(rodadas));
    
    								if (j1.getPontos() >= objetivo) {
    									JOptionPane.showMessageDialog(null,j1.vitoria());
    									Menu.btnNewButton.setEnabled(true);
                                      		Menu.btnMelhorDe.setEnabled(true);
    									dispose();
    								}
    
    
    								else if (j2.getPontos() >= objetivo) {
    									JOptionPane.showMessageDialog(null,j2.vitoria());
    									Menu.btnNewButton.setEnabled(true);
                                     		Menu.btnMelhorDe.setEnabled(true);
    									dispose();
    								}
    
    							}
    
    							else {
    								if (j1.getPontos() > j2.getPontos())
    									JOptionPane.showMessageDialog(null,j1.vitoria());
    
    								else if (j1.getPontos() == j2.getPontos())
    									JOptionPane.showMessageDialog(null,"Empatou");
    
    								else
    									JOptionPane.showMessageDialog(null,j2.vitoria());
    
    								Menu.btnNewButton.setEnabled(true);
                                   		Menu.btnMelhorDe.setEnabled(true);
    								dispose();
    							}
    						}	
    						else {//melhor de 3, ainda não está pronto
    
    							if (rodadas <= 6) {
    								int i = dado.jogarDado();						
    
    
    								if (vez == 0) {
    									j1.setPontosRodada(i);
    									jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos.");
    									vez = 1;
    								}
    								else {
    									j2.setPontosRodada(i);
    									jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos.");
    									vez = 0;
    								}
    
    								if (j1.getPontosRodada() != 0 && j2.getPontosRodada() != 0) {
    									if (j1.getPontosRodada() > j2.getPontosRodada()) {
    										j1.aumentarPontos(i);
    										j1.setPontosRodada(0);
    										j2.setPontosRodada(0);
    									}
    									else if (j1.getPontosRodada() == j2.getPontosRodada()) {
    										j1.aumentarPontos(i);
    										j2.aumentarPontos(i);
    										j1.setPontosRodada(0);
    										j2.setPontosRodada(0);
    									}
    									else
    										j2.aumentarPontos(i);
    									j1.setPontosRodada(0);
    									j2.setPontosRodada(0);
    								}
    								dado.showImagem(i, lblNewLabel);
    
    								rodadas++;
    								rodadasLbl.setText("Rodada " + String.valueOf(rodadas));
    
    								if (j1.getPontos() >= objetivo) {
    									JOptionPane.showMessageDialog(null,j1.vitoria());
    									Menu.btnNewButton.setEnabled(true);
                                        	Menu.btnMelhorDe.setEnabled(true);
    									dispose();
    								}
    
    
    								else if (j2.getPontos() >= objetivo) {
    									JOptionPane.showMessageDialog(null,j2.vitoria());
    									Menu.btnNewButton.setEnabled(true);
                                        	Menu.btnMelhorDe.setEnabled(true);
    									dispose();
    								}
    
    							}
    
    							else {
    								if (j1.getPontos() > j2.getPontos())
    									JOptionPane.showMessageDialog(null,j1.vitoria());
    
    								else if (j1.getPontos() == j2.getPontos())
    									JOptionPane.showMessageDialog(null,"Empatou");
    
    								else
    									JOptionPane.showMessageDialog(null,j2.vitoria());
    
    								Menu.btnNewButton.setEnabled(true);
                                    	Menu.btnMelhorDe.setEnabled(true);
    								dispose();
    							}
    
    						}
    					}
    				});
    				btnNewButton.setBounds(10, 24, 100, 23);
    				contentPane.add(btnNewButton);
    			}
    				
    			else {
    				Menu.btnNewButton.setEnabled(true);
    				Menu.btnMelhorDe.setEnabled(true);
    				dispose();
    				
    			}
    				
    		}
    
    
    		else {
    			Menu.btnMelhorDe.setEnabled(true);
    			Menu.btnNewButton.setEnabled(true);
    			dispose();
    		}
    			
    
    
    
    
    
    
    
    
    
    
    	}
    }
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JLabel;
    import javax.swing.ImageIcon;
    import javax.swing.UIManager;
    import java.awt.Font;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.Toolkit;
    import java.awt.Color;
    
    public class Menu extends JFrame {
    
    	private JPanel contentPane;
    
    	static boolean regra1 = true;
    	static JButton btnNewButton = new JButton("18 pontos");
    	static JButton btnMelhorDe = new JButton("Melhor de 3");
    	
    	
    	
    
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					Menu frame = new Menu();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public Menu() {
    		setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png")));
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("Dados Arcade");
    		lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow"));
    		lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18));
    		lblNewLabel.setBounds(236, 39, 138, 33);
    		contentPane.add(lblNewLabel);
    		
    		
    		btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				regra1 = true;
    				new View().setVisible(true);
    			}
    		});
    		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
    		btnNewButton.setBounds(246, 83, 104, 23);
    		contentPane.add(btnNewButton);
    		
    		
    		btnMelhorDe.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				regra1 = false;
    				new View().setVisible(true);
    			}
    		});
    		btnMelhorDe.setForeground(Color.BLACK);
    		btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground"));
    		btnMelhorDe.setBounds(246, 124, 104, 23);
    		contentPane.add(btnMelhorDe);
    		
    		JLabel label = new JLabel("");
    		label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg")));
    		label.setBounds(10, 0, 277, 192);
    		contentPane.add(label);
    		
    		JLabel label_1 = new JLabel("");
    		label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png")));
    		label_1.setBounds(0, 0, 434, 261);
    		contentPane.add(label_1);
    	}
    }
    
    public class Jogador {
    	private String nome = null;
    	private int pontos;
    	private int pontosRodada = 0;
    	
    	public void aumentarPontos(int pontos) {
    		this.pontos += pontos;
    	}
    	
    	public String vitoria() {
    		
    		return "Parabéns " + this.nome + " você venceu com " + String.valueOf(pontos) + "!!";
    	}
    	
    	public void setNome(String nome) {
    		this.nome = nome;
    	}
    	
    	public void setPontosRodada(int pontosRodada) {
    		this.pontosRodada = pontosRodada;
    	}
    	
    	public String getNome() {
    		return nome;
    	}
    	
    	public int getPontos() {
    		return pontos;
    	}
    	
    	public int getPontosRodada() {
    		return pontosRodada;
    	}
    }
    import java.util.Random;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    
    public class Dado {
    	private int numeroLados = 6;
    	
    	public int jogarDado() {
    		int escolhido = new Random().nextInt(numeroLados) + 1;
    		
    		return escolhido;
    	}
    	
    	public void showImagem(int i, JLabel lblNewLabel) {
    
    		if( i == 1)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (3).jpg")));
    
    		else if(i == 2)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (4).jpg")));
    
    
    		else if(i == 3)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (5).jpg")));
    
    
    		else if(i == 4)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (6).jpg")));
    
    
    		else if(i == 5)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (7).jpg")));
    
    
    		else if(i == 6)
    			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/images (1).jpg")));
    	}
    }

     

    dddd.png

    download (2).jpg

    download (3).jpg

    download (4).jpg

    download (5).jpg

    download (6).jpg

    download (7).jpg

    download (8).jpg

    icons8-dado-24.png

    images (1).jpg

  9. Realmente é melhor usar ArrayList, mas como eu não conhecia direito, preferi fazer meu próprio vetor, ainda vou adaptar para ArrayList no código.

    O método setExtrato adiciona uma String em um vetor de Strings (que cada conta tem) sempre que uma operação é realizada, algo tipo "Fulano depositou tanto na conta de Deltrano". O getExtrato é chamado no menu principal e ele exibe o vetor de Strings da conta que está logada.

    Quanto a classe Data estou um pouco indeciso sobre o que vou fazer com ela, creio que vou deixá-la como String e criar uma classe Time que poderá ser usada no setExtrato por exemplo

  10. TÓPICO DUPLICADO**

    Interface apenas define o que fazem as classes que a implementam, meu erro realmente foi falta de conhecimento do que era uma interface.

    Consegui resolver o problema criando um package para Sistema e ContaDiretor, mudando atributos/métodos como contas[ ] e totalContas para protected.

    ContaDiretor continua herdando de Conta e agora tem acesso exclusivo a atributos/métodos da classe Sistema

    package Sistema;
    
    import Conta.Conta;
    
    public class Sistema{
    	
    	protected Conta contas[] = new Conta[100];
    	public Conta contaPublic = new Conta();
    	
    	protected String nomeBanco = "Banco do Brasil";
    	protected int totalContas = 0;
    	
    	public String getNomeBanco() {
    		return nomeBanco;
    	}
    	
    	public void adicionaConta(Conta conta){
    
    		this.contas[totalContas] = conta;
    		totalContas++;
    
    
    	}
    	//...
    }
    package Sistema;
    
    import Banco.Banco;
    import Conta.Conta;
    
    public class ContaDiretor extends Conta{
    	public static String nomeDoBanco;
    	
    	public void setNomeBanco(String nome) {
    		Banco.reg1.nomeBanco = nome;
    		// TODO Auto-generated constructor stub
    	}
    	
  11. TÓPICO DUPLICADO**

    Interface apenas define o que fazem as classes que a implementam, meu erro realmente foi falta de conhecimento do que era uma interface.

    Consegui resolver o problema criando um package para Sistema e ContaDiretor, mudando atributos/métodos como contas[ ] e totalContas para protected.

    ContaDiretor continua herdando de Conta e agora tem acesso exclusivo a atributos/métodos da classe Sistema

    package Sistema;
    
    import Conta.Conta;
    
    public class Sistema{
    	
    	protected Conta contas[] = new Conta[100];
    	public Conta contaPublic = new Conta();
    	
    	protected String nomeBanco = "Banco do Brasil";
    	protected int totalContas = 0;
    	
    	public String getNomeBanco() {
    		return nomeBanco;
    	}
    	
    	public void adicionaConta(Conta conta){
    
    		this.contas[totalContas] = conta;
    		totalContas++;
    
    
    	}
    	//...
    }
    package Sistema;
    
    import Banco.Banco;
    import Conta.Conta;
    
    public class ContaDiretor extends Conta{
    	public static String nomeDoBanco;
    	
    	public void setNomeBanco(String nome) {
    		Banco.reg1.nomeBanco = nome;
    		// TODO Auto-generated constructor stub
    	}
    	

     

  12. Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema).

     

    Classe Conta

    package Conta;
    
    import Banco.Cliente;
    import Banco.Data;
    
    public class Conta {
    	public int numero;
    	protected double saldo;
    	public String extrato[] = new String [100];
    	public Cliente titular = new Cliente();
    	public Data DataDeAbertura = new Data();
    
    	public void depositar (double saldo){
    		this.saldo += saldo;
    
    	}
    
    	public double getSaldo(){
    
    		return saldo;
    	}
    
    
    
    	protected boolean podeSacar(double valor){
    
    		if (saldo < valor)
    			return false;
    		else
    			return true; 
    
    	}
    
    	public void sacar (double valor, Conta conta){
    		if (podeSacar(valor)) {
    
    			saldo -= valor;
    			System.out.println("Novo Saldo: ");
    			System.out.print(conta.getSaldo());
    			System.out.println("");
    
    		}    
    		else 
    			System.out.println("Saldo indisponível");
    
    	}
    
    
    
    	public void transferencia (Conta c2){
    
    	}
    
    	public void getExtrato () {
    
    		for (int i = 0; i < extrato.length; i++) {
    			if (extrato[i] == null){
    				break;
    			}
    			else
    				System.out.println(extrato[i]);
    
    		}
    
    
    
    	}
    
    	public void setExtrato(String nome, String atividade, double valor) {
    
    		String extrato = nome + " " + atividade + " " + Double.toString(valor);
    		for (int i = 0; i < this.extrato.length; i++) {
    			if (this.extrato[i] == null) {
    
    				this.extrato[i] = extrato;
    				break;
    			}
    
    		}
    
    
    	}
    	public void setExtrato(String nome, String atividade, double valor, String nome2) {
    
    		String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2;
    		for (int i = 0; i < this.extrato.length; i++) {
    			if (this.extrato[i] == null) {
    
    				this.extrato[i] = extrato;
    				break;
    			}
    
    		}
    
    
    	}
    
    	public boolean contaequals(Conta a){
    
    		return (this.titular.login == a.titular.login);        
    	}
    }
    

    Classe Sistema

    package Banco;
    
    import Conta.Conta;
    
    public class Sistema{
    	
    	public Conta contas[] = new Conta[100];
    	public Conta contaPublic = new Conta();
    	
    	private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ  DE ALTERAR NOMEBANCO
    	private int totalContas = 0;			//E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA)
    	
    	public String getNomeBanco() {
    		return nomeBanco;
    	}
    	
    	public void adicionaConta(Conta conta){
    
    		this.contas[totalContas] = conta;
    		totalContas++;
    
    
    	}
    
        
        public Conta getConta(int pos) {
        	return contas[pos];
        }
        
        public Conta[] getContaVetor() {//retorna o vetor inteiro
        	return contas;
        }
        
        
    }

    Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todas as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema?

    Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema.

     

    Como ContaDiretor terá acesso a duas classes ao mesmo tempo?

     

    Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema:

    package Conta;
    
    import Banco.InterfaceSistema;
    
    public class ContaDiretor extends Conta implements InterfaceSistema{
    	public static String nomeDoBanco;
    	
    	public void setNomeDoBanco(String nome) {
    		this.nomeDoBanco = nome;
    		// TODO Auto-generated constructor stub
    	}
    	
    	public String getNomeBanco() {
    		
    	}
    	
    	
    
    }
    package Banco;
    
    import Conta.Conta;
    
    public interface InterfaceSistema {
    
    	
    	public String getNomeBanco();
    	
    	public void adicionaConta(Conta conta);
    	
    	public Conta getConta(int pos);
    	
    	public Conta[] getContaVetor();
    	
    	
    	
    
    }

     

  13. Estou criando um simples sistema de banco (estudando), nele possuo a classe Conta com alguns métodos e informações básicas da conta (String nome, String cpf, double saldo, getSaldo()), e possuo a classe Sistema onde guardo as contas cadastradas, eu quero criar a classe ContaDiretor que deve ser capaz de estender de Conta (pois é um conta) e de Sistema (será o único a poder alterar variáveis da classe Sistema).

     

    Classe Conta

    package Conta;
    
    import Banco.Cliente;
    import Banco.Data;
    
    public class Conta {
    	public int numero;
    	protected double saldo;
    	public String extrato[] = new String [100];
    	public Cliente titular = new Cliente();
    	public Data DataDeAbertura = new Data();
    
    	public void depositar (double saldo){
    		this.saldo += saldo;
    
    	}
    
    	public double getSaldo(){
    
    		return saldo;
    	}
    
    
    
    	protected boolean podeSacar(double valor){
    
    		if (saldo < valor)
    			return false;
    		else
    			return true; 
    
    	}
    
    	public void sacar (double valor, Conta conta){
    		if (podeSacar(valor)) {
    
    			saldo -= valor;
    			System.out.println("Novo Saldo: ");
    			System.out.print(conta.getSaldo());
    			System.out.println("");
    
    		}    
    		else 
    			System.out.println("Saldo indisponível");
    
    	}
    
    
    
    	public void transferencia (Conta c2){
    
    	}
    
    	public void getExtrato () {
    
    		for (int i = 0; i < extrato.length; i++) {
    			if (extrato[i] == null){
    				break;
    			}
    			else
    				System.out.println(extrato[i]);
    
    		}
    
    
    
    	}
    
    	public void setExtrato(String nome, String atividade, double valor) {
    
    		String extrato = nome + " " + atividade + " " + Double.toString(valor);
    		for (int i = 0; i < this.extrato.length; i++) {
    			if (this.extrato[i] == null) {
    
    				this.extrato[i] = extrato;
    				break;
    			}
    
    		}
    
    
    	}
    	public void setExtrato(String nome, String atividade, double valor, String nome2) {
    
    		String extrato = nome + " " + atividade + " " + Double.toString(valor) +" para "+ nome2;
    		for (int i = 0; i < this.extrato.length; i++) {
    			if (this.extrato[i] == null) {
    
    				this.extrato[i] = extrato;
    				break;
    			}
    
    		}
    
    
    	}
    
    	public boolean contaequals(Conta a){
    
    		return (this.titular.login == a.titular.login);        
    	}
    }
    

    Classe Sistema

    package Banco;
    
    import Conta.Conta;
    
    public class Sistema{
    	
    	public Conta contas[] = new Conta[100];
    	public Conta contaPublic = new Conta();
    	
    	private String nomeBanco = "Banco do Brasil"; //QUERO QUE O DIRETOR SEJA O UNICO CAPAZ  DE ALTERAR NOMEBANCO
    	private int totalContas = 0;			//E O UNICO CAPAZ DE RECEBER TOTALCONTAS (FORA A CLASSE SISTEMA)
    	
    	public String getNomeBanco() {
    		return nomeBanco;
    	}
    	
    	public void adicionaConta(Conta conta){
    
    		this.contas[totalContas] = conta;
    		totalContas++;
    
    
    	}
    
        
        public Conta getConta(int pos) {
        	return contas[pos];
        }
        
        public Conta[] getContaVetor() {//retorna o vetor inteiro
        	return contas;
        }
        
        
    }

    Conheço muito pouco interfaces, eu tentei criar uma porém descobrir que todas as variáveis em uma interface são "final", ou seja não é possível alterar seu valor. Se eu crio um método abstrato (na interface) setNomeBanco ou getTotalContas, como é que ContaDiretor irá visualizar esses atributos se eles só existem em Sistema?

    Não quero deixar NomeBanco e TotalContas public, pois quero que apenas seja possível chamar na classe ContaDiretor e na classe Sistema.

     

    Como ContaDiretor terá acesso a duas classes ao mesmo tempo?

     

    Segue abaixo o esboço da classe ContaDiretor e da interface InterfaceSistema:

    package Conta;
    
    import Banco.InterfaceSistema;
    
    public class ContaDiretor extends Conta implements InterfaceSistema{
    	public static String nomeDoBanco;
    	
    	public void setNomeDoBanco(String nome) {
    		this.nomeDoBanco = nome;
    		// TODO Auto-generated constructor stub
    	}
    	
    	public String getNomeBanco() {
    		
    	}
    	
    	
    
    }
    package Banco;
    
    import Conta.Conta;
    
    public interface InterfaceSistema {
    
    	
    	public String getNomeBanco();
    	
    	public void adicionaConta(Conta conta);
    	
    	public Conta getConta(int pos);
    	
    	public Conta[] getContaVetor();
    	
    	
    	
    
    }

     

  14. Era o que eu temia. (Preencher um vetor null com outro vetor null não funcionou)

    Nesse código o usuário precisa digitar a quantidade de pessoas que serão analisadas, de acordo com o valor fornecido serão criados os objetos Pessoa11.

    //Maneira 1: Classe principal
    Pessoa11 pessoa[] = new Pessoa11[numbers]; //numbers é fornecido pelo usuário
    			
    			for (int i = 0; i < pessoa.length; i++) 
    				v1.adicionaPessoa(pessoa[i);
    			// Preenche o vetor

    Aparentemente eu teria que instanciar uma quantidade x de objetos e deixá-los disponíveis para o usuário.

    Tipo criar 100 objetos pessoas, porém o usuário deverá pedi para analisar menos de 100 pessoas.

     

    Creio que essa não é a forma correta de fazer isso, e também não consegui pensar em um método que instancie X objetos.

  15. Quando na main vou chamar os métodos da classe Pessoa11 através de um vetor pessoas que se encontra na classe Vetor11, ocorre o erro java.lang.NullPointerException;

    Quando um vetor de objetos é criados eles são "inicializados" como null, eu criei um código que deveria preencher esse vetor, mas parece que não funcionou.

     

    Essa é a classe Vetor11 que cria o vetor de pessoas.

     

    public class Vetor11 {
        private Pessoa11 pessoas[] = new Pessoa11[100];
        
        //adiciona aluno
        public void adicionaPessoa(Pessoa11 pessoa){
            for(int i = 0; i < pessoas.length;i++){
                if(pessoas[i] == null){
                   pessoas[i] = pessoa;
                   break;
                }
            }
        }
        
        public Pessoa11 getPessoa(int pos) {//retorna os objetos
        	return pessoas[pos];
        }
        

    Essa abaixo se encontra na classe principal. Cheguei a pensar que o problema estaria no método adicionarPessoa que pede uma pessoa e recebe um vetor de pessoas, alterei o que sabia e continuou sem funcionar

     

    //Maneira 1: Classe principal
    Pessoa11 pessoa[] = new Pessoa11[numbers];
    			
    			for (int i = 0; i < pessoa.length; i++) 
    				v1.adicionaPessoa(pessoa[i);
    			// Preenche o vetor
                                             
    //Maneira 2: Classe principal
    Pessoa11 pessoa[] = new Pessoa11[numbers];
    			Pessoa11 nada = new Pessoa11();
    			for (int i = 0; i < pessoa.length; i++) {
    				nada = pessoa[i];
    				v1.adicionaPessoa(nada);
    			}
    			// Preenche o vetor
    

    Logo na primeira linha em que tento usar um método da classe Pessoa11 acontece esse erro

    for (int i = 0; i < numbers; i++) {
    				int n = i + 1;
    
    				while (i < numbers) {
    					System.out.printf("Digite o nome da pessoa %d:\n", n);
    
    					String stri = scan.nextLine();
    					if (eString(stri)) {
    						v1.getPessoa(i).setNome(stri);//Exception in thread "main" java.lang.NullPointerException
    						break;
    					} else
    						System.out.println("O nome deve conter apenas caracteres alfabéticos!!");
    
    				}
    			}

     

  16. Sou iniciante em C++, estava seguindo um tutorial(25/06/18) e fiz esse código:

    #include <iostream>
    #include <fstream>
    #include<string>
    
    using namespace std;
    
    int main() {
    	cout << "File Reader" << endl;
    	const char* fileName = "myFile.txt";
    	ifstream inFile(fileName);
    	string line = "";
    
    	if (inFile.is_open()){
    
    		while (getline (inFile, line)); {//aparentemente só é executado uma vez
    			cout << line <<'\n';//deveria exibir linha por linha
    		}
    
    	}
    	else
    		cout << "Could not open file: " << fileName << endl;
    
    	inFile.close();
    
    	return 0;
    }

    O arquivo em questão possui apenas três linhas

    Essa é a linha um
    Segunda linha aqui
    2458631 23

    O código deveria ler linha por linha do texto e imprimir na tela, porém ele apenas lê a última linha e imprime 

    File Reader
    2458631 23

    Se eu declaro uma variável i para contar quantas vezes o código repete, ela recebe o valor 1 indicando que o loop funciona apenas uma vez.

    int i = 0;
    	if (inFile.is_open()){
    
    		while (getline (inFile, line)); {
    			i++;
    			cout << line <<'\n';
    			cout << i << endl;
    		}
    
    	}

    Por quê esse código não funciona e como realizar a leitura cada linha de um arquivo txt?

     

    Ps: Não tentei usar o for, me interessa descobri o erro desse.

    Ps2: No vídeo o código funcionou.

    • Obrigado 1
  17. Você não falou para quê serve esse programa, ou qual o erro que você encontrou nele.

    Comentei o código todo, e acredito que o problema que você encontrou esteja na linha 21.

    É sempre bom comentar o código e imprimir textos informando para o usuário o que diabos está acontecendo.

    import java.util.Scanner;
    
    public class Main10 {
    	
    	public static void main(String[] args) {
    		Scanner scan = new Scanner(System.in);
    		System.out.println("Quantas vezes o programa deve repetir?");
    		int t = scan.nextInt();// O valor de t define quantas vezes o loop continuará
    		int min;
    		
    		while(t-- !=0) {
    			
    			//System.out.println("Quantos inteiros irão ser digitados?");
    			//int n = scan.nextInt() - 1; //Essa é uma maneira de pedir essa informação para o usuário 
    			System.out.println("Qual o comprimento do vetor?");
    			int n = scan.nextInt();// O valor de n define quantos arrays o vetor r terá
    			int[] r = new int[n];
    			min = 10000;
    			
    			//Aqui o usuário insere o valor de cada array
    			for(int i=0; i<r.length; i++) { // Dessa maneira o último array fica vazio, o certo seria 
    				System.out.println("Digite um inteiro: ");//for(int i=0; i<=r.length; i++) 
    				r[i] = scan.nextInt();
    				
    			}
    			
    			for(int i=0; i<r.length; i++) {// min é reduzido para um valor menor/igual que r[i]
    				while(r[i]%min != 0) {
    					min--;
    				}
    			}
    			
    			for(int i =0; i<n; i++) {// O valor de cada array é divido por min
    				r[i]= r[i]/min;
    				System.out.printf("O valor da posição %d foi alterado \n", i);
    			}
    		
    			for(int i =0; i<n; i++) {//Aqui ele exibe o novo valor de cada array
    				System.out.print(r[i]+" ");
    			}
    		}
    	}
    }

    Qualquer coisa não hesite em perguntar.

  18. Fiz o que você disse, o que estava faltando mesmo era deixar as variáveis acessíveis a partir da classe (algo que eu não sabia).

    Quando o método main reexecutava linhas como essas:

    //números aleatórios
    double m1[] = new double [41];
    double m2[] = new double [41];
    double m3[] = new double [41];
    double m4[] = new double [41];

    Ele redefinia seus valores como zero, agora elas são declaradas antes da função main, mantendo dessa forma o valores definidos na primeira vez.

     

    Sobre a questão do array 0 está vazio, como são 40 alunos (1 - 40) quis deixar o índice do vetor correspondendo à posição do aluno. Mas eu corrigi isso adicionando um (i + 1) na saída.

     

    Criar outros métodos ajudou bastante, porém não vi necessidade de criar novos métodos para o menu 2.

     

    Prometo da uma olhada nesse vídeo que me recomendastes.

     

    Segue o código corrigido a seguir:

    import java.util.Scanner;
    import java.util.Random;
    public class Quest05 {
    	
    	private static Scanner scanner = new Scanner (System.in);
    	
    	//números aleatórios
    	private static double m1[] = new double [40];
    	private static double m2[] = new double [40];
    	private static double m3[] = new double [40];
    	private static double m4[] = new double [40];
    	private static double start = 0;
    	private static double end = 10;
    	private static int repeat = 0;//loop
    	private static boolean nextBreak = false;
    	
    	
    	//preencher notas
    	public static void preencherNotas() { //new Random().nextDouble()
    		for (int i = 0;  i < m1.length; i++) { //double aleatório de 0 - 1;
    			
    			m1[i] = start + (new Random().nextDouble() * (end - start));
    				
    		}
    		
    		for (int i = 0;  i < m2.length; i++) {
    			
    			m2[i] = start + (new Random().nextDouble() * (end - start));
    			
    		}
    		
    		for (int i = 0;  i < m3.length; i++) {
    			
    			m3[i] = start + (new Random().nextDouble() * (end - start));
    			
    		}
    		
    		for (int i = 0;  i < m4.length; i++) {
    			
    			m4[i] = start + (new Random().nextDouble() * (end - start));
    			
    		}
    	}
    	
    	
    	
    	public static double eDouble(String str) {
    		double valid;
    		try {	
    			str = str.replace(",", ".");
    			valid = Double.parseDouble(str);
    		
    		}
    		catch (NumberFormatException e) {
    			valid = 121;
    		}
    		return valid;
    		
    	}
    	
    	public static int eInteger(String str) {
    		int valid;
    		try {	
    			
    			valid = Integer.parseInt(str);
    		
    		}
    		catch (NumberFormatException e) {
    			valid = 121;
    		}
    		return valid;
    		
    	}
    	
    	public static boolean loop(String restart) { // menu sim ou não
    		
    		char temp = 'd';
    		boolean end = false;
    		
    		while (temp != 's') {  //O loop só é quebrado se o usuário entrar com 's'ou 'n'
    			
    			if (restart.length() > 1 || restart.equalsIgnoreCase("")) 
    				restart = "p";
    				
    			temp = restart.charAt(0);
    				
    			if (temp == 'n') {
    				end = true; //encerra o programa
    				break;
    			}	
    			else if (temp != 's') {
    				System.out.println("Opção inválida!!");
    				restart = scanner.nextLine();
    			}
    				
    		}
    		return end;
    	}
    	
    	//receber notas
    	public static void receberNotas(double m[]) {
    		
    		nextBreak = false;
    		for (int i = 0;  i < m.length; i++) {
    			String nota = "j";
    			int loop2 = 0;
    			while (loop2 == 0) {
    				System.out.println("Digite a primeira nota do aluno " + (i + 1));
    				nota = scanner.nextLine();
    				
    				if (nota.equals("Sair")) {
    					System.out.println("Fim de Programa.");
    					repeat++;
    					nextBreak = true;
    					break;
    				}
    					
    				else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) 	{
    					m[i] += eDouble(nota);
    					loop2++;
    				}
    				
    				else {
    					System.out.println("Valor digitado inválido!");
    					System.out.println("Deseja tentar inserir esta nota novamente?");
    					String answer = scanner.nextLine();
    					if (loop(answer)) {
    						loop2++;
    						m[i] = 0;
    						
    					}
    				}
    			}
    			
    			if (nextBreak)
    				break;						
    		}
    		
    		
    	}
    	
    	public static void main(String[] args) {
    	
    		boolean newOption = false;
    		
    		System.out.println("Bem vindo ao Medianator 4000!!!"); // Boas vindas
    		System.out.println("Tecle [ENTER] para continuar: ");
         	String enter = "nada";
         	  	
    		while (!enter.equals("")) {
    				
    				enter = scanner.nextLine();//vai ler o que o usuário digitar
    				//O loop só é quebrado se o usuário entrar com \n
    				if (enter.equals(""))
    					break;
    		}	
    		
    		
    		
    		while (repeat == 0) {
    			
    			nextBreak = false;
    			
    			//menu 1
    			System.out.println("Escolha a opção desejada: ");
    			
    			if (newOption)
    				System.out.println("0 - Utilizar banco de dados existente ");
    			
    			System.out.println("1 - Gerar novo banco de dados");
    			System.out.println("2 - Inserir novos dados");
    			System.out.println("3 - Sair");
    			String op = "e";
    			
    			int menu1 = 0;
    			
    			while (menu1 == 0) {
    				op = scanner.nextLine();
    				int option = eInteger(op);
    				if (!newOption && option == 0)
    					option = 121;
    							
    				
    				
    				switch (option) {
    					case 0:
    						menu1++;
    						break;
    						
    					case 1: //As médias são preenchidas com números aleatórios
    						
    						preencherNotas();
    						menu1++;
    						break;
    						
    					case 2:// O usuário insere as notas de cada media
    						
    					
    						System.out.println("Primeira avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						
    						receberNotas(m1);
    						
    						if (nextBreak)
    							break;
    						else 
    							System.out.println(nextBreak);
    												
    						System.out.println("Segunda avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    
    						receberNotas(m2);
    					
    						if (nextBreak)
    							break;
    						
    						System.out.println("Terceira avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						
    						receberNotas(m3);
    												
    						if (nextBreak)
    							break;
    						
    						
    						System.out.println("Quarta avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						
    						receberNotas(m4);
    						
    						menu1++;
    						break;
    						
    					case 3:
    						System.out.println("Fim de Programa.");
    						repeat ++;
    						nextBreak = true;
    						break;
    				
    					default:
    						System.out.println("Opção inválida tente novamente!!");
    						break;
    				}
    				
    				if (nextBreak)
    					break;
    			}
    		
    			if (nextBreak)
    				break;
    			
    			//menu 2
    			int menu2 = 1;
    			System.out.println("Escolha um opção: ");
    			System.out.println("1 - Exibir média anual de cada aluno");
    			System.out.println("2 - Exibir média da turma");
    			System.out.println("3 - Exibir média de um aluno específico");
    			System.out.println("4 - Voltar para o menu anterior");
    			
    			do {				
    				op = scanner.nextLine();
    				int option2 = eInteger(op);
    				
    				
    				double mediaAlunos[] = new double [40];
    				double sum = 0;
    				double mediaTurma = 0;
    				
    				if (option2 != 4) {
    					for (int i = 0; i < 40; i++) { // Calcula a média de cada aluno
    						mediaAlunos[i] = (m1[i] + m2[i] + m3[i] + m4 [i]) / 4;
    					}	
    				}
    				
    				switch (option2){
    					case 1:
    						System.out.println("A média de cada aluno: ");
    						for (int i = 0; i < 40; i++) {
    							System.out.println("Aluno " + (i + 1));
    							System.out.printf(" %.2f\n", mediaAlunos[i]);
    						}
    						menu2++;
    						break;
    						
    					case 2:
    						for(int i2 = 0; i2 < mediaAlunos.length; i2++){
    					        sum = sum +  mediaAlunos[i2];
    						}
    						mediaTurma = sum / 40;
    						System.out.println("A média da turma é: ");
    						System.out.printf(" %.2f\n", mediaTurma);
    						menu2++;
    						break;
    					
    					
    					case 3:
    						int aluno = 0;
    						int selectThis = 0;
    						
    						while (selectThis == 0) {
    							System.out.println("Digite o número do aluno desejado: ");
    							op = scanner.nextLine();
    							aluno = eInteger(op);
    							if (aluno > 0 && aluno <= 40) {						
    								System.out.printf("A média do aluno %d é: %.2f \n", aluno, mediaAlunos[aluno - 1]);
    								menu2++;
    								break;
    							}
    							
    							else {
    								System.out.println("Aluno inexistente!");
    								System.out.println("Deseja tentar novamente?");
    								String answer = scanner.nextLine();
    								if (loop(answer))
    									selectThis++;
    								
    							}
    						}
    						break;
    						
    						
    						
    					
    					case 4:
    						repeat = 0;
    						menu2++;
    						break;
    						
    					default: 
    						System.out.println("Opção inválida!");
    						menu2 = 0;
    						break;
    				}
    				
    				if (option2 >= 0 && option2 < 4) {
    					newOption = true;
    					System.out.println("Deseja continuar(s/n)? ");
    					int v = 0;
    					String restart = scanner.nextLine();
    					while (v == 0) {
    					
    						if (loop(restart)) {
    							System.out.println("Fim de Programa.");
    							v++;
    							repeat++;
    						}
    					
    						else 
    							v++;
    					}
    				}
    				
    			}while (menu2 == 0);		
    					
    		}
    			
    	}
    }

     

  19. Sou iniciante em Java, esse código calcula e exibe a média de quatro notas (cada uma armazenada em um vetor). Possui dois menus:

     

    menu 1:

    1 - Gerar dados - (Os vetores são preenchidos com doubles aleatórios de 0-10)

    2 - Inserir dados - (O usuário insere o valor de cada vetor)

    3 - Sair

     

    menu 2:

    1 - Exibir a média anual de cada aluno

    2 - Exibir média da turma                                         

    3 - Exibir média de um aluno específico

    4 - Voltar ao menu anterior

     

    Após o passar pelo segundo menu (escolhendo 1, 2 ou 3) o usuário tem a opção continuar (loop), quando isso acontece o menu 1 ganha uma nova opção:

    0 - Utilizar banco de dados existente. (Essa opção pularia a definição de valores dos vetores (pois eles já estariam definidos))

     

    Agora chegamos no problema: Ao invés de manter os dados definidos anteriormente, eles (os vetores) estão ficando vazios, retornando 0,00.

    Como manter os dados informados na primeira repetição do loop?

    Segue aí o código:

    import java.util.Scanner;
    import java.util.Random;
    public class Quest05 {
    	
    	public static double eDouble(String str) {
    		double valid;
    		try {	
    			str = str.replace(",", ".");
    			valid = Double.parseDouble(str);
    		
    		}
    		catch (NumberFormatException e) {
    			valid = 121;
    		}
    		return valid;
    		
    	}
    	
    	public static int eInteger(String str) {
    		int valid;
    		try {	
    			
    			valid = Integer.parseInt(str);
    		
    		}
    		catch (NumberFormatException e) {
    			valid = 121;
    		}
    		return valid;
    		
    	}
    	
    	public static boolean loop(String restart) { // menu sim ou não
    		Scanner scanner = new Scanner (System.in);
    		char temp = 'd';
    		boolean end = false;
    		
    		while (temp != 's') {  //O loop só é quebrado se o usuário entrar com 's'ou 'n'
    			
    			if (restart.length() > 1 || restart.equalsIgnoreCase("")) 
    				restart = "p";
    				
    			temp = restart.charAt(0);
    				
    			if (temp == 'n') {
    				end = true; //encerra o programa
    				break;
    			}	
    			else if (temp != 's') {
    				System.out.println("Opção inválida!!");
    				restart = scanner.nextLine();
    			}
    				
    		}
    		return end;
    	}
    	
    	public static void main(String[] args) {
    	
    		Scanner scanner = new Scanner(System.in);
    		boolean newOption = false;
    		
    		System.out.println("Bem vindo ao Medianator 4000!!!"); // Boas vindas
    		System.out.println("Tecle [ENTER] para continuar: ");
         	String enter = "nada";
         	  	
    		while (!enter.equals("")) {
    				
    				enter = scanner.nextLine();//vai ler o que o usuário digitar
    				//O loop só é quebrado se o usuário entrar com \n
    				if (enter.equals(""))
    					break;
    		}	
    		
    		int repeat = 0;//loop
    		
    		while (repeat == 0) {
    			
    			boolean nextBreak = false;
    			
    			//números aleatórios
    			double m1[] = new double [41];
    			double m2[] = new double [41];
    			double m3[] = new double [41];
    			double m4[] = new double [41];
    			
    			//menu 1
    			System.out.println("Escolha a opção desejada: ");
    			
    			if (newOption)
    				System.out.println("0 - Utilizar banco de dados existente ");
    			
    			System.out.println("1 - Gerar novo banco de dados");
    			System.out.println("2 - Inserir novos dados");
    			System.out.println("3 - Sair");
    			String op = "e";
    			
    			int menu1 = 0;
    			
    			while (menu1 == 0) {
    				op = scanner.nextLine();
    				int option = eInteger(op);
    				if (!newOption && option == 0)
    					option = 121;
    							
    				//new Random().nextDouble(); //double aleatório de 0 - 1;
    				double start = 0;
    				double end = 10;
    				
    				switch (option) {
    					case 0:
    						menu1++;
    						break;
    						
    					case 1: //As médias são preenchidas com números aleatórios
    						
    						for (int i = 1;  i < m1.length; i++) {
    							
    							m1[i] += start + (new Random().nextDouble() * (end - start));
    								
    						}
    						
    						for (int i = 1;  i < m2.length; i++) {
    							
    							m2[i] += start + (new Random().nextDouble() * (end - start));
    							
    						}
    						
    						for (int i = 1;  i < m3.length; i++) {
    							
    							m3[i] += start + (new Random().nextDouble() * (end - start));
    							
    						}
    						
    						for (int i = 1;  i < m4.length; i++) {
    							
    							m4[i] += start + (new Random().nextDouble() * (end - start));
    							
    						}
    						menu1++;
    						break;
    						
    					case 2:// O usuário insere as notas de cada media
    						
    						String nota = "j";
    						System.out.println("Primeira avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						
    						for (int i = 1;  i < m1.length; i++) {
    							
    							int loop2 = 0;
    							while (loop2 == 0) {
    								System.out.println("Digite a primeira nota do aluno " + i);
    								nota = scanner.nextLine();
    								
    								if (nota.equals("Sair")) {
    									System.out.println("Fim de Programa.");
    									repeat++;
    									nextBreak = true;
    									break;
    								}
    									
    								else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) 	{
    									m1[i] += eDouble(nota);
    									loop2++;
    								}
    								
    								else {
    									System.out.println("Valor digitado inválido!");
    									System.out.println("Deseja tentar inserir esta nota novamente?");
    									String answer = scanner.nextLine();
    									if (loop(answer)) {
    										loop2++;
    										m1[i] = 0;
    										
    									}
    								}
    							}
    							
    							if (nextBreak)
    								break;						
    						}
    						
    						if (nextBreak)
    							break;
    												
    						System.out.println("Segunda avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						for (int i = 1;  i < m2.length; i++) {
    							int loop2 = 0;
    							while (loop2 == 0) {
    								System.out.println("Digite a segunda nota do aluno " + i);
    								nota = scanner.nextLine();
    								
    								if (nota.equals("Sair")) {
    									System.out.println("Fim de Programa.");
    									repeat++;
    									nextBreak = true;
    									break;
    								}
    									
    								else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) 	{
    									m2[i] += eDouble(nota);
    									loop2++;
    								}
    								
    								else {
    									System.out.println("Valor digitado inválido!");
    									System.out.println("Deseja tentar inserir esta nota novamente?");
    									String answer = scanner.nextLine();
    									if (loop(answer)) {
    										loop2++;
    										m2[i] = 0;
    										
    									}
    								}
    							}
    							
    							if (nextBreak)
    								break;	
    						}					
    					
    						if (nextBreak)
    							break;
    						
    						System.out.println("Terceira avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						for (int i = 1;  i < m3.length; i++) {
    							int loop2 = 0;
    							while (loop2 == 0) {
    								System.out.println("Digite a terceira nota do aluno " + i);
    								nota = scanner.nextLine();
    								
    								if (nota.equals("Sair")) {
    									System.out.println("Fim de Programa.");
    									repeat++;
    									nextBreak = true;
    									break;
    								}
    									
    								else if(eDouble(nota) >= 0 && eDouble(nota) <= 10) 	{
    									m3[i] += eDouble(nota);
    									loop2++;
    								}
    								
    								else {
    									System.out.println("Valor digitado inválido!");
    									System.out.println("Deseja tentar inserir esta nota novamente?");
    									String answer = scanner.nextLine();
    									if (loop(answer)) {
    										loop2++;
    										m3[i] = 0;
    										
    									}
    								}
    							}
    							
    							if (nextBreak)
    								break;	
    						}
    						
    						if (nextBreak)
    							break;
    						
    						
    						System.out.println("Quarta avaliação.");
    						System.out.println("Digite 'Sair' a qualquer momento para encerrar a aplicação.");
    						for (int i = 1;  i < m4.length; i++) {
    							int loop2 = 0;
    							while (loop2 == 0) {
    								System.out.println("Digite a quarta nota do aluno " + i);
    								nota = scanner.nextLine();
    								
    								if (nota.equals("Sair")) {
    									System.out.println("Fim de Programa.");
    									repeat++;
    									nextBreak = true;
    									break;
    								}
    									
    								else if (eDouble(nota) >= 0 && eDouble(nota) <= 10) 	{
    									m4[i] += eDouble(nota);
    									loop2++;
    								}
    								
    								else {
    									System.out.println("Valor digitado inválido!");
    									System.out.println("Deseja tentar inserir esta nota novamente?");
    									String answer = scanner.nextLine();
    									if (loop(answer)) {
    										loop2++;
    										m4[i] = 0;
    										
    									}
    								}
    								
    							}
    							
    							if (nextBreak)
    								break;	
    								
    							
    						}
    						
    						menu1++;
    						break;
    						
    					case 3:
    						System.out.println("Fim de Programa.");
    						repeat ++;
    						nextBreak = true;
    						break;
    				
    					default:
    						System.out.println("Opção inválida tente novamente!!");
    						break;
    				}
    				
    				if (nextBreak)
    					break;
    			}
    		
    			if (nextBreak)
    				break;
    			
    			//menu 2
    			int menu2 = 1;
    			System.out.println("Escolha um opção: ");
    			System.out.println("1 - Exibir média anual de cada aluno");
    			System.out.println("2 - Exibir média da turma");
    			System.out.println("3 - Exibir média de um aluno específico");
    			System.out.println("4 - Voltar para o menu anterior");
    			
    			do {				
    				op = scanner.nextLine();
    				int option2 = eInteger(op);
    				
    				
    				double mediaAlunos[] = new double [41];
    				double sum = 0;
    				double mediaTurma = 0;
    				
    				if (option2 != 4) {
    					for (int i = 1; i < 41; i++) { // Calcula a média de cada aluno
    						mediaAlunos[i] = (m1[i] + m2[i] + m3[i] + m4 [i]) / 4;
    					}	
    				}
    				
    				switch (option2){
    					case 1:
    						System.out.println("A média de cada aluno: ");
    						for (int i = 1; i < 41; i++) {
    							System.out.println("Aluno " + i);
    							System.out.printf(" %.2f\n", mediaAlunos[i]);
    						}
    						menu2++;
    						break;
    						
    					case 2:
    						for(int i2 = 1; i2 < mediaAlunos.length; i2++){
    					        sum = sum +  mediaAlunos[i2];
    						}
    						mediaTurma = sum / 40;
    						System.out.println("A média da turma é: ");
    						System.out.printf(" %.2f\n", mediaTurma);
    						menu2++;
    						break;
    					
    					
    					case 3:
    						int aluno = 0;
    						int selectThis = 0;
    						
    						while (selectThis == 0) {
    							System.out.println("Digite o número do aluno desejado: ");
    							op = scanner.nextLine();
    							aluno = eInteger(op);
    							if (aluno > 0 && aluno < 41) {						
    								System.out.printf("A média do aluno %d é: %.2f \n", aluno, mediaAlunos[aluno]);
    								menu2++;
    								break;
    							}
    							
    							else {
    								System.out.println("Aluno inexistente!");
    								System.out.println("Deseja tentar novamente?");
    								String answer = scanner.nextLine();
    								if (loop(answer))
    									selectThis++;
    								
    							}
    						}
    						break;
    						
    						
    						
    					
    					case 4:
    						repeat = 0;
    						menu2++;
    						break;
    						
    					default: 
    						System.out.println("Opção inválida!");
    						menu2 = 0;
    						break;
    				}
    				
    				if (option2 >= 0 && option2 < 4) {
    					newOption = true;
    					System.out.println("Deseja continuar(s/n)? ");
    					int v = 0;
    					String restart = scanner.nextLine();
    					while (v == 0) {
    					
    						if (loop(restart)) {
    							System.out.println("Fim de Programa.");
    							v++;
    							repeat++;
    						}
    					
    						else 
    							v++;
    					}
    				}
    				
    			}while (menu2 == 0);		
    					
    		}
    			
    	}
    }
    

     

    • Curtir 1
  20. Nunca usei try e o catch (nem o Buffered e o throw new), só sei que se ele falha na execução de alguma instrução do bloco try ele pula para o bloco catch, se puder me explicar como o código funciona me ajudaria muito.

     

    Pelo que eu entendi por padrão é sempre ler como String, faz a validação para então converter para o formato desejado.

    Para o meu problema eu usei esse dois códigos aí embaixo, que deram para o gasto.

    public static boolean valida(String k) {
            
            boolean numero = k.matches("[0-9]+");//Se houver apenas números nesta String retorna true
            
            return numero;
    }

     

     

     

    public static boolean valida(String k) {
    		
    	boolean numero = k.matches("[0-9]+");//Se conter apenas números na String retorna true
    	int pos = k.indexOf("-");//Se "-" é o primeiro caractere retorna 0
    	if (!numero && pos == 0)// Fiz algo parecido com relação ao ponto/vírgula para validar double
    		numero = true;
    	return numero;
    }

     

  21. Sou iniciante em Java, estou testando como fazer validação de dados, até o momento eu pegava o que o usuário digitava e jogava em switch, case, if e tralala...

     

    Agora me deparei com isso: "

    double b = scanner.nextDouble();

    Ao executar esse tipo de linha de código o programa só prossegue se receber a informação do usuário;

     

    Caso seja fornecido caracteres não numéricos, o programa da pau (não é possível guardar letras nesse formato obviamente) e encerra, não sendo possível realizar a validação da mesma forma que eu vinha fazendo.

    Noto que existe um espaço para parâmetros em:

    scanner.nextDouble();

    É possível realizar esse tipo de verificação com algum parâmetro?

     

    Seja qual for a forma, quero descobrir maneiras de impedir que variáveis numéricas tentem receber letras.

    • Curtir 1

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!