A questão pede para criar um algoritmo que leia 05 nomes , 05 notas e exiba a media .
Criei uma variavel nome para classe String para armazenar os nomes na array bem como uma variavel tipo double para armazenar as notas chamadas notas, uma tipo double para armazenar a soma e outra tipo double para armazenar a media da turma.
Em seguida criei um laço usando a estrutura for para informar os nomes, notas e fazer a soma.
A variável media coloquei fora do laço que exibiria a media da turma .
O problema é que após o segundo looping o algoritmo apresenta um erro. Segue o código…
package listadexercicios;
import java.util.Scanner;
/*
Lê 5 nomes e notas de uma turma,
calcula e exibe a média das notas da turma
*/
public class Questao26 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] nomes = new String[5];
double[] notas = new double[5];
double media=0, soma = 0;
for (int c = 0; c < nomes.length; c++) {
System.out.println("Informe um nome:");
nomes[c] = input.nextLine();
System.out.println("Informe a nota:");
notas[c] = input.nextDouble();
soma = soma + notas[c];
}
media = soma / 5;
System.out.println("A media da turma é: " + media);
}
}
Informe um nome:
a
Informe a nota:
5
Informe um nome:
Informe a nota:
a
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
at listadexercicios.Questao26.main(Questao26.java:21)
Alguem poderia me ajudar?
1 curtida
O erro que está acontecendo é porque ao usar input.nextLine() o programa vai pedir nome e nota juntos e consequentemente você deveria colocar somente o valor da nota o nome neste caso fica armazenando uma String vazia. Como resolver? segue abaixo…
Crie uma variável do tipo String e outra do tipo double fora do loop para você usar como auxiliares.
no lugar de input.nextLine() use somente input.next() e as variáveis auxiliares que você criar
coloque-as para receber os valores que forem informados pelo usuário.
exemplo:
String aux;
double notaAtual;
for (int i = 0; i < nomes.length; i++) {
System.out.println("Informe um nome:");
aux = input.next();
nomes[i] = aux;
System.out.println("Informe uma nota:");
notaAtual = input.nextDouble();
notas[i] = notaAtual;
soma += notas[i];
}
media += soma/5;
System.out.print("A média da turma é: "+media);
Espero ter ajudado! Bom estudo.
1 curtida
@Raphael_Junior muito obrigado pela explicação , não sabia que ao usar o nextLine() o programa pediria nome e nota consequentemente , isso realmente aconteceu só não conseguia entender o porquê. Mais uma vez muito obrigado!!
1 curtida
Tem um problema em usar next()
. Por exemplo, se o nome tiver espaços, como “Fulano de Tal”, o next()
só irá ler “Fulano” e depois nextDouble()
vai tentar converter o “de” para número e vai dar erro, veja.
O problema do seu código foi misturar nextLine()
com nextDouble()
. O que acontece é que ao digitar ENTER, o buffer de entrada recebe um caractere de quebra de linha (o famoso \n
), e existem métodos do Scanner
que não consomem a quebra de linha (como é o caso do nextDouble()
). Já outros como nextLine()
consomem a quebra de linha.
Então o que acontece com o seu código é:
-
nextLine()
lê o nome e consome a quebra de linha
-
nextDouble()
lê a nota, mas não consome a quebra de linha
- na próxima iteração,
nextLine()
consome a quebra de linha que nextDouble
não leu (e como só tem a quebra de linha, o resultado é uma string vazia - com isso o nome ficará vazio)
Aqui uma explicação bem detalhada sobre esse tipo de problema (sugiro ler depois, com calma porque é um texto longo, mas que explica em detalhes porque isso acontece).
Enfim, no seu caso, você está lendo entradas do teclado e pedindo para digitar um dado de cada vez. Sendo assim, o melhor é sempre consumir a linha toda (inclusive a quebra de linha). E como nextDouble()
não consome a quebra de linha, é melhor trocar tudo para nextLine()
, e aí você converte a string para número. Assim:
for (int c = 0; c < nomes.length; c++) {
System.out.println("Informe um nome:");
nomes[c] = input.nextLine();
System.out.println("Informe a nota:");
// AQUI: nextLine consome a linha toda, e depois vc converte a string para double
notas[c] = Double.parseDouble(input.nextLine());
soma = soma + notas[c];
}
Dessa forma, você elimina o problema que ocorre se usar next()
(agora os nomes podem ter espaços sem problemas, veja).
1 curtida
@hugokotsubo muito obrigado por esta explicação !!