Matriz, Arrays

Pessoal, boa noite!
Estou com a penúltima actividade da faculdade para entregar, mas estou empancada a meio da sua resolução.
A questão é a seguinte:
Faça um programa que comece por pedir um valor N ao utilizador. De seguida, crie uma matriz de N x N e
preenche-a com valores inteiros aleatórios, entre 0 e 100.
Depois de apresentar a matriz inicial ao utilizador, deve percorrê-la, linha a linha, e substituir cada elemento pela média (inteira) de todos os elementos seguintes da matriz. O último elemento, M{N,N}, ficará com o valor ZERO.

Exemplo:

N = 3
Matriz inicial:
2 19 45
16 33 21
76 55 3
Matriz Final:
M{1,1} = (19+45+16+33+21+76+55+3)/8 = 33
M{1,2} = (45+16+33+21+76+55+3)/7 = 35
M{1,3} = (16+33+21+76+55+3)/6 = 34
M{2,1} = (33+21+76+55+3)/5 = 37
M{2,2} = (21+76+55+3)/4 = 38
M{2,3} = (76+55+3)/3 = 44
M{3,1} = (55+3)/2 = 29
M{3,2} = (3)/1 = 3
M{3,3} = 0
33 35 34
37 38 44
29 3 0

Até agora é o que tenho :

package tema7;

import java.util.Scanner;
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		ArrayList<Integer> numerosDaMatriz = new ArrayList();
		final int minimo = 1;
		final int maximo = 1000;
		
		System.out.println("Insira um número: ");
		int numero = scan.nextInt();
		
		int[][] matriz = new int[numero][numero];
		
		for(int i = 0; i < numero; i++) {
			for(int j = 0; j < numero; j++) {
				matriz[i][j] = (int)(Math.random() * maximo + minimo);
				numerosDaMatriz.add(matriz[i][j]);
			}
		}
	}
	
	matrizFinal[i][j] = elementoMatrizFinal/numerosDaMatriz.size();
	numerosDaMatriz.remove(0);
}
}
}

for(int i = 0; i < numero; i++) {
	for(int j = 0; j< numero; j++) {
		System.out.println(matrizFinal[i][j]);
	}

Alguém me pode ajudar? @Iohannes Florentium Silvius Iuniore pode ajudar-me?

Acho que o segredo é você calcular a soma total da matriz e ir subtraindo cada elemento! Ex:

N = 3
Matriz inicial:
2 19 45
16 33 21
76 55 3

Soma Total = 270;
Número (k) de elementos = 3 × 3 = 9;

Matriz Final:

M{1,1} = (Total - 2)/(k - 1) = 268/8 = 33
Total = 268
K = 8

M{1,2} = (Total - 19)/(k - 1) =  249/7= 35
Total = 249
K = 7

M{1,3} = (Total - 45)/(k - 1) = 204/6 = 34
Total = 204;
K = 6

[•••]

E quando k = 0 a média tem que ser 0!

33 35 34
37 38 44
29 3 0

import java.util.Random;
import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);

    System.out.println("Insira um número:");
    int n = scan.nextInt();

    int[][] matriz = new int[n][n];
    int total = 0;
    Random rd = new Random();

    for(int i = 0; i<n; i++){
      for(int j = 0; j<n; j++){
        int valor = (rd.nextInt(100) + 1);
        matriz[i][j] = valor;
        total += valor;
      }
    }

    System.out.println("\nMatriz inicial:");
    mostrarMatriz(matriz);
    System.out.println();


    /* Substituir cada elemento pela média (inteira)
     * de todos os elementos seguintes da matriz.
    */
    int k = n * n;

    for(int i = 0; i<n; i++){
      for(int j = 0; j<n; j++){

        //A soma total de todos os elementos seguintes da matriz.
        total -= matriz[i][j];
        k -= 1;

        int media = (k > 0)? (total/k) : 0;
        matriz[i][j] = media;
      }
    }

    System.out.println("Matriz final:");
    mostrarMatriz(matriz);
  }

  private static void mostrarMatriz(int[][] matriz){
    for(int i = 0; i<matriz.length; i++){
      for(int j = 0; j<matriz[0].length; j++){
        System.out.printf("%4d",matriz[i][j]);
      }
      System.out.println();
    }
  }
}

Boa noite!!! :coffee:

@Sonia_Santos sou calouro em Java, mas achei interessante o seu exercício e resolvi pegar pra resolver, o meu funcionou, talvez o código não fique claro pra você, mas espero que ajude!
Pra saber se ia dar certo, testei com os valores da sua matriz incial, e saiu os mesmo resultados!

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

  Scanner scan = new Scanner(System.in);
  final int minimo = 1;
  final int maximo = 1000;
  final int intervalo = maximo - minimo;
  System.out.print("Insira um número: ");
  int numero = scan.nextInt();
  int[][] matrizInicial = new int[numero][numero];
  
  int x = 0;
  int y = numero*numero;
  for(int i = 0; i < matrizInicial.length; i++) {
  	for (int j = 0; j < matrizInicial[i].length; j++) {
  		matrizInicial[i][j] = (int)(Math.random() * intervalo + minimo);
  		x += matrizInicial[i][j];
  	}
  }
  for(int i = 0; i < matrizInicial.length; i++) {
  	for(int j = 0; j < matrizInicial[i].length; j++) {
  		y -= 1;
  		if(y == 0) {
  			y = 1;
  		}
  		x -= matrizInicial[i][j];
  		matrizInicial[i][j] = x / y;
  		System.out.println(matrizInicial[i][j]);
  	}
  }

}
}

OLá! muito obrigada pela ajuda! Mas quando corro o código e coloco 3 não fica igual ao exemplo…

Mas o código disponibilzado pelo Jelson1 funciona muito bem se quiser ver! :slight_smile:

Muito obrigada pela ajuda!!! :slight_smile:

1 curtida

Só para esclarecer qualquer dúvida que tenha ficado!

“Não entendo a razão mas quando ponho o codigo a correr não aparece igual. quando ponho 3 não fica igual ao exemplo nem com 5 fica igual à sua resolução.”

A matriz é preenchida de forma aleatória, entre 1 e 100:

int valor = (rd.nextInt(100) + 1);
matriz[i][j] = valor;

E o segredo para mostrar a matriz alinhada está nessa linha:

System.out.printf("%4d",matriz[i][j]);

São 4 espaços em branco que serão preenchido ou não pelo valor da matriz! Exemplo:

| – | – | – | – |

| – | – | – | 1 |
| – | – | 4 | 4 |
| – | 1 | 0 | 0 |

Se porventura você aumentar o número máximo de dígito você deve alterar o valor 4 para outro!
Se quiser pesquise mais sobre printf ou String.format!:+1:

Oi @Sonia_Santos, :coffee:,
Eu testei e está funcionando normalmente, não está gerando os mesmos valores do seu exemplo, pois eu o havia modificado para gerar valores aleatórios como foi solicitado no exercício!

Veja com os números que estão no seu exercício se os resultados não são mesmos agora :grinning::

1 curtida

Oh pois eu depois li melhor e percebi, sou um pouco lenta! ehehehe Obrigada!!!