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.
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 + "].");
}
}
}
}
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:
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.
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.