Erro de Lógica ou Detalhe do Java

Boa noite.
Este exercício pede para criar uma matriz de 10x10 e gerar para cada índice, números aleatórios de 0 a 9, imprimí-los e mostrar quais são os menores e maiores da linha 5 e 7.
Pessoal, diferente dos outros tópicos, onde deram a resposta, peço que não façam isso, apenas respondam a pergunta.
Tem algum tipo de erro de lógica (se sim, onde?) ou é algum detalhe do Java em não poder usar tantos if?
Nos os outros tópicos, os colegas também não achavam o erro de lógica, mas respondiam como fazer funcionar.
ELE NÃO ENTRA NOS IF.

package com.leandro.aula20.labs;

public class Exer02 {

public static void main(String[] args) {
    int[][] numeros = new int[10][10];
    int maior = 0;
    int menor = 0;
    int maiorPosI = 0;
    int maiorPosJ = 0;
    int menorPosI = 0;
    int menorPosJ = 0;
    int i = 0;
    int j = 0;
    for (i = 0; i < numeros.length; i++) {
        for (j = 0; j < numeros[i].length; j++) {
            numeros[i][j] = (int) (Math.random() * 10);
            if (i == 4 & j == 0) {
                maior = numeros[i][j];
                menor = numeros[i][j];
            }
            if (i == 4 & numeros[i][j] > maior) {
                maior = numeros[i][j];
                maiorPosI = i;
                maiorPosJ = j;
            } else if (i == 4 & numeros[i][j] < menor) {
                menor = numeros[i][j];
                menorPosI = i;
                menorPosJ = j;
            }

            if (i == 4 & i == 9) {
                System.out.println("O maior número aleatório entre 0 e 9 da Quinta linha é " + maior);
                System.out.println("A posição do maior número "
                        + "da quinta linha é i[" + maiorPosI + "]j[" + maiorPosJ + "].");
            }

            System.out.println("Posição i[" + i + "] e posição j[" + j + "] = " + numeros[i][j]);
        }

    }

}

}

Vamos começar pelo começo.
Já ouviu falar em teste de mesa? Visualg? Ajudaria muito neste caso.
Quando vamos comparar valores, tentando identificar o maior e o menor do grupo, sempre temos que iniciar as variáveis de uma maneira que elas não interfiram no resultado.
Agora me responda, se você tivesse os valores 1, 3, 5, 6 e 9, qual deles seria menor que o valor que você pré definiu nas variáveis menorXXXXXX???

Ah, isso vale para o maior.

Segundo, você não construiu o exercício da maneira correta, de acordo com o enunciado.
O enunciado diz para montar a matriz e não ir tentando adivinhar de acordo com o que o usuário insere, no momento em que ele insere.
Isso significa que você teria que ter, ao menos, um outro laço de repetição externo, para percorrer os índices das linhas (encontrando a 2 e a 7) e para iterar sobre cada coluna, identificando os valores contidos em cada ponto (linha, coluna). Aí sim, os cálculos são realizados.

1 curtida

Darlan, os números não são passados por alguém e sim pelo Math.random de 0 a 9; no primeiro if, eu pergunto ao Java, se o for estiver na posição 4 do i e 0 do j, faça a variável menor pegar o valor dessa posição e o maior também.

Entendi.
Ainda assim, o enunciado, que você mesmo colocou, tem o seguinte texto:

Neste caso, eu não aceitaria uma resposta como você está montando.
Funciona? Sim, mas onde você montou a matriz? Ela só existe até você ler os dados e depois?

Obrigado, Darlan. Bom, uma parte da sua resposta anterior serviu para alguma coisa, só foi usar um segundo for que já matei metade do exercício.
A resposta pra sua pergunta é se eu consegui criar um vetor de vetor, onde os primeiros cabem 10 vetores em cada um e em cada um desses 10 cabem 10 números aleatórios, tendo 100 posições no total e impressos em tela inclusive, não sei como não pode existir essa matriz.

CÓDIGO COMPLETO:

package com.leandro.aula20.labs;

