Dificuldade ao Utilizar Vetor com Relacionamento entre Classes

Bom dia!

Estou aprendendo a matéria sobre Relacionamento entre classes (um p/ um, um p/ muitos);

Estou tentando realizar um exercício na qual tenho que:
"Escreva um programa Teste que crie um curso com 5 alunos e que peça para o usuário entrar com 4 notas de cada aluno.

Ao final, imprima a média de cada aluno, se o mesmo está aprovado (média maior ou igual a 7,0) e qual a média da turma."

Utilizando o relacionamento das classes. e estou com dificuldade na última parte onde devo calcular a média de toda a turma (no caso 5 alunos), creio que devo criar um vetor para armazenar a media dos alunos 1 ao 5, e depois calcular a média geral, mas ao utilizar outras classes fiquei perdido…

eis como está o código:

package cursos;

public class testeCursos {

public static void main(String[] args) {        
    
    //Dados dos Aluno 1 ao 5
    Aluno testeAluno1 = new Aluno("Huguinho");
    System.out.println("Informe a nota de "+testeAluno1.getNome());
    testeAluno1.lancarNotas();
    testeAluno1.exibirDados();        
    
    Aluno testeAluno2 = new Aluno("Zezinho");
    System.out.println("Informe a nota de "+testeAluno2.getNome());
    testeAluno2.lancarNotas();
    testeAluno2.exibirDados();
    
    Aluno testeAluno3 = new Aluno("Luizinho");
    System.out.println("Informe a nota de "+testeAluno3.getNome());
    testeAluno3.lancarNotas();
    testeAluno3.exibirDados();
    
    Aluno testeAluno4 = new Aluno("Luluzinha");
    System.out.println("Informe a nota de "+testeAluno4.getNome());
    testeAluno4.lancarNotas();
    testeAluno4.exibirDados();
    
    Aluno testeAluno5 = new Aluno("Duduzinho");
    System.out.println("Informe a nota de "+testeAluno5.getNome());
    testeAluno5.lancarNotas();
    testeAluno5.exibirDados();
    
    Aluno[] alunos = new Aluno[5];
    alunos[0] = testeAluno1;
    alunos[1] = testeAluno2;
    alunos[2] = testeAluno3;
    alunos[3] = testeAluno4;
    alunos[4] = testeAluno5;
    
    testeCursos.setAlunos(alunos);       
    
}

}

package cursos;

import java.util.Scanner;

public class Aluno {

private String nome;
private static int auxMatricula=100;
private int Matricula;
private float nota1;
private float nota2;
private float nota3;
private float nota4;    

public Aluno(String nome){
    this.nome= nome;
    this.nota1=0;
    this.nota2=0;
    this.nota3=0;
    this.nota4=0;
    this.Matricula = gerarMatricula();    

}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}


public int getMatricula() {
    return Matricula;
}


public void setMatricula(int Matricula) {
    Matricula = auxMatricula;
    this.Matricula = Matricula;
}


public float getNota1() {
    return nota1;
}


public void setNota1(float nota1) {
    this.nota1 = nota1;
}


public float getNota2() {
    return nota2;
}


public void setNota2(float nota2) {
    this.nota2 = nota2;
}


public float getNota3() {
    return nota3;
}


public void setNota3(float nota3) {
    this.nota3 = nota3;
}

public float getNota4() {
    return nota4;
}


public void setNota4(float nota4) {
    this.nota4 = nota4;
}

private static int gerarMatricula(){
    return ++auxMatricula;
}

public void exibirDados(){
    System.out.println("Nome:"+getNome());
    System.out.println("Matricula:"+getMatricula());        
    System.out.println("Nota 1:"+getNota1());
    System.out.println("Nota 2:"+getNota2());
    System.out.println("Nota 3:"+getNota3());
    System.out.println("Nota 4:"+getNota4());
    float media = +calcularMedia(getNota1(),getNota2(),getNota3(),getNota4());
    System.out.println("Media:"+media);        
    if(verificarAprovacao(media)){
        System.out.println("Aprovado!");
    }else{
        System.out.println("Reprovado!");
    }
    
}

public void lancarNotas(){           
    Scanner ler = new Scanner (System.in);
    System.out.println("Informe a Nota1:");
    nota1 = ler.nextFloat();
    System.out.println("Informe a Nota2:");
    nota2 = ler.nextFloat();
    System.out.println("Informe a Nota3:");
    nota3 = ler.nextFloat();
    System.out.println("Informe a Nota4:");
    nota4 = ler.nextFloat();
    System.out.println("Notas Lançadas com Sucesso");
            
}   


private float calcularMedia(float nota1, float nota2, float nota3, float nota4){        
    return (nota1+nota2+nota3+nota4) / 4;
}   

private boolean verificarAprovacao(float mediaCalculada){
    if(mediaCalculada>=7){ 
        return true;
    }
    else {
        return false;
    }       
}   

}

Não exatamente onde devo colocar o método para somar as notas dos 5 alunos e depois calculá-la…

Em vez de ter variáveis como nota1, nota2, etc, use um array de notas:

public class Aluno {
    private String nome;
    private double[] notas; // array de notas

    public Aluno(String nome) {
        this.nome = nome;
        this.notas = new double[4]; // todo aluno tem 4 notas
    }

    public String getNome() {
        return nome;
    }
    public double[] getNotas() {
        return notas;
    }

    public double calcularMedia() {
        double soma = 0;
        for (double nota : this.notas) {
            soma += nota;
        }
        return soma / this.notas.length;
    }
}

O tamanho do array também poderia ser um parâmetro do construtor, algo assim:

public Aluno(String nome, int quantidadeNotas) {
    this.nome = nome;
    this.notas = new double[quantidadeNotas];
    // poderia ter uma validação que lança exceção se o valor for <= 0, etc
}

Mas para simplificar deixei sempre com quatro notas. Repare também que um aluno sabe como calcular sua própria média, e o código é o mesmo independente da quantidade de notas.

Já a leitura e exibição deixei separado (está abaixo), pois acho que os dados devem ser independentes da sua forma de exibição (quem vai mostrar os dados usa a classe para formatar da maneira que achar melhor).

E também não criei setters pois acho que não faz sentido. Uma vez que um aluno foi criado com um nome, ele deveria mudar? Claro que depende dos requisitos do sistema, mas em geral você só cria getters e setters que são necessários.


Já para ler os dados e calcular as médias, ficaria assim:

import java.util.Scanner;

public class Teste {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // cria o array com 5 alunos
        Aluno[] alunos = { new Aluno("Ana"), new Aluno("Beto"), new Aluno("Carla"), new Aluno("Denis"), new Aluno("Edna") };
        // primeiro lê as notas
        for (Aluno aluno : alunos) {
            double[] notas = aluno.getNotas();
            for (int i = 0; i < notas.length; i++) {
                System.out.printf("Aluno: %s - digite a nota %d\n", aluno.getNome(), i + 1);
                notas[i] = sc.nextDouble();
            }
        }

        // mostra as médias de cada aluno, e também calcula a média da turma
        double soma = 0;
        for (Aluno aluno : alunos) {
            double media = aluno.calcularMedia();
            System.out.printf("Média de %s = %.2f (%s)\n", aluno.getNome(), media, media >= 7 ? "Aprovado" : "Reprovado");
            soma += media;
        }
        System.out.printf("Média da turma: %.2f\n", soma / alunos.length);
    }
}

Veja que para calcular a média da turma não precisa criar um array para guardar as médias dos alunos. Você pode ir somando à medida em que calcula a média de cada aluno (reaproveitando o loop). Ao final, basta pegar esta soma e dividir pela quantidade de alunos.

2 curtidas

Realmente seu código ficou bem mais construído e limpo, eu tava realmente muito embolado em como eu lançar as notas dos alunos e armazenar os resultados, fora que não tinha idéia de como fazer funcionar o vetor com outras classes.

Obrigado, vou usar a tua lógica como aprendizado!

Apenas para complenentar a excelente resposta do colega, uma outra abordagem é dar a responsabilidade de adicionar a nota para a propria classe Aluno. Exemplo:

public class Aluno {
    // ...

    public void addNota(double nota, int index) {
        this.notas[index] = nota;
    }

    // ...
}

Assim, o FOR que lê as notas, poderia ser desse jeito:

for (Aluno aluno : alunos) {
    for (int i = 0; i < aluno.getNotas().length; i++) {
        System.out.printf("Aluno: %s - digite a nota %d\n", aluno.getNome(), i + 1);
        aluno.addNota(sc.nextDouble(), i);
    }
}

Claro, é só uma forma diferente de fazer a mesma coisa, e a ideia é não complicar. Apenas pode ser uma boa ideia dá mais responsabilidade para a classe que representa seu domínio, ainda mais se houver validações que precisam ser tratadas e que será usada em vários lugares, como por exemplo, não ser possível informar uma nota menor que 0.

1 curtida