Erro em loop, soma com valor errado.

Java

26/01/2021

package vetores;

import java.util.Scanner;

public class Media_2_vetores
{
public static void main(String[] args)
{
String[] nome_aluno = new String[50];
double[] notas_aluno = new double[5];

int j;
String opcao;
//boolean opcao = true;
String resp = "n";
double media = 0,soma = 0, cont =0;

Scanner sc = new Scanner(System.in);

do
{

for(int i = 0;i < nome_aluno.length;i++)
{
System.out.println("Insira o nome do aluno: ");
//nome_aluno[i] = sc.nextLine();
for(j = 0; j<4 ;j++)
{

System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1));
nome_aluno[i] = sc.nextLine();
notas_aluno[j] = sc.nextDouble();
soma = soma + notas_aluno[j];
cont++;
}

media = (soma / 5);

String aproveitamento = "";
if (media >= 9 && media <= 10){
aproveitamento = "A";
} else if (media >= 7.5 && media < 9){
aproveitamento = "B";
} else if (media >= 6 && media < 7.5){
aproveitamento = "C";
} else if (media >= 4 && media < 6){
aproveitamento = "D";
} else if (media >= 0 && media < 4){
aproveitamento = "E";
}

System.out.println("Média: " + media);
System.out.println("Conceito: " + aproveitamento);

switch(aproveitamento)
{
case "A":
case "B":
case "C": System.out.println("APROVADO"); break;
case "D":
case "E": System.out.println("REPROVADO"); break;
}

//System.out.print("Deseja Continuar? <s/n>: ");
//opcao = sc.nextLine();
sc.nextLine();
}
System.out.print("Deseja Continuar? <s/n>: ");
//if (resp == false)
opcao = sc.nextLine();
} while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != ''n''); // só pára se for == ''n''
}
}
Prazer, fiz um debug, pois percebi que após a primeira iteração, o compilador não esta fazendo corretamente o cálculo da média. Ele soma, por exemplo, a partir da segunda iteração, se eu colocar 7 +8 +9 +8 = 32. Quando vi o resultado da variável soma, esta está com o valor de 142. Não sei se tem lixo na memória por causa da primeira iteração ou alguma outra coisa que ocasiona este erro. Obrigado.
Paulo

Paulo

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

26/01/2021

você precisa zerar a variável soma assim que é indicado um aluno.
package vetores;

import java.util.Scanner;

public class Media_2_vetores
{
	public static void main(String[] args)
	{
		String[] nome_aluno = new String[50];
		double[] notas_aluno = new double[5];
		int j;
		String opcao;
		//boolean opcao = true;
		String resp = "n";
		double media = 0, soma = 0, cont =0;

		Scanner sc = new Scanner(System.in);

		do
		{

			for(int i = 0;i < nome_aluno.length;i++)
			{
				System.out.println("Insira o nome do aluno: ");
				nome_aluno[i] = sc.nextLine();
				soma = 0; // reinicia o conteúdo de soma

				for(j = 0; j<4 ;j++)
				{
					System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1));
//					nome_aluno[i] = sc.nextLine();
					notas_aluno[j] = sc.nextDouble();
					soma = soma + notas_aluno[j];
					cont++;
				}

				media = (soma / 5);

				String aproveitamento = "";

				if (media >= 9 && media <= 10) {
					aproveitamento = "A";
				}
				else if (media >= 7.5 && media < 9) {
					aproveitamento = "B";
				}
				else if (media >= 6 && media < 7.5) {
					aproveitamento = "C";
				} else if (media >= 4 && media < 6) {
					aproveitamento = "D";
				} else if (media >= 0 && media < 4) {
					aproveitamento = "E";
				}

				System.out.println("Média: " + media);
				System.out.println("Conceito: " + aproveitamento);

				switch(aproveitamento)
				{
					case "A":
					case "B":
					case "C": System.out.println("APROVADO"); break;
					case "D":
					case "E": System.out.println("REPROVADO"); break;
				}

				//System.out.print("Deseja Continuar? <s/n>: ");
				//opcao = sc.nextLine();
				sc.nextLine();
			}

			System.out.print("Deseja Continuar? <s/n>: ");
			//if (resp == false)
			opcao = sc.nextLine();
		}
		
		while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != ''n''); // só pára se for == ''n''
	}
}



GOSTEI 0
Paulo

Paulo

26/01/2021

você precisa zerar a variável soma assim que é indicado um aluno.
package vetores;

import java.util.Scanner;

