Como adicionar nome a uma matriz de inteiros

Olá pessoal, to com uma dúvida aqui: preciso criar um programa que automatiza o cálculo de médias dos alunos. Nele o usuário informa, qtd de provas, trabalhos, alunos e o peso das provas. E precisa também imprimir o nome do aluno, seu id estudantil e se foi aprovado ou não.

Estou com uma dúvida aqui: criei uma matriz de [alunos][provas]: Aí nela imprime: A nota do ALUNO 0 é: 5.
Mas em vez de imprimir ALUNO 0, eu queria que imprimisse: Aluno João.
Eu tenho muita dificuldade em lógica…

Meu código:

import java.util.Scanner;
public class Aluno{
public static void main(String [] args){
Scanner sc = new Scanner (System.in);

  int alunos = 0, provas = 0;
  int [][] notas;
  double mediaProvas = 0;

  System.out.println("Digite o número de alunos: ");
  alunos = sc.nextInt();
  System.out.println("Digite o número de provas: ");
  provas = sc.nextInt();

  notas = new int [alunos][provas];

  for (int i = 0; i < notas.length; i++ ) {
  	for(int p = 0; p < notas[i].length; p++){
  		System.out.println("Digite a nota " + p + " do aluno " + i + ":");
  		notas[i][p] = sc.nextInt();
  	}
  	
  }for (int i = 0; i < notas.length; i++ ) {
  	System.out.println("Notas do aluno: " + i + ":\t");
  	for (int j = 0; j < notas[i].length; j++){
  		System.out.println(notas [i][j] + "\t");
  	}
  }
  for (int i=0;i<notas[0].length ;i++ ) {
  	for (int j=0;j<notas.length ;j++ ) {
  		mediaProvas += notas[j][i];
  	}
  	mediaProvas /= notas.length;
  	System.out.println("A media da prova " + i + " é: " + mediaProvas);
  	mediaProvas = 0;
  }

}
}

Você já tem uma classe Aluno.
Agora crie um atributo do tipo String chamado nome.
E um atributo do tipo int[] chamado notas.

Aí no seu programa, ao invés de criar um array bidimensional de int, você cria um array de Aluno, cada aluno tem seu nome e suas notas.

Você pode criar um outro objeto para guardar o nome dos alunos.

algo como

String[] nomes;

inicializa na hora que digitar a qtd de alunos,

e deixe algo que vai percorrer a qtd de alunos e preencher o array, algo como:

  for (int i = 0; i < alunos.length; i++ ) {
  // peça para digitar o nome do aluno + i (no caso vai ser 0 o primeiro)
  nomes[i] = sc.nextString();
}

ai na hora que tu for mostrar as notas, ficaria algo como:

for (int i = 0; i < notas.length; i++ ) {
  	System.out.println("Notas do aluno: " + nomes[i] + ":\t"); //aqui a única adição foi o nomes[i]
  	for (int j = 0; j < notas[i].length; j++){
  		System.out.println(notas [i][j] + "\t");
  	}

o melhor seria criar objetos (POJOs) para guarda essas infos e vc conseguiria mais fácil, mas imaginando que isso seja um exercício de faculdade/escola e exigem que exista o command line, faça ± pelo caminho que falei

Sim, eu preciso transformar esse código em orientação a objetos, não posso deixar ele do jeito que tá, é o que pede no enunciado. Obrigado pelas dicas, estarei atualizando o post.

  for(int i = 0; i < alunos; i++){
  	System.out.println("Digite o nome do aluno: ");
  	String nomes[];
  	nomes[alunos] = sc.nextLine();
  
  }

Como eu faço para inicializar o array de mesmo tamanho do alunos?

String[] nomes = new String[alunos.length];

Eu faria diferente:

Classe Aluno:

public class Aluno {

    String nome;
    int[] notas;

    Aluno(String nome, int qtdNotas) {
        this.nome = nome;
        this.notas = new int[qtdNotas];
    }
}

Programa:

import java.io.PrintStream;
import java.util.Scanner;

public class Exemplo {

    public static void main(String[] args) {
        Exemplo programa = new Exemplo();
        programa.executar();
    }

    private final Scanner entrada = new Scanner(System.in);
    private final PrintStream saida = System.out;

    public void executar() {
        escrever("Digite o número de alunos: \n");
        int qtdAlunos = lerInteiro();

        escrever("Digite o número de provas: \n");
        int qtdProvas = lerInteiro();

        Aluno[] alunos = cadastrarAlunos(qtdAlunos, qtdProvas);

        apresentarNotas(alunos);

        apresentarMedias(qtdProvas, alunos);

    }

    private void apresentarMedias(int qtdProvas, Aluno[] alunos) {
        for (int prova = 0; prova < qtdProvas; prova++) {
            double soma = 0;
            for (Aluno aluno : alunos) {
                soma += aluno.notas[prova];
            }
            double media = soma / (double) qtdProvas;
            escrever("A media da prova " + (prova + 1) + " é: " + media + "\n");
        }
    }

    private void apresentarNotas(Aluno[] alunos) {
        for (Aluno aluno : alunos) {
            escrever("Notas do " + aluno.nome + ":");
            for (int nota : aluno.notas) {
                escrever("    " + nota);
            }
            escrever("\n");
        }
    }

    private Aluno[] cadastrarAlunos(int qtdAlunos, int qtdProvas) {
        Aluno[] alunos = new Aluno[qtdAlunos];
        for (int i = 0; i < alunos.length; i++) {
            escrever("Digite o nome do aluno " + (i + 1) + ": ");
            Aluno aluno = new Aluno(lerTexto(), qtdProvas);
            for (int n = 0; n < qtdProvas; n++) {
                escrever("Digite a nota " + (n + 1) + " do " + aluno.nome + ": ");
                aluno.notas[n] = lerInteiro();
            }
            alunos[i] = aluno;
        }
        return alunos;
    }

    private void escrever(String mensagem) {
        saida.print(mensagem);
    }

    private int lerInteiro() {
        return Integer.parseInt(lerTexto());
    }

    private String lerTexto() {
        return entrada.nextLine();
    }
}

Não aprendemos ainda sobre o “printstream” é a mesma coisa do System.out.print?

Ah, e quando instancio o vetor para tamanho dos alunos, dá erro ao compilar: int cannot be dereferenced (não pode colocar .length) - Corrigido!

Sempre leia a documentação das classes do Java.
O atributo out da classe System é do tipo PrintStream.
Fiz dessa forma para manter a ortogonalidade, assim como você tem uma variável entrada para ler dados, também tem uma variável saida para escrever dados.
:slight_smile: