Java Erro de Armazenamento

numeros[n] = sc.nextInt(); NÃO REARMAZENA VALORES

ch[n][l] = s; NÃO ARMAZENA VALORES

QUERO CONSERTAR O MEU CODIGO, PORFAVOR ME AJUDEM.

public class Exercicio2_32Apostila{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int [] numeros = new int[5];
        int qn = 0;
        int qp = 0;
        int qz = 0;
        int length[] = new int [5];
        boolean done = false; 
        for(int n = 0; n < 5; n++){
            do{
                try{
                    numeros[n] = sc.nextInt();
                    System.out.println(numeros[n]);
                    done = true;
                }catch(Exception e1){
                    System.out.print("Error type again: ");
                }
            }while(done);
            if(numeros[n] < 0){
                qn++;
            }else if(numeros[n] > 0){
                qp++;
            }else{
                qz++;
            }            
        }
        String [] numerosS = new String[5];
        for(int n = 0; n < 5; n++){
            numerosS[n] = Integer.toString(numeros[n]);
        }
        char [][]ch = {{}};
        for(int n = 0; n < 5; n++){
            for(int l = 0; l < numerosS[n].length(); l++){
                ch= new char[n][l];
            }
        }
        //System.out.println(ch.length);
        for(int n = 0; n < 5; n++){
            for(int l = 0; l < numerosS[n].length(); l++){
                char s = numerosS[n].charAt(l);
                ch[n][l] = s;
                System.out.print(ch[n][l]);
                if(ch[n][l] == '0'){
                    qz++;
                }
            }
        }
        System.out.println(qn);
        System.out.println(qp);
        System.out.println(qz);
    }
}

Em qual situação que vai sair desse loop?

Done = true
Já faz isso por mim.
Se
numeros[n] = sc.nextInt();
Emitir um erro, o codigo pula o done e vai para catch.
Por isso já tem uma condição de saida.

Testa ai o passo a passo e vera que não ta pedindo um novo valor se tiver acontecido um erro.

E mais não tem como fazer uma condição de saida além dessa. Ou melhor que essa.

Essa é exatamente a questão do @staroski… Se colocares um valor válido, não estás a sair do loop. Se colocares um valor inválido, sai imediatamente sem voltar a pedir um valor. O que queres é exatamente o contrário: sair do loop quando tiveres um valor válido e repetir enquanto o valor não for válido.

1 curtida

Esse laço é um do-while.

Enquanto o done for true, ele vai repetir.

No seu caso, sempre, já que o done nunca vira false.

1 curtida

Me ajuda com um modelo alternativo, porque ja tentei de tudo. While ao do while e etc… opções

Já deve ter uns trocentos tópicos aqui no fórum explicando como usar Scanner, mas enfim, lá vamos nós de novo… O assunto é tão recorrente que - olha o jabá - resolvi escrever um longo texto sobre isso :slight_smile:


O problema de métodos como nextInt() é que se vc não digitar um número, ele dá erro e não consome os caracteres digitados. E aí na próxima vez que nextInt é chamado, vai tentar consumir os mesmos caracteres e dar o mesmo erro de novo.

Uma alternativa é usar nextLine(), que sempre consome os caracteres (inclusive a quebra de linha, que é o ENTER, algo que nextInt também não consome e causa 99% dos “erros de Scanner”" que o pessoal reporta aqui no fórum). E aí vc tenta converter para número, vê se deu erro, etc. E se a conversão para número der certo, interrompa a loop:

while (true) {
    try {
        System.out.println("Digite um número:");
        numeros[n] = Integer.parseInt(sc.nextLine());
        break; // se deu certo, sai do while
    } catch (Exception e) {
        System.out.println("Erro, tente novamente");
    }
}

Veja que assim nem precisa da variável done. Se de erro no parseInt (ou mesmo na leitura dos dados), ele vai no catch, mostra a mensagem e o while continua. Se a conversão der certo, ele cai no break, que interrompe o loop.

1 curtida

Renomeia sua variável para repeat que você vai entender o erro na sua lógica.

1 curtida

Eu entendi! Consegui arrumar. Porém ainda resta uma dúvida. ch[n][l] = s; NÃO ARMAZENA VALORES

Tentei entender pra que esse ch serve, mas acho mais fácil perguntar: qual é o objetivo deste código?

Vc lê 5 números, e depois o que deveria fazer com eles? Qual deveria ser o resultado? Pode dar alguns exemplos? (tipo, para os números x, y e z deveria dar o resultado abc por causa disso, etc)

O objetivo é retornar os inseridos, os positivos, negativos e quantos zeros foram inseridos nos 5 numeros.

atravez de uma array nao consigo armazenar e condicionar o que é pedido. queria saber o porque

ch sigla para char

Não precisa de array nenhum.


Mas é a quantidade de números iguais a zero? Se for isso, o for já está fazendo:

for (int n = 0; n < 5; n++) {
    while (true) {
        try {
            System.out.println("Digite um número:");
            numeros[n] = Integer.parseInt(sc.nextLine());
            break; // se deu certo, sai do while
        } catch (Exception e) {
            System.out.println("Erro, tente novamente");
        }
    }
    if (numeros[n] < 0) {
        qn++;
    } else if (numeros[n] > 0) {
        qp++;
    } else {
        qz++; // *** AQUI ***
    }
}

O qz++ aumenta o contador se o número digitado for zero. Se é isso que vc quer contar, não precisa do resto, vc já tem a quantidade na variável qz.


Mas se o que você quer é a quantidade de dígitos zero, aí é outra história.

Por exemplo, se a pessoa digitar o número 100, tem que contar dois zeros?

Se for isso, então muda um pouco.

Primeiro você cria um método que retorna a quantidade de dígitos de um número que são iguais a determinado valor, e depois usa ele no main:

// conta quantos dígitos de "n" são iguais a "digito"
static int contaDigitos(int n, int digito) {
    if (n == 0 && digito == 0) {
        return 1;
    }
    n = Math.abs(n); // para tratar número negativo
    int cont = 0;
    while (n > 0) {
        if (n % 10 == digito) {
            cont++;
        }
        n /= 10;
    }
    return cont;
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int[] numeros = new int[5];
    int qn = 0, qp = 0, qz = 0;
    for (int n = 0; n < 5; n++) {
        while (true) {
            try {
                System.out.println("Digite um número:");
                numeros[n] = Integer.parseInt(sc.nextLine());
                break; // se deu certo, sai do while
            } catch (Exception e) {
                System.out.println("Erro, tente novamente");
            }
        }
        if (numeros[n] < 0) {
            qn++;
        } else if (numeros[n] > 0) {
            qp++;
        } // aqui não tem mais qz++, porque eu faço a contagem embaixo
    }
    // para cada número, vê quantos zeros têm e atualiza a contagem
    for (int n : numeros) {
        qz += contaDigitos(n, 0);
    }
    System.out.println(qn);
    System.out.println(qp);
    System.out.println(qz);
}

Lembrando que se a pessoa digitar 0000, só será contado um zero, porque estamos levando em conta o valor numérico (que é zero). Da mesma forma, se digitar 01, o valor numérico é 1, ou seja, não será contando nenhum zero.

1 curtida

Sim! Você acertou a pergunta que tava na minha cabeça. A segunda opção. Vou dar uma olhada para entender.