Java - entrada de datos por teclado

 
Vista:

entrada de datos por teclado

Publicado por Ali (5 intervenciones) el 15/04/2020 09:04:31
Hola! Tengo un problema con mi código, ya que no me deja ingresar el nombre del producto, se sigue con el texto "ingrese monto del producto", podrían ayudarme?
Les dejo el código completo, y les subrayo el error, gracias!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class PMercado
{
   public static void main (String [] args) {
       Mercado mercado =new Mercado();
       Scanner cobro =new Scanner(System.in);
       long veces=1;
       int i=1, contador;
       String prod= "";
 
       System.out.println ("¿Cuántos productos va a ingresar?");
       contador = cobro.nextInt();
 
       while (veces<=contador) {
          System.out.println ("Ingresa nombre del producto");
          prod=cobro.nextLine();
 
          System.out.println ("Ingresa monto del producto no. "+veces+ ": ");
          mercado.calcularCompras (cobro.nextInt());
          veces=veces+1;
        }
 
 
        System.out.printf ("Su total a pagar es: " + mercado.getProducto());
     }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

entrada de datos por teclado

Publicado por Kabuto (1381 intervenciones) el 15/04/2020 11:25:32
Es un problema habitual.

Tras leer un valor numérico, como un int:

1
2
System.out.println ("¿Cuántos productos va a ingresar?");
contador = cobro.nextInt();

La clases Scanner coge el número, pero deja en memoria el carácter retorno de carro que se produce cuando hemos pulsado la tecla intro para introducir el número.

Esto provoca que si luego queremos un String con nextLine()
1
2
System.out.println ("Ingresa nombre del producto");
prod=cobro.nextLine();

Ese nextLine(), se encuentra en memoria el carácter retorno de carro que se quedó abandonado en la lectura anterior. Entonces piensa erróneamente que el usuario ya ha pulsado intro y da por finalizada la lectura de datos.
Por eso no puedes poner el nombre del producto.

Para evitarlo, tienes dos opciones:
Una es hacer una lectura extra con nextLine() después de leer el valor numérico. No hace falta recogerlo en ninguna variable
1
2
3
System.out.println ("¿Cuántos productos va a ingresar?");
contador = cobro.nextInt();
cobro.nextLine(); //Lectura extra con nextLine() para eliminar caracter retorno de carro de la memoria

La otra, quizás un poco más recomendable, es leer el dato numérico siempre con nextLine().
Esto te devolverá un String y no un valor numérico con el que poder operar matemáticamente, por lo tanto, tendremos que convertirlo al tipo de dato numérico que nos interese:
1
2
System.out.println ("¿Cuántos productos va a ingresar?");
contador = Integer.parseInt(cobro.nextLine()); //Leemos con nextLine() y parseamos el String a Integer

Parece un poco más complicado, pero en realidad es más cómodo.
Además, viene bien acostumbrase a eso porque más adelante, cuando hagas interfaces de pantalla con formularios de botones, ventanas, campos de texto, etc... los datos SIEMPRE los vas a recibir como String. Así que SIEMPRE habrá que parsearlos a Integer, Double, Float o lo que se necesite.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

entrada de datos por teclado

Publicado por ... (5 intervenciones) el 15/04/2020 20:04:32
No tengo ningún problema en eso. Pero quiero que el usuario ingrese el nombre del producto (String) y posteriormente el monto (int) y que eso se repita en el bucle.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

entrada de datos por teclado

Publicado por Kabuto (1381 intervenciones) el 15/04/2020 23:46:13
Lo explico de otra manera.

Este es tu código, y NO funciona lo de ingresar nombre de producto.
Atenta a lo marcado en negrita.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class PMercado
{
   public static void main (String [] args) {
       Mercado mercado =new Mercado();
       Scanner cobro =new Scanner(System.in);
       long veces=1;
       int i=1, contador;
       String prod= "";
 
       System.out.println ("¿Cuántos productos va a ingresar?");
       contador = cobro.nextInt();
 
       while (veces<=contador) {
          System.out.println ("Ingresa nombre del producto");
          prod=cobro.nextLine();
 
          System.out.println ("Ingresa monto del producto no. "+veces+ ": ");
          mercado.calcularCompras (cobro.nextInt());
          veces=veces+1;
        }
 
 
        System.out.printf ("Su total a pagar es: " + mercado.getProducto());
     }
}


Este es mi código, y SÍ funciona lo de ingresar nombre de producto.
Atenta a lo marcado en negrita:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class PMercado
{
   public static void main (String [] args) {
       Mercado mercado =new Mercado();
       Scanner cobro =new Scanner(System.in);
       long veces=1;
       int i=1, contador;
       String prod= "";
 
       System.out.println ("¿Cuántos productos va a ingresar?");
       contador = Integer.parseInt(cobro.nextLine());
 
       while (veces<=contador) {
          System.out.println ("Ingresa nombre del producto");
          prod=cobro.nextLine();
 
          System.out.println ("Ingresa monto del producto no. "+veces+ ": ");
          mercado.calcularCompras (Integer.parseInt(cobro.nextLine()));
          veces=veces+1;
        }
 
 
        System.out.printf ("Su total a pagar es: " + mercado.getProducto());
     }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar