Problemas com Médias aritméticas em Arrays Unidimensionais

Bom dia pessoal,

Sou novo aqui no fórum, entretanto, já o havia acessado algumas vezes para ver tópicos de meu interesse, e parece-me que aqui é um ótimo ambiente para trocar ideias e, acima de tudo, aprender.

Bom, partindo para a problemática, eu estou tentando resolver um exercício, o qual possui o enunciado:

Crie uma classe MediaAluno que contenha um atributo do tipo vetor de inteiros com o nome de notas. Essa classe deve ter um método para adicionar as notas nesse vetor (os valores que podem ser adicionados no vetor são os inteiros entre 0 e 100, caso contrário imprime uma mensagem de erro e não adiciona) e outro método que calcule a média de um aluno e imprima essa média.

Eu já consegui fazer o programa em questão, porém, estou tendo problemas com a segunda proposta do exercício, a qual é a média aritmética das notas, eu já estou conseguindo extraí-la e o programa funciona 100%, a real questão está quando a condição da nota ser maior que 0 e menor que 11 não for satisfeita, pois mesmo com o laço sendo desfeito devido à “invalidez”, o programa segue, logicamente, para as linhas as quais fazem a média.

Qual método eu posso utilizar para que isso seja resolvido?

Segue o código:

public class Exercicio6 {

	public static void main(String[] args) {
		
		Scanner entradaDados = new Scanner(System.in);
		int[] vetorNotas = new int[3];
		double media, soma;
		
		
		for(int i = 0; i<3; i++) {
		
			System.out.println("Entre com a nota do aluno: ");
			vetorNotas[i] = entradaDados.nextInt();
			if(vetorNotas[i]<0 || vetorNotas[i]>10) {
				System.out.println("O valor atribuído à nota não é válido.");
				break;
			}
		}
		
		
		soma = vetorNotas[0] + vetorNotas[1] + vetorNotas[2];
		media = soma / 3;

		System.out.printf("A média do aluno é %.2f\n" ,media);
	
		
		
		
	}

}

Espero ter sido claro, desde já agradeço.
Att,
K. Schaeffer.

O seu break encerra o laço de leitura das notas, mas o valor é mantido na posição do vetor, pois você nem o pede novamente, nem o substitui. Além disso, se o usuário digitar 11 por exemplo na primeira leitura, terá apenas uma nota pra calcular

Ao invés de tentar fazer 2 laços for, faça um while para garantir que a nota está na faixa requerida. Ex:

for(int i = 0; i<3; i++){
vetorNotas[i] = -1;// esse valor só serve pra garantir que entra no while abaixo, não é necessário se usar um do...while por exemplo
while (vetorNotas[i]<0 || vetorNotas[i]>10) do{
  System.out.println("Entre com a nota do aluno: ");
  vetorNotas[i] = entradaDados.nextInt();
  if(vetorNotas[i]<0 || vetorNotas[i]>10) {
    System.out.println("O valor atribuído à nota não é válido.");
  }
}

Abraço.

1 curtida

Outro exemplo, segregado em métodos menores:

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

public class Exemplo {

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

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

    public void executar() {
        int[] notas = new int[3];
        for (int i = 0; i < notas.length; i++) {
            notas[i] = lerNota();
        }
        double media = calcularMedia(notas);
        saida.printf("A média do aluno é %.2f%n", media);
    }

    private double calcularMedia(int[] notas) {
        int soma = 0;
        for (int nota : notas) {
            soma += nota;
        }
        return soma / (double) notas.length;
    }

    private int lerNota() {
        while (true) {
            saida.println("Entre com a nota do aluno: ");
            int nota = Integer.parseInt(entrada.nextLine());
            if (nota < 0 || nota > 10) {
                saida.println("O valor atribuído à nota não é válido.");
                continue;
            }
            return nota;
        }
    }
}
1 curtida

Muito obrigado pela ajuda senhores, @TerraSkilll, gostei muito do seu exemplo, implementei no meu programa e o estudei, está funcionando corretamente, muito obrigado.

@staroski, Seu exemplo é também sensacional, eu vou usá-lo para estudar, já que nele existem coisas que eu ainda não aprendi, então eu preciso entendê-lo ainda, muito obrigado por compartilha-lo.

Agradeço novamente pela ajuda.
Att,
K. Schaeffer.

1 curtida