Foros del Web » Programación para mayores de 30 ;) » Java »

Ciclo do while se brinca

Estas en el tema de Ciclo do while se brinca en el foro de Java en Foros del Web. Hola a todos en este foro, apenas ando aprendiendo java, estoy utilizando el eclipse como entorno de programación, sin embargo, no me explico por qué ...
  #1 (permalink)  
Antiguo 11/09/2015, 19:30
Avatar de AlfaCenturio  
Fecha de Ingreso: abril-2005
Ubicación: México
Mensajes: 286
Antigüedad: 19 años
Puntos: 0
Ciclo do while se brinca

Hola a todos en este foro, apenas ando aprendiendo java, estoy utilizando el eclipse como entorno de programación, sin embargo, no me explico por qué se brinca la primera pregunta
he aquí el codigo:
Cita:
package nominaBasica;

import java.util.Scanner;

public class Nomina {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);


String nombre;
int pagohora;
int horasmes;
int pagomensual;
int salmensarea_a;
int salmensarea_b;
char areageografica;
char resp;

do{
System.out.println("Escriba el nombre del empleado: ");
nombre = sc.nextLine();
System.out.println("¿A cuanto asciende tu ingreso por hora?: ");
pagohora = sc.nextInt();
System.out.println("¿Cuantas horas trabajas tu al mes?: ");
horasmes = sc.nextInt();
System.out.println("¿A que area geografica perteneces A o B?: ");
areageografica = sc.next().charAt(0);


pagomensual = pagohora * horasmes;

if (areageografica == 'A' || areageografica == 'a'){
salmensarea_a = 2103;
System.out.println("El salario mensual del area geografica A es: "+ salmensarea_a);
if (pagomensual>salmensarea_a){
System.out.println("El nombre del empleado es: "+ nombre);
System.out.println("El salario minimo mensual del empleado del area A es: "+ pagomensual);
}else{
System.out.println("El nombre del empleado es: "+ nombre);
}
}else if (areageografica == 'B' || areageografica == 'b'){
salmensarea_b = 2048;
System.out.println("El salario mensual del area geografica B es: "+ salmensarea_b);
if (pagomensual>salmensarea_b){
System.out.println("El nombre del empleado es: "+ nombre);
System.out.println("El salario minimo mensual del empleado del area B es: "+ pagomensual);
}else{
System.out.println("El nombre del empleado es: "+ nombre);
}
}

System.out.println("¿Desea verificar el salario de otro empleado?(S/N)");
resp = sc.next().charAt(0);
//System.out.println(resp);
}while(resp != 'n' && resp != 'N');

}

}
La primera vez lo ejecuto no hay ningún problema pero cuando le digo que
si quiero verificar otro salario se brinca la primera pregunta cuando
le intente con sc.next() no se brinca la pregunta pero da error al poner el texto
con espacios, quisiera saber por qué pasa eso. He aquí el resultado:

Escriba el nombre del empleado:
Manuel Murillo Castrejon
¿A cuanto asciende tu ingreso por hora?:
25
¿Cuantas horas trabajas tu al mes?:
150
¿A que area geografica perteneces A o B?:
a
El salario mensual del area geografica A es: 2103
El nombre del empleado es: Manuel Murillo Castrejon
El salario minimo mensual del empleado del area A es: 3750
¿Desea verificar el salario de otro empleado?(S/N)
s
Escriba el nombre del empleado:
¿A cuanto asciende tu ingreso por hora?:
__________________
"Todo lo que una persona pueda imaginar, otro podrá hacerlo realidad." Julio Verne
"No hay un solo tema científico, que no pueda ser explicado a nivel popular." Carl Sagan
  #2 (permalink)  
Antiguo 11/09/2015, 22:54
Avatar de freddy31DA  
Fecha de Ingreso: junio-2012
Mensajes: 84
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Ciclo do while se brinca

No estas validando todavía nada.
Bueno al inicio si yo oprimo enter al pedirme el nombre pasa... Cuando llego a si quiero verificar otro tambien se pasa.
Esto ocurre debido a un mal tratamiento del buffer. Al inicio al registrar el nombre automáticamente luego del enter se lanza un carácter ‘\n’ o ‘enter’ en el buffer, por lo tanto, cuando se quiere leer una cadena con el método ‘nextLine()’, esta función inicia la lectura del buffer ¡y lo primero que se encuentra es justamente el carácter de final de cadena! ( ‘\n’ ),

Al inicio esta solución te pedira el nombre luego tienes presionar enter pero luego del S/N ya no:
Código Java:
Ver original
  1. System.out.println("Escriba el nombre del empleado: ");
  2. nombre = sc.nextLine();
  3. sc.nextLine(); //Agregad esto

Por eso tienes que validar cada entrada...
__________________
Creo en Internet.
Amén.
  #3 (permalink)  
Antiguo 12/09/2015, 04:00
 
Fecha de Ingreso: septiembre-2008
Mensajes: 38
Antigüedad: 15 años, 7 meses
Puntos: 2
Obtén la respuesta antes del Do... para que la puedas comparar... Y en el while en vez de && ... Cámbialo por ||
  #4 (permalink)  
Antiguo 12/09/2015, 17:36
Avatar de AlfaCenturio  
Fecha de Ingreso: abril-2005
Ubicación: México
Mensajes: 286
Antigüedad: 19 años
Puntos: 0
De acuerdo Respuesta: Ciclo do while se brinca

Cita:
Iniciado por freddy31DA Ver Mensaje
No estas validando todavía nada.
Bueno al inicio si yo oprimo enter al pedirme el nombre pasa... Cuando llego a si quiero verificar otro tambien se pasa.
Esto ocurre debido a un mal tratamiento del buffer. Al inicio al registrar el nombre automáticamente luego del enter se lanza un carácter ‘\n’ o ‘enter’ en el buffer, por lo tanto, cuando se quiere leer una cadena con el método ‘nextLine()’, esta función inicia la lectura del buffer ¡y lo primero que se encuentra es justamente el carácter de final de cadena! ( ‘\n’ ),

Al inicio esta solución te pedira el nombre luego tienes presionar enter pero luego del S/N ya no:
Código Java:
Ver original
  1. System.out.println("Escriba el nombre del empleado: ");
  2. nombre = sc.nextLine();
  3. sc.nextLine(); //Agregad esto

Por eso tienes que validar cada entrada...
Muchas gracias ya no se está brincando la primera al reiniciar el ciclo do while. ¿Es siempre necesario validar el .nextLine()?, te lo comento porque haciendo pruebas con .next() y .nextInt() no me ocurrió eso. Saludos.
__________________
"Todo lo que una persona pueda imaginar, otro podrá hacerlo realidad." Julio Verne
"No hay un solo tema científico, que no pueda ser explicado a nivel popular." Carl Sagan
  #5 (permalink)  
Antiguo 12/09/2015, 21:26
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Ciclo do while se brinca

Es un error de la clase Scanner de como trata el buffer.
Yo te recomiendo que esa línea que has puesto extra después de pedir el nombre la quites de ahi y la pongas la última de tu bucle do.
La diferencia entre next y nextLine es que next coge la 1º palabra y nextline la linea.

Etiquetas: programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:54.