[RESOLVIDO]Duvida array = como fazer uma média

Boa tarde galera,
Queria saber se podem me ajudar.
Preciso fazer um método na classe aluno que faça a media dos valores das notas1 e notas2 de todos os alunos.

[code]class Aluno{
private String nome;
private Byte nota1;
private Byte nota2;
private Double frequencia;
byte media;

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

public String getNome(){
	return nome;
}

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

public Byte getNota1(){
	return nota1;
}

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

public Byte getNota2(){
	return nota2;
}

public void setFrequencia( Double frequencia){
	this.frequencia = frequencia*100;
}

public Double getFrequencia(){
	return frequencia;
}

void exibirAlunos(){
	System.out.println("Aluno(a): "+ getNome());
}

// Quero fazer aqui a media de todos os alunos
void mediaSala(){
	media = ( (byte)((nota1+nota2) / 2));
}


// - exibir apenas os alunos aprovados (média >= 7.0 e frequencia >= 75)
void aprovados(){
	if(media>=7.0 && frequencia>=75){
		System.out.println("Aluno "+ getNome() +" aprovado");
	}
}

// - exibir apenas os alunos reprovados (média < 4.0 ou frequencia < 75)
void reprovados(){
	if(media<4.0 || frequencia<75){
		System.out.println("Aluno "+ getNome() +" reprovado");
	}
}	

}[/code]

[code]class Escola{
public static void main( String[] aluno){
Aluno[] alunos = new Aluno[5];

	alunos[0] = new Aluno();
	alunos[0].setNome("Felipe");
	alunos[0].setNota1( (byte) 8);
	alunos[0].setNota2( (byte) 5);
	alunos[0].setFrequencia( (double)0.80 );
	
	alunos[1] = new Aluno();
	alunos[1].setNome("Elisangela");
	alunos[1].setNota1( (byte) 7);
	alunos[1].setNota2( (byte) 7);
	alunos[1].setFrequencia( (double)0.85 );
	
	alunos[2] = new Aluno();
	alunos[2].setNome("Paulo");
	alunos[2].setNota1( (byte) 10);
	alunos[2].setNota2( (byte) 9);
	alunos[2].setFrequencia( (double)0.75);
	
	alunos[3] = new Aluno();
	alunos[3].setNome("Andreia");
	alunos[3].setNota1( (byte) 8);
	alunos[3].setNota2( (byte) 7);
	alunos[3].setFrequencia( (double)0.80 );
	
	alunos[4] = new Aluno();
	alunos[4].setNome("Carla");
	alunos[4].setNota1( (byte) 1);
	alunos[4].setNota2( (byte) 9);
	alunos[4].setFrequencia( (double)0.65);
	
	for( Aluno alunoCorrente : alunos ){
		alunoCorrente.exibirAlunos();

	}
	
	for( Aluno alunoCorrente : alunos ){
		alunoCorrente.aprovados();
	}
	
	for( Aluno alunoCorrente : alunos ){
		alunoCorrente.reprovados();
	}
}

}[/code]

Acho que você não entendeu o que é uma média.

Suponha o exemplo que você deu. Há 5 alunos, então a soma das notas é:

8 + 5

  • 7 + 7
  • 10 + 9
  • 8 + 7
  • 1 + 9
    = 79
    Há 5 * 2 = 10 notas, então a nota média é 79 = 10 = 7.9. Se você precisa arredondar para cima, o valor é 8.

Note que não é aconselhável usar o tipo Byte ou byte para calcular médias ou notas.

void mediaSala(){  
        media = ( (byte)((nota1+nota2) / 2));  
    }  

[quote=entanglement]Acho que você não entendeu o que é uma média.

Suponha o exemplo que você deu. Há 5 alunos, então a soma das notas é:

8 + 5

  • 7 + 7
  • 10 + 9
  • 8 + 7
  • 1 + 9
    = 79
    Há 5 * 2 = 10 notas, então a nota média é 79 = 10 = 7.9. Se você precisa arredondar para cima, o valor é 8.

Note que não é aconselhável usar o tipo Byte ou byte para calcular médias ou notas.

void mediaSala(){ media = ( (byte)((nota1+nota2) / 2)); } [/quote]

Ah ta, até ai blz…a media é somar todos os valores existentes e dividir pela quantidade total…é que essa parte media = ( (byte)((nota1+nota2) / 2)); eu estava usando para outro lugar.
Mas o que é a minha duvida é a seguinte, eu insiro os valores das notas na classe Escola, e quero pegar os valores na classe Aluno fazendo a média das 10 notas dos 5 alunos…

