elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Sistema de control vacacional en JAVA
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sistema de control vacacional en JAVA  (Leído 3,333 veces)
Erius

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Sistema de control vacacional en JAVA
« en: 23 Agosto 2018, 17:59 pm »

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
  1. package sistemadecontrolvacacional;
  2. import java.util.Scanner;
  3.  
  4. public class SistemaDeControlVacacional {
  5.  
  6.    public static void main(String[] args) {
  7.  
  8.        Scanner in = new Scanner (System.in);
  9.        int antiguedad, opcion;
  10.        String nombre = "";
  11.  
  12.        System.out.println("\tSistema de Control de vacaciones");
  13.  
  14.        System.out.println("1) Departamento de Contabilidad");
  15.        System.out.println("2) Departamento de Negocios");
  16.        System.out.println("3) Departamento de Administración");
  17.        System.out.println("Escoga una opcion: ");
  18.        opcion = in.nextInt();
  19.  
  20.        switch(opcion){
  21.            case 1:
  22.                System.out.println("Introduzca su nombre: ");
  23.                nombre = in.nextLine();
  24.  
  25.                System.out.println("¿Cuantos años de antiguedad tiene?");
  26.                antiguedad = in.nextInt();
  27.  
  28.                if(antiguedad <= 1){
  29.                    System.out.println(nombre + ", usted cuenta con 7 dias de vacaciones");
  30.                }
  31.                else{
  32.                    if(antiguedad > 1 && antiguedad <= 2){
  33.                        System.out.println(nombre + ", usted cuenta con 15 dias de vac
  34. aciones");                    }
  35.                    else{
  36.                        System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
  37.                    }
  38.                }
  39.                break;    
  40.            case 2:
  41.                System.out.println("Introduzca su nombre: ");
  42.                nombre = in.nextLine();
  43.  
  44.                System.out.println("¿Cuantos años de antiguedad tiene?");
  45.                antiguedad = in.nextInt();
  46.  
  47.                if(antiguedad <= 1){
  48.                    System.out.println(nombre + ", usted cuenta con 10 dias de vacaciones");
  49.                }
  50.                else{
  51.                    if(antiguedad > 1 && antiguedad <= 2){
  52.                        System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
  53.                    }
  54.                    else{
  55.                        System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
  56.                    }
  57.                }
  58.                break;
  59.            case 3:
  60.                System.out.println("Introduzca su nombre: ");
  61.                nombre = in.nextLine();
  62.  
  63.                System.out.println("¿Cuantos años de antiguedad tiene?");
  64.                antiguedad = in.nextInt();
  65.  
  66.                if(antiguedad <= 1){
  67.                    System.out.println(nombre + ", usted cuenta con 15 dias de vacaciones");
  68.                }
  69.                else{
  70.                    if(antiguedad > 1 && antiguedad <= 2){
  71.                        System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
  72.                    }
  73.                    else{
  74.                        System.out.println(nombre + ", usted cuenta con 30 dias de vacaciones");
  75.                    }
  76.                }
  77.                break;
  78.            default:
  79.                System.out.println("No se encuentra ningun departamento");
  80.                break;
  81.        }
  82.  
  83.    }
  84.  
  85. }


Mod: Obligatorio utilizar etiquetas GeSHi.


« Última modificación: 23 Agosto 2018, 18:48 pm por #!drvy » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Sistema de control vacacional en JAVA
« Respuesta #1 en: 24 Agosto 2018, 21:39 pm »

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
  1. 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
  1. opcion = in.nextInt();
añade esta línea a tu código...
Código
  1. 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
  1. System.out.println(nombre + salida);


« Última modificación: 24 Agosto 2018, 21:46 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Bluetooth Remote Control 2.0 - PC & Java
Hacking Mobile
Bender-Deicide 0 7,101 Último mensaje 20 Julio 2007, 22:22 pm
por Bender-Deicide
Sistema de Control (LTP)
Electrónica
marian0 0 2,699 Último mensaje 3 Agosto 2007, 01:22 am
por marian0
BD para sistema de control de personal
Bases de Datos
llAudioslavell 0 3,775 Último mensaje 5 Octubre 2011, 07:08 am
por llAudioslavell
java con placa de control.
Java
llellebtt 0 1,806 Último mensaje 11 Diciembre 2015, 10:50 am
por llellebtt
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines