Como pedir mas de un dato con ciclo while o do while

Pues tengo un problema con un código en java respecto al tema de los bucles en una aplicación para llevar el control de un estacionamiento

Quiero pedir el nombre del usuario y a partir de ahí pedir el nnumero de horas

Les dejo el código para que me entiendan mejor

import java.util.Scanner;
public class prueba{
    public static void main(String[]args){
        int cont = 0;
        String nombre;
        double horas;
        Scanner sc = new Scanner(System.in);
            do{                
                System.out.println("Escriba el Nombre: ");
                nombre = sc.nextLine();
                    if(!nombre.equalsIgnoreCase("fin")){
                        System.out.println("Horas");
                        horas = sc.nextDouble();
                        cont++;
                        System.out.print(nombre + "-----" + horas + "-----" + cont);
                    }                
            }while(!nombre.equalsIgnoreCase("fin"));
        }
}

El problema que tengo es que cuando hace la segunda iteración el programa no solicita el nombre nuevamente si no que directamente pide las horas del segundo usuario

Cuando lo compilo me muestra esto en pantalla:

Nombre:

Alex

Horas: 3

Alex---- 3Escriba el Nombre <---- ese nombre deberia ser la solicitud del nombre de la segunta iteracion pèro solo imprime la solicitud y no me deja escribir y pasa directamente a pedir las horas dejando el nombre vacio y asi un ciclo infinito

Espero me puedan ayudar ya que soy nuevo en este tema

1 Respuesta

Respuesta
1

Espero que te ayude pero de todas maneras te explico, al momento de convertir la variable Scanner sc a Double, el compilador detecta que ya no es necesario tomar strings que omite el ingreso de cadenas de texto para nombre y se salta esto, por lo cual y la única solución es, para "horas" asignar el valor "sc.nextLine()" a un "Double.parseDouble" y así te permite digitar el nombre primero y después las horas (Revisado y validado por mi).

Te dejo el código:

import java.util.Scanner;
public class CP {
    public static void main(String[] args) {
        int cont = 0;
        String nombre;
        double horas;
        Scanner sc = new Scanner(System.in); 
        do{              
            System.out.println("Escriba el Nombre: ");
            nombre = sc.nextLine();
            if(!nombre.equalsIgnoreCase("fin")){
                System.out.println("Horas");
                horas = Double.parseDouble(sc.nextLine());
                cont++;
                System.out.print(nombre + "-----" + horas + "-----" + cont + "\n");
            }
        }while(!nombre.equalsIgnoreCase("fin"));
    }
}

PD: Agregue el carácter de salto de línea "\n" al final de tu impresión para que no se combine este con nuevamente el texto de ingresar nombre!

PD2: Si hay otra explicación por parte de otros desarrolladores, estaría bien servida ya que esta es mi explicación a este problema.

Otra posible explicación, es debido a que el método nextDouble() no posee un salto de línea predeterminado por lo cual, al dar enter después de ingresar la hora, ese salto de línea lo incluye en el nextLine() de nombre y se salta ese fragmento del código, lo que hay que hacer es después de la línea de horas, agregar esta simple línea de código "sc.nextLine();" para que ese enter que dimos en horas sea tomado por esta línea de código y así detenerse para el ingreso de "nombre".

Te dejo el código:

import java.util.Scanner;
public class CP {
    public static void main(String[] args) {
        int cont = 0;
        String nombre;
        double horas;
        Scanner sc = new Scanner(System.in); 
        do{
            System.out.println("Escriba el Nombre: ");
            nombre = sc.nextLine();
            if(!nombre.equalsIgnoreCase("fin")){
                System.out.println("Horas");
                horas = sc.nextDouble();
                sc.nextLine();
                cont++;
                System.out.print(nombre + "-----" + horas + "-----" + cont + "\n");
            }
        }while(!nombre.equalsIgnoreCase("fin"));
    }
}

Otra cosa, después del While, te recomiendo dejar una línea de cierre par el sc para que deje de admitir ingreso de caracteres, esta línea es "sc.close();".

PD: Te recomiendo investigar más antes de iniciar una pregunta sobre programación ya que como es bien sabido, hay más información en ingles que en español y es verídico que lo consultes por aquí primero, algo que puedes hacer es consultar tus preguntas en ingles por google, hay una muy buena página llamada stackoverflow que es exclusivamente para desarrolladores y apoyo entre la comunidad, en este caso, yo me guíe por un post al googlear "nextline not working", pero aquí te dejo mis interpretaciones y a su vez, la página en la que me guíe en esta última respuesta: https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo;

¡Gracias! Bueno resulta que encontré la respuesta y ya lo resolví pero había quedado con la duda de porque pasaba eso y ya me lo has aclarado muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas