Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Erik_Escriche en 07 de Diciembre 2016, 17:09
-
Buenos días.
Haciendo el segundo ejercicio de la entrega CU00903C del curso de programación java nivel avanzado, me ha surgido una duda relacionada con el Scanner.
Esta fue mi primera versión del ejercicio. Al ejecutar el programa, la consola no me permitía introducir el nombre del segundo alumno y almacenaba una cadena vacía.
package javaAvanzado;
import java.util.Scanner;
public class NotasAlumnos {
public static void main (String [] args) {
String [] alumno = new String [2];
String [] notaTexto = {"Suspenso", "Bien", "Notable", "Sobresaliente"};
double [] nota = new double [2];
String calificacion;
//Primer alumno.
System.out.println ("Introduce el nombre del primer alumno.");
Scanner entrada = new Scanner (System.in);
String respuesta = entrada.nextLine();
alumno[0]=respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
double respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + "no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[0]=respuestaNota;
//Segundo alumno.
System.out.println ("Introduce el nombre del segundo alumno.");
respuesta= entrada.nextLine();
alumno[1] = respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + " no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[1] = respuestaNota;
//Calificaciones.
System.out.println ("Calificaciones:");
for (int i=0; i<=1; i++) {
if (nota[i]<5) {calificacion=notaTexto[0];}
else if (nota[i]>=5 && nota[i]<7) {calificacion = notaTexto[1];}
else if (nota[i]>=7&& nota[i]<9) {calificacion = notaTexto[2];}
else {calificacion=notaTexto[3];}
System.out.println (alumno[i]+" : "+nota[i]+ " ("+calificacion+").");
}
}
}
Introduce el nombre del primer alumno.
Mario
Introduce la nota de Mario.
9,99
Introduce el nombre del segundo alumno.
Introduce la nota de .
7
Calificaciones:
Mario : 9.99 (Sobresaliente).
: 7.0 (Notable).
Al introducir un segundo Scanner para el segundo alumno, el problema se solucionó, pero no entiendo el porqué. En otras partes del programa he podido reutilizar la variable "entrada" para recoger la nota escribiendo entrada.nextDouble(), sin necesidad de crear un nuevo objeto Scanner.
Esta es la versión que funciona.
package javaAvanzado;
import java.util.Scanner;
public class NotasAlumnos {
public static void main (String [] args) {
String [] alumno = new String [2];
String [] notaTexto = {"Suspenso", "Bien", "Notable", "Sobresaliente"};
double [] nota = new double [2];
String calificacion;
//Primer alumno.
System.out.println ("Introduce el nombre del primer alumno.");
Scanner entrada = new Scanner (System.in);
String respuesta = entrada.nextLine();
alumno[0]=respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
double respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + "no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[0]=respuestaNota;
//Segundo alumno.
System.out.println ("Introduce el nombre del segundo alumno.");
Scanner entrada2 = new Scanner (System.in);
respuesta= entrada2.nextLine();
alumno[1] = respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + " no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[1] = respuestaNota;
//Calificaciones.
System.out.println ("Calificaciones:");
for (int i=0; i<=1; i++) {
if (nota[i]<5) {calificacion=notaTexto[0];}
else if (nota[i]>=5 && nota[i]<7) {calificacion = notaTexto[1];}
else if (nota[i]>=7&& nota[i]<9) {calificacion = notaTexto[2];}
else {calificacion=notaTexto[3];}
System.out.println (alumno[i]+" : "+nota[i]+ " ("+calificacion+").");
}
}
}
Gracias de antemano por vuestras respuestas.
-
Hola Erik.
el problema viene en esta linea:
double respuestaNota = entrada.nextDouble();
que solo recoge la parte numérica introducida y no el salto de línea.
Después de usar nextDouble añade una línea come esta para poder vaciar el buffer :
entrada.nextLine();
o por lo menos antes de llegar a :
respuesta= entrada.nextLine();
Saludos ;D
-
¡Muchas gracias, Pedro! No tenía ni idea. Ya funciona bien sin necesidad de crear un nuevo Scanner.
Saludos : )
-
Otra cosa que podrías hacer también es no usar nextDouble() y resolverlo así:
double respuestaNota = Double.parseDouble(entrada.nextLine());
Recojes un string y lo conviertes en double.
Saludos. ;D
-
Muchas gracias de nuevo, Pedro. He usado esta última opción que me has dicho en otro ejercicio y me ha venido muy bien.
¡Un saludo! : )