Sistema de control vacacional en JAVA

Iniciado por Erius, 23 Agosto 2018, 17:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Erius

Muy buenas a todos, estoy empezando a programar en JAVA y para practicar estoy haciendo un pequeño sistema vacacional donde al usuario le estoy pidiendo que introduzca su nombre y aparte que introduzca sus años de antigüedad, PERO cuando quiere introducir el nombre, se pasa directo a los años de antigüedad así evitando que introduzca su nombre.

Alguien que me ayude en eso, porfa, tal vez estoy haciendo algo mal, este es el codigo:



Código (java) [Seleccionar]
package sistemadecontrolvacacional;
import java.util.Scanner;

public class SistemaDeControlVacacional {

   public static void main(String[] args) {
       
       Scanner in = new Scanner (System.in);
       int antiguedad, opcion;
       String nombre = "";
       
       System.out.println("\tSistema de Control de vacaciones");
       
       System.out.println("1) Departamento de Contabilidad");
       System.out.println("2) Departamento de Negocios");
       System.out.println("3) Departamento de Administración");
       System.out.println("Escoga una opcion: ");
       opcion = in.nextInt();
       
       switch(opcion){
           case 1:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 7 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 15 dias de vac
aciones");                    }
                   else{
                       System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
                   }
               }
               break;    
           case 2:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 10 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
                   }
                   else{
                       System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
                   }
               }
               break;
           case 3:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 15 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
                   }
                   else{
                       System.out.println(nombre + ", usted cuenta con 30 dias de vacaciones");
                   }
               }
               break;
           default:
               System.out.println("No se encuentra ningun departamento");
               break;
       }
       
   }
   
}




Mod: Obligatorio utilizar etiquetas GeSHi.

Serapis

#1
Hay varias cosas que decir...

0 - La primera: es que cuando usas un objeto, es importante que la instancia de ese objeto de alguna manera contenta una abreviatura de dicho objeto, para así reconocer de un simple vistazo una variable sin tener que revisar donde está declarada (se gana mucho tiempo con ello, especialmente cuando se lee código ajeno).

Entonces si el objeto es un Scanner, declara la instancia mejor así (o similar):
Código (java) [Seleccionar]
Scanner scanDatos = new Scanner (System.in);

1 - Tu problema: Es que no entiendes en su totalidad la clase Scanner. Te lo explico un poco por encima.
Cuando escribes un texto por teclado, imagina "Hola, me llamo Tutankamón y tengo 2500 años"
Scanner divide la entrada en tokens, cada token es separado por defecto por un espacio en blanco. Para tomar una línea completa se usa como bien pones nextLine, sin embargo previamente había ya un escaner en marcha para la petición del departamento, que era un valor numérico...
Tomaste el valor numérico... e... inevitablemente cada vez que el usuario pulsa intro, para enviar los datos, se añade a la entrada el salto de línea (\n), luego de tomar el nextInt, queda en el Scanner el "\n", que es lo que está recibiéndose como 'nombre'.
Es decir tras la petición del token nextInt, una petición por nextLine, devuelve lo que resta del token hasta final de la entrada, pero si resulta que ya no queda nada 'visible', lo que devuelve es justo el salto de línea "\n".

La solución pasa por tanto por liberar el estado del scanner (limpiar el buffer) cada vez que se pretende tomar como entrada un string... y previamente no era otro string, exige limpiarlo, y eso se hace justamente leyendo... es deicr la primera vez, lee el salto de línea "\n" que se transforma en un texto vacío, y ya la siguiente vez estando el buffer vacío, reclama la entrada...

Hubiera ido bien si la entrada previa hubiera sido algo como esto: "2500 años tengo y me llamo Tutankamón", ya que nextInt hubiera devuelto 2500, y nextLine el resto...

Luego detrás de esto:
Código (java) [Seleccionar]
opcion = in.nextInt();
añade esta línea a tu código...
Código (java) [Seleccionar]
nombre = in.nextLine(); // limpia el buffer para luego poder leer un string solicitando entrada por teclado.

2 - Por último: tu código se puede optimizar un poquito...
Si lo miras bien las 4 primeras líneas de cada caso, son idénticas luego puedes modificar el código para que aparezcan una única vez, y esto solo cuando los casos sean 1,2 ó 3.
Igualmente al final haces una salida, en los mismos tres casos, igualmente podrías alamcenar un texto como 'salida' y tras esos casos, hacer un único...
Código (java) [Seleccionar]
System.out.println(nombre + salida);