Autor Tema: Java problema Scanner# almacena cadena vacía no funciona correctamente CU00903C  (Leído 3853 veces)

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
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.
Código: [Seleccionar]
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+").");
        }
    }
}

Código: [Seleccionar]
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.
Código: [Seleccionar]
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.
« Última modificación: 08 de Agosto 2020, 19:09 por Ogramar »

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Duda sobre Scanner en el ejercicio 2 de la entrega CU00903C Java avanzado I
« Respuesta #1 en: 07 de Diciembre 2016, 19:24 »
Hola Erik.

el problema viene en esta linea:

Código: [Seleccionar]
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 :

Código: [Seleccionar]
entrada.nextLine();
o por lo menos antes de llegar a :

Código: [Seleccionar]
respuesta= entrada.nextLine();
Saludos  ;D
« Última modificación: 07 de Diciembre 2016, 19:26 por pedro,, »

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Re:Duda sobre Scanner en el ejercicio 2 de la entrega CU00903C Java avanzado I
« Respuesta #2 en: 08 de Diciembre 2016, 20:36 »
¡Muchas gracias, Pedro! No tenía ni idea. Ya funciona bien sin necesidad de crear un nuevo Scanner.

Saludos : )

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Duda sobre Scanner en el ejercicio 2 de la entrega CU00903C Java avanzado I
« Respuesta #3 en: 08 de Diciembre 2016, 21:07 »
Otra cosa que podrías hacer también es no usar nextDouble() y resolverlo así:

Código: [Seleccionar]
double respuestaNota = Double.parseDouble(entrada.nextLine());
Recojes un string y lo conviertes en double.

Saludos. ;D

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Re:Duda sobre Scanner en el ejercicio 2 de la entrega CU00903C Java avanzado I
« Respuesta #4 en: 09 de Diciembre 2016, 13:23 »
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! : )

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".