Mas você tentou executar esse código? Está dando algum erro?
Não entendi por que você usou byte para as notas e a média. Byte é um tipo inteiro, as notas não podem ter frações? Acho que em vez de byte, seria melhor usar BigDecimal.
Não vi também onde é chamado o mediaSala(). Acho que você não precisa do método mediaSala() nem de um atributo media - pode criar um método para calcular a média, por exemplo calculaMedia(), que retorna a média. Poderia chamar esse método de dentro do aprovados() e do reprovados().

Exemplo:

void aprovados(){ if(calcularMedia()>=7.0 && frequencia>=75){ System.out.println("Aluno "+ getNome() +" aprovado"); } }

Ou usando BigDecimal:

void aprovados(){ if(calcularMedia().compareTo(new BigDecimal("7.0")) >=0 && frequencia>=75){ System.out.println("Aluno "+ getNome() +" aprovado"); } }

Acho que usar BigDecimal é importante neste caso, porque se você usar float ou double podem ocorrer erros muito estranhos no programa.
No link abaixo tem uma explicação de por que usar BigDecimal:
http://www.guj.com.br/java/275524-java-calculando-errado-o-valor-de-2-doubles#1448885

E neste link explica basicamente como usar:
http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/

PS: você quer calcular a média de cada aluno, ou a média das notas de todos os alunos da turma?

[quote=al.barbosa]Mas você tentou executar esse código? Está dando algum erro?
Não entendi por que você usou byte para as notas e a média. Byte é um tipo inteiro, as notas não podem ter frações? Acho que em vez de byte, seria melhor usar BigDecimal.
Não vi também onde é chamado o mediaSala(). Acho que você não precisa do método mediaSala() nem de um atributo media - pode criar um método para calcular a média, por exemplo calculaMedia(), que retorna a média. Poderia chamar esse método de dentro do aprovados() e do reprovados().

Exemplo:

void aprovados(){ if(calcularMedia()>=7.0 && frequencia>=75){ System.out.println("Aluno "+ getNome() +" aprovado"); } }

Ou usando BigDecimal:

void aprovados(){ if(calcularMedia().compareTo(new BigDecimal("7.0")) >=0 && frequencia>=75){ System.out.println("Aluno "+ getNome() +" aprovado"); } }

Acho que usar BigDecimal é importante neste caso, porque se você usar float ou double podem ocorrer erros muito estranhos no programa.
No link abaixo tem uma explicação de por que usar BigDecimal:
http://www.guj.com.br/java/275524-java-calculando-errado-o-valor-de-2-doubles#1448885

E neste link explica basicamente como usar:
http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/ [/quote]

Seguinte, quero fazer aki o calculo da media da sala: [code]
// Quero fazer aqui a media de todos os alunos
void mediaSala(){

}[/code]
Acho que tirando tudo que tinha ficará mais facil de explicar.Preciso armazenar os valores de um array, para com esses valores fazer a media da sala toda.
Ex: vou pegar a nota1 do primeiro aluno e somar com a nota2 do primeiro aluno, ai pego a nota1 do segundo aluno e coloco nesta mesma soma, faço o mesmo com a nota2 do segundo aluno.

Só lembrando que usar BigDecimal nesse exercício de Java super-básico é matar mosquito com canhão.

double é mais que suficiente, desde que não se queira fazer certos tipos de comparações.

Digamos que em vez de termos 5 alunos, tivéssemos 6, e a soma das notas desse 92.

A média daria 92 / 12 = 7,66666666… que arredondado dá 8.

Mas se for usar o BigDecimal.divide, você teria de especificar a quantidade de casas decimais e outras coisas mais, o que é sempre algo chato de fazer. Senão, ele vai gerar uma exceção, que acho que ainda não está no escopo do que eles estão aprendendo.

Usando double, você terá aqueles problemas óbvios que qualquer calculadora de 4 operações tem (ou seja, o ponto-flutuante não consegue representar corretamente 92/12, mas isso é esperado), e você tem de arredondar de qualquer jeito.

[quote]eu estava usando para outro lugar.
Mas o que é a minha duvida é a seguinte, eu insiro os valores das notas na classe Escola, e quero pegar os valores na classe Aluno fazendo a média das 10 notas dos 5 alunos… [/quote]