public class Exer02 {

public static void main(String[] args) {
    int[][] numeros = new int[10][10];
    int maior = 0;
    int menor = 0;
    int maiorPosI = 0;
    int maiorPosJ = 0;
    int menorPosI = 0;
    int menorPosJ = 0;
    int i = 0;
    int j = 0;
    for (i = 0; i < numeros.length; i++) {
        for (j = 0; j < numeros[i].length; j++) {
            numeros[i][j] = (int) (Math.random() * 10);

            System.out.println("Posição i[" + i + "] e posição j[" + j + "] = " + numeros[i][j]);
        }

    }

    for (int k = 0; k < numeros.length; k++) {
        for (int l = 0; l < numeros[k].length; l++) {
            if (k == 4 & l == 0) {
                maior = numeros[k][l];
                menor = numeros[k][l];
            }
            if (k == 4 & numeros[k][l] > maior) {
                maior = numeros[k][l];
                maiorPosI = k;
                maiorPosJ = l;
            } else if (k == 4 & numeros[k][l] < menor) {
                menor = numeros[k][l];
                menorPosI = k;
                menorPosJ = l;
            }

            if (k == 4 & l == 9) {
                System.out.println("O maior número aleatório entre 0 e 9 da Quinta linha é " + maior);
                System.out.println("A posição do maior número "
                        + "da quinta linha é i[" + maiorPosI + "]j[" + maiorPosJ + "].");
                System.out.println("O menor número aleatório entre 0 e 9 da Quinta linha é " + menor);
                System.out.println("A posição do maior número "
                        + "da quinta linha é i[" + menorPosI + "]j[" + menorPosJ + "].");
            }
        }

    }
    System.out.println("");
    for (int k = 0; k < numeros.length; k++) {
        for (int l = 0; l < numeros[k].length; l++) {
            if (k == 6 & l == 0) {
                maior = numeros[k][l];
                menor = numeros[k][l];
            }
            if (k == 6 & numeros[k][l] > maior) {
                maior = numeros[k][l];
                maiorPosI = k;
                maiorPosJ = l;
            } else if (k == 6 & numeros[k][l] < menor) {
                menor = numeros[k][l];
                menorPosI = k;
                menorPosJ = l;
            }

            if (k == 6 & l == 9) {
                System.out.println("O maior número aleatório entre 0 e 9 da Sétima linha é " + maior);
                System.out.println("A posição do maior número "
                        + "da quinta linha é i[" + maiorPosI + "]j[" + maiorPosJ + "].");
                System.out.println("O menor número aleatório entre 0 e 9 da Sétima linha é " + menor);
                System.out.println("A posição do maior número "
                        + "da quinta linha é i[" + menorPosI + "]j[" + menorPosJ + "].");
            }
        }

    }

}

}

Eu também trocaria os & por && pra deixar o código mais limpo.
Do jeito que tá, parece que está fazendo um E aritmético e não um E lógico.

1 curtida

Concordo plenamente com o @staroski.

Com relação à matriz, ela é uma estrutura que nós, de forma leiga, acabamos por imaginar espacial (como um quadro ou um cubo).
Na realidade, ela não possui um formato definido, a sua construção visual só existe para nos dar a ideia de como um vetor de 10 posições pode conter, em cada posição, outro vetor.

Mas, caso queira uma montagem “adequada”, sugiro usar algo assim, após criar a matriz, este código pode imprimí-la num formato amigável:

for(int i = 0; i < numeros.length; i++) {
    for(int j = 0; j < numeros[i].length; j++){
         System.out.print(numeros[i][j] + "\t");
    }
        System.out.println("");
}  

Basicamente, o código acima vai imprimir o conteúdo de cada linha, separados por tab e, depois, pular para a próxima linha. Isso tornará a visualização da matriz simples e parecida com o que aprendemos.

E, sim, altere teus & por &&.

1 curtida

Bom dia. Agradeço aos colegas e estou satisfeito com suas prestezas.
O que me deixa boiando é que nem eu, nem os colegas acham os erros de lógicas.
Outro problema que encontrei é que na maior parte do tempo, esse código, já deixado mais limpo, inclusive, funciona perfeitamente, mas em algumas vezes, ele pega posições da linha 0, tanto para o for feito para a linha 5 (posição 4 do i), quanto para o for feito pra linha 7 (posição 6 do i).
Parece que o Java tem, no mínimo, algumas regras para muitos if aninhados, mas que não me citaram até agora ou tem algumas limitações.

Não, não existe mesmo.
Com relação a erros de lógica, apenas o tempo te permitirá olhar e identificar os mesmos.
Porém, eu faria o seguinte, para as análises:

int maior5 = -1, maior7 = -1, menor5 = 9999999999, menor7 = 99999999999;//Não validei, talvez o int não aceite tantos 9

for(int i = 0; i < numeros.length; i++){
    for(int j = 0; j < numeros[i].length; j++) {
        if(4 == i) {
            if(maior5 < numeros[i][j]) {
                maior5 = numeros[i][j];
            }
            if(menor5 > numeros[i][j]){
                menor5 = numeros[i][j];
            }
        }
        //Faz o restante aqui
    }
}

O código acima ainda pode ser melhorado, por exemplo, você só precisa das linhas 4 e 6 (5 e 7 na visão normal). Portanto, não precisa de dois fors aninhados, pode partir direto para:

for(int i = 0; i < 10; i++){
    int val5 = numeros[4][i];
    int val7 = numeros[6][i];
}

Entendeu?

Outra coisa, os operadores lógicos &, &&, | e || têm funções bem distintas.

&&      Conditional-AND
||      Conditional-OR

Enquanto que

&       Bitwise AND
|       Bitwise inclusive OR

Ou seja, quando se utiliza & ou | sozinhos, você compara em nível de bits, creio que não seja o caso, não é mesmo?

P.S: Achei, tem que fazer a mesma coisa com as variáveis de posições:
maiorPosI = k;
maiorPosJ = l;
menorPosI = k;
menorPosJ = l;

Anteriormente:
Certo. Entendi suas dicas do menor e maior e com relação aos operadores.
Igual ao seu código, no meu também tem o if(i == 4) para que ele seja executado, só enquanto estiver na linha 4, além de eu ter exigido que ao entrar na primeira posição (i == 4 && j == 0), as variáveis menor e maior peguem essa posição, só que no final, em algumas execuções, ele pega valores de outras linhas.

Não, o if é que nem o Brasil, não há regras!
Talvez você tenha um erro de compilação se aninhar mais de 65535 if's num mesmo método, mas nunca testei.

1 curtida