public class Media_2_vetores
{
	public static void main(String[] args)
	{
		String[] nome_aluno = new String[50];
		double[] notas_aluno = new double[5];
		int j;
		String opcao;
		//boolean opcao = true;
		String resp = "n";
		double media = 0, soma = 0, cont =0;

		Scanner sc = new Scanner(System.in);

		do
		{

			for(int i = 0;i < nome_aluno.length;i++)
			{
				System.out.println("Insira o nome do aluno: ");
				nome_aluno[i] = sc.nextLine();
				soma = 0; // reinicia o conteúdo de soma

				for(j = 0; j<4 ;j++)
				{
					System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1));
//					nome_aluno[i] = sc.nextLine();
					notas_aluno[j] = sc.nextDouble();
					soma = soma + notas_aluno[j];
					cont++;
				}

				media = (soma / 5);

				String aproveitamento = "";

				if (media >= 9 && media <= 10) {
					aproveitamento = "A";
				}
				else if (media >= 7.5 && media < 9) {
					aproveitamento = "B";
				}
				else if (media >= 6 && media < 7.5) {
					aproveitamento = "C";
				} else if (media >= 4 && media < 6) {
					aproveitamento = "D";
				} else if (media >= 0 && media < 4) {
					aproveitamento = "E";
				}

				System.out.println("Média: " + media);
				System.out.println("Conceito: " + aproveitamento);

				switch(aproveitamento)
				{
					case "A":
					case "B":
					case "C": System.out.println("APROVADO"); break;
					case "D":
					case "E": System.out.println("REPROVADO"); break;
				}

				//System.out.print("Deseja Continuar? <s/n>: ");
				//opcao = sc.nextLine();
				sc.nextLine();
			}

			System.out.print("Deseja Continuar? <s/n>: ");
			//if (resp == false)
			opcao = sc.nextLine();
		}
		
		while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != ''n''); // só pára se for == ''n''
	}
}




Valeu, obrigado. Agora fica resolvido e sei que tenho de zerar a variável dentro do loop para não trazer lixo. Lembrando que eu poderia ter dado um flush também. Lembrei disso, mas não sei se funciona.
GOSTEI 0
Paulo

Paulo

26/01/2021

você precisa zerar a variável soma assim que é indicado um aluno.
package vetores;

import java.util.Scanner;

public class Media_2_vetores
{
	public static void main(String[] args)
	{
		String[] nome_aluno = new String[50];
		double[] notas_aluno = new double[5];
		int j;
		String opcao;
		//boolean opcao = true;
		String resp = "n";
		double media = 0, soma = 0, cont =0;

		Scanner sc = new Scanner(System.in);

		do
		{

			for(int i = 0;i < nome_aluno.length;i++)
			{
				System.out.println("Insira o nome do aluno: ");
				nome_aluno[i] = sc.nextLine();
				soma = 0; // reinicia o conteúdo de soma

				for(j = 0; j<4 ;j++)
				{
					System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1));
//					nome_aluno[i] = sc.nextLine();
					notas_aluno[j] = sc.nextDouble();
					soma = soma + notas_aluno[j];
					cont++;
				}

				media = (soma / 5);

				String aproveitamento = "";

				if (media >= 9 && media <= 10) {
					aproveitamento = "A";
				}
				else if (media >= 7.5 && media < 9) {
					aproveitamento = "B";
				}
				else if (media >= 6 && media < 7.5) {
					aproveitamento = "C";
				} else if (media >= 4 && media < 6) {
					aproveitamento = "D";
				} else if (media >= 0 && media < 4) {
					aproveitamento = "E";
				}

				System.out.println("Média: " + media);
				System.out.println("Conceito: " + aproveitamento);

				switch(aproveitamento)
				{
					case "A":
					case "B":
					case "C": System.out.println("APROVADO"); break;
					case "D":
					case "E": System.out.println("REPROVADO"); break;
				}

				//System.out.print("Deseja Continuar? <s/n>: ");
				//opcao = sc.nextLine();
				sc.nextLine();
			}

			System.out.print("Deseja Continuar? <s/n>: ");
			//if (resp == false)
			opcao = sc.nextLine();
		}
		
		while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != ''''n''''); // só pára se for == ''''n''''
	}
}




Valeu, obrigado. Agora fica resolvido e sei que tenho de zerar a variável dentro do loop para não trazer lixo. Lembrando que eu poderia ter dado um flush também. Lembrei disso, mas não sei se funciona.
Só falta a saída do do-while, vou resolver e digo como ficou.
GOSTEI 0
POSTAR