Você quer que a classe Aluno faça a média dos 5 alunos?
Pelo que eu entendi, a classe Aluno tem as informações de um aluno. A classe Escola é que conhece todos os alunos.
Não seria a classe Escola que deveria calcular a média de todos os alunos?

Você sabe fazer a soma dos elementos de um array? É com isso que você vai fazer a média.
Dica: envolve uma variável onde você acumula a soma, e um “for”.
Uma vez fazendo essa soma você faz a divisão. É melhor somar primeiro, e depois fazer a divisão.
Não precisa sair dividindo por 2 logo de cara, como você tentou fazer.
Isso vai dar alguns resultados injustos (4 + 5 = 9, 9/2 dá 4, não 4.5, em Java, se estiver usando byte).
Deixe para dividir por 2 por último.

[quote=al.barbosa][quote]eu estava usando para outro lugar.
Mas o que é a minha duvida é a seguinte, eu insiro os valores das notas na classe Escola, e quero pegar os valores na classe Aluno fazendo a média das 10 notas dos 5 alunos… [/quote]

Você quer que a classe Aluno faça a média dos 5 alunos?
Pelo que eu entendi, a classe Aluno tem as informações de um aluno. A classe Escola é que conhece todos os alunos.
Não seria a classe Escola que deveria calcular a média de todos os alunos?[/quote]

A classe escola inicia todos os alunos na classe Aluno. Então, pensei em fazer isso dai também. Vou ver o que consigo gerar aqui. Vlw.

[quote=Scobar20]
Seguinte, quero fazer aki o calculo da media da sala: [code]
// Quero fazer aqui a media de todos os alunos
void mediaSala(){

}[/code]
Acho que tirando tudo que tinha ficará mais facil de explicar.Preciso armazenar os valores de um array, para com esses valores fazer a media da sala toda.
Ex: vou pegar a nota1 do primeiro aluno e somar com a nota2 do primeiro aluno, ai pego a nota1 do segundo aluno e coloco nesta mesma soma, faço o mesmo com a nota2 do segundo aluno.[/quote]

Então acho que o método mediaSala() deveria ficar na classe Escola, porque a classe Escola é quem conhece todos os alunos. A classe Aluno conhece apenas um aluno.

Bom, se não tiver aprendido BigDecimal concordo com o entanglement, é melhor usar double para as notas e a media. Só não dá para usar byte porque byte é inteiro, não vai ter as casas decimais. Pode causar problemas imprevistos se o arredondamento não for feito corretamente.

[quote=al.barbosa][quote=Scobar20]
Seguinte, quero fazer aki o calculo da media da sala: [code]
// Quero fazer aqui a media de todos os alunos
void mediaSala(){

}[/code]
Acho que tirando tudo que tinha ficará mais facil de explicar.Preciso armazenar os valores de um array, para com esses valores fazer a media da sala toda.
Ex: vou pegar a nota1 do primeiro aluno e somar com a nota2 do primeiro aluno, ai pego a nota1 do segundo aluno e coloco nesta mesma soma, faço o mesmo com a nota2 do segundo aluno.[/quote]

Então acho que o método mediaSala() deveria ficar na classe Escola, porque a classe Escola é quem conhece todos os alunos. A classe Aluno conhece apenas um aluno.

Bom, se não tiver aprendido BigDecimal concordo com o entanglement, é melhor usar double para as notas e a media. Só não dá para usar byte porque byte é inteiro, não vai ter as casas decimais. Pode causar problemas imprevistos se o arredondamento não for feito corretamente.
[/quote]

é sim, o byte estava la de entrometido. Já o tirei de la…vou fazer na classe Escola mesmo, acho que sairá mais facil la.

Só uma coisa, vc está se confundindo aí.
A classe Aluno não pode fazer a média de todos os alunos, pois ela É/REPRESENTA UM ALUNO e não todos os alunos da classe.

Todos os seus métodos da classe Aluno, que estão no plural, (exibirAlunos, aprovados, reprovados . . .) não estão semanticamente corretos, já que como disse, a classe representa apenas um aluno.
O mais correto seria deixar todos os métodos no singular (exibirAluno, aprovado, reprovado etc);

Portanto, para calcular a média vc precisa de um loop, como os que vc já está fazendo na classe Escola:

        for( Aluno alunoCorrente : alunos ){  
            /* Pega as notas 1 e 2 do aluno corrente 
              e as soma com a nota total */  
        }
        /* Divide a nota total pelo numero total de notas*/

E também não vejo pq usar Byte ao invés de double. :smiley: