Java - Ayuda con codigo while

 
Vista:

Ayuda con codigo while

Publicado por juan (3 intervenciones) el 18/12/2018 01:02:28
Hola queria saber si me podian ayudar ya que estoy haciendo un sistema de control vacacional y al repetir el programa no puedo ingresar la variable Nombre.

aca les dejo el codigo:


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package systema;
 
import  java.util.Scanner;
 
public class Systema {
 
 
    public static void main(String[] args) {
 
        Scanner in = new Scanner(System.in);
 
        String nombre = "" ;
        int clave = 0 ;
        int años = 0 ;
        boolean dato  = true ;
        int dato2 = 0 ;
 
        while(dato == true){
              System.out.println("BIENVENIDO");
 
              System.out.println("¿Cual es su nombre?");
              nombre = in.nextLine();
 
              System.out.println("¿Cual es su clave?");
              clave = in.nextInt();
 
              System.out.println("¿Hace cuantos años trabaja aqui?");
              años = in.nextInt();
 
              switch(clave){
 
                  case 1:
                      if(años == 1){
 
                           System.out.println("Hola " + nombre + " usted pertenece a Atencion al cliente\n Tiene derecho a 6 dias de vacaciones");
 
                      }
                      else if (años >= 2 && años <= 6 ){
 
                           System.out.println("Hola " + nombre + " usted pertenece a Atencion al cliente\n Tiene derecho a 14 dias de vacaciones");
 
                      }else if (años >= 7){
 
                            System.out.println("Hola " + nombre + " usted pertenece a Atencion al cliente\n Tiene derecho a 20 dias de vacaciones");
 
                      }else {
 
                            System.out.println("El valor digitado no es un numero");
 
                      }
                      break;
 
                  case 2:
                       if(años == 1){
 
                           System.out.println("Hola " + nombre + " usted pertenece a Logistica\n Tiene derecho a 7 dias de vacaciones");
 
                      }
                      else if (años >= 2 && años <= 6 ){
 
                          System.out.println("Hola " + nombre + " usted pertenece a Logistica\n Tiene derecho a 15 dias de vacaciones");
 
                      }else if (años >= 7){
 
                          System.out.println("Hola " + nombre + " usted pertenece a Logistica\n Tiene derecho a 22 dias de vacaciones");
 
                      }else {
 
                          System.out.println("El valor digitado no es un numero");
 
                      }
 
                      break;
 
                  case 3:
                      if(años == 1){
 
                          System.out.println("Hola " + nombre + " usted pertenece a Gerencia\n Tiene derecho a 10 dias de vacaciones");
 
                      }
                      else if (años >= 2 && años <= 6 ){
 
                          System.out.println("Hola " + nombre + " usted pertenece a Gerencia\n Tiene derecho a 20 dias de vacaciones");
 
                      }else if (años >= 7){
 
                        System.out.println("Hola " + nombre + " usted pertenece a Gerencia\n Tiene derecho a 30 dias de vacaciones");
 
                      }else {
 
                         System.out.println("El valor digitado no es un numero");
 
                      }
 
                      break;
 
                  default:
 
                    System.out.println("El valor ingresado no existe");
 
              }
              System.out.println("\n¿Quiere hacer otra busqueda?\n -presione 1- \n -2 para cerrar programa-");
              dato2  = in.nextInt();
 
              if(dato2 == 1){
 
                   dato = true;
              }
        }
 
    }
}



gracias por su atencion.
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

Ayuda con codigo while

Publicado por Kabuto (1385 intervenciones) el 18/12/2018 01:24:41
Hola.
En Java, SIEMPRE hay problemas cuando en un mismo programa queremos leer datos String (in.nextLine()) y datos numéricos (in.nextInt())

Después de leer datos numéricos, con toda seguridad no podremos leer el próximo String que queramos leer.

Esto se debe (lo explico rápido y mal para no extenderme) a que nextInt(), al leer del teclado, se queda con la parte numérica introducida pero deja en el buffer de memoria el caracter que corresponde a la pulsación de la tecla intro/enter por parte del usuario.

Entonces, la próxima vez que queramos leer un String, nextLine() se encuentra con este caracter "olvidado" en memoria y se piensa que es que el usuario acaba de pulsar ahora la tecla intro/enter y da por finalizada la inserción de datos para el String actual, cuando en realidad el usuario no ha tenido ocasión de teclear nada.

Hay dos formas de solucionarlo.

Una es poner un nextLine() extra cada vez que hayamos terminado de leer numeros.
Algo como:
1
2
3
System.out.println("Dame un numero:");
int numero = in.nextInt();
in.nextLine() //Este nextline() no recoge ningún dato, tan solo "limpia" el buffer de los caracteres que nextInt() ha omitido

La segunda forma, es mucho más recomendable, aunque quizás un poco más incómoda.
Y consiste en utilizar SIEMPRE un nextLine() para leer el dato, y si es numérico lo que necesitamos, lo parseamos inmediatamente.
Ejemplo:
1
2
System.out.println("Dame un numero:");
int numero = Integer.ParseInt(in.nextLine()); //Leemos como String, pero lo parseamos a int al instante

¿Por qué esta forma es mucho más recomendable?


- Porque es más legible y menos confuso que andar poniendo nextLine() "huerfanos" por el código tras leer numeros.

- Porque más adelante, cuando empieces a crear ventanas, botones, formularios, etc... en Java con librerías Swing, en dichas ventanas los datos siempre los vamos a recibir como tipo String, y siempre vamos a tener que hacer estos parseos a datos numéricos.
Así que mejor ir cogiendo ya la costumbre.

- Porque este es la forma habitual de hacerlo en otros lenguajes como C#, lenguaje muy, muy.. similar a Java, que además cada día está cogiendo mucha más fuerza y tarde o temprano querrás/necesitarás aprenderlo también.
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

gracias

Publicado por juan (3 intervenciones) el 18/12/2018 03:22:28
gracias me funciono utiize la primer manera porque la segunda me lanzaba error, voy a seguir intentando para ver si puedo con el parse
saludos.
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