Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Baal_30 en 1 Marzo 2015, 19:49 pm



Título: Insertar letra en Scanner.nextInt
Publicado por: Baal_30 en 1 Marzo 2015, 19:49 pm
Buenas. Haciendo un ejercico usando el manejo de excepciones, más concretamente cuando se mete una letra en un Scanner .nextInt, he conseguido que si pones una letra entre al catch y te vuelva a pedir un número, el problema es cuando introduces más de 1 letra seguida (osea, introducir una letra, darle a enter, y cuando a entrado en el catch, introducir de nuevo otra letra...), ¿Como se debería hacer para que siguiera pidiendo números hasta que introduzcas 10 (por ejemplo) sin que cuente las letras y no de error si se introducen más de una seguidas?

Aquí está el código que tengo hecho:

Código
  1. package Actividades_UD9;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class Actividad2 {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. double num, aux=0.0;
  10. int cont=0;
  11. Scanner S = new Scanner(System.in);
  12.  
  13.  
  14. for(int i = 0; i<10; i++){
  15. try{
  16. System.out.print("Introduce un número: ");
  17. num = S.nextDouble();
  18. if(num>aux){
  19. aux = num;
  20. }
  21. }catch(java.util.InputMismatchException e){
  22. String prueba = S.nextLine();
  23. System.out.println("Has introducido un valor incorrecto.");
  24. System.out.print("Introduce un número: ");
  25. num = S.nextDouble();
  26. if(num>aux){
  27. aux = num;
  28. }
  29. cont++;
  30. }
  31. }
  32.  
  33. System.out.println("Se ha producido "+cont+" veces la excepción");
  34. System.out.println("El número más alto ha sido : "+aux);
  35.  
  36.  
  37. }
  38.  
  39. }
  40.  

Nota: El código es de un programa que saca el número mayor de los introducidos, y cuenta las veces que se ha dado la excepción (o que se ha introducido una letra)... Si se introduce una letra y salta el catch, y se introduce un número, funciona bien y luego si se puede introducir una letra que se comportará como toca, el problema es cuando se introduce más de una letra seguida.

Gracias de antemano y un saludo ¡! :)


Título: Re: Insertar letra en Scanner.nextInt
Publicado por: Usuario Invitado en 1 Marzo 2015, 22:56 pm
Crea una clase y un método que pida los números y si se ingresa una letra que se vuelva a llamar él mismo. Esto se llama recursividad.

HighestNumberFinder:

Código
  1. import java.util.Scanner;
  2. import java.util.InputMismatchException;
  3.  
  4. public class HighestNumberFinder {
  5.  private static byte exceptionCounter = 0;
  6.  
  7.  public Double askForNumber() {
  8.    final Scanner READER = new Scanner(System.in);
  9.    Double number = null;
  10.    try {
  11.      number = READER.nextDouble();
  12.  
  13.    } catch(InputMismatchException ex) {
  14.      System.out.println("Ha introducido una letra. Ingrese un número");
  15.      exceptionCounter++;
  16.      number = askForNumber();
  17.    }
  18.    return number;
  19.  }
  20.  
  21.  public byte getExceptionCounter() { return exceptionCounter; }
  22.  
  23. }

Main:

Código
  1. public class Main {
  2.  public static void main(String[] args) {
  3.    double highestNumber = 0d;
  4.    final HighestNumberFinder highestNumberFinder = new HighestNumberFinder();
  5.    Double number;
  6.    do {
  7.      System.out.println("Introduce un número: ");
  8.      number = highestNumberFinder.askForNumber();
  9.      highestNumber = number > highestNumber ? number : highestNumber;
  10.    } while(number != -1);
  11.    System.out.println("Usted ha introducido "+highestNumberFinder.getExceptionCounter()+" veces letras");
  12.    System.out.println("El número más alto fue: "+highestNumber);
  13.  }
  14.  
  15. }

Resultado de ejecución:

Código:
Introduce un número: 
45
Introduce un número:
78
Introduce un número:
c
Ha introducido una letra. Ingrese un número
v
Ha introducido una letra. Ingrese un número
48
Introduce un número:
-56
Introduce un número:
-1
Usted ha introducido 2 veces letras
El número más alto fue: 78.0


RECOMENDACIONES


1) Usar nombres apropiados. Por ejemplo:

num puede llamarse number/numero.
cont puede llamarse counter/contador.
aux, éste es el peor. Puede llamarse highestNumber/numeroMayor.
s, puede llamarse reader/lector/entrada.

2) Empezar a usar programación orientada a objetos como lo hice yo. Lee algún tutorial al respecto.


Título: Re: Insertar letra en Scanner.nextInt
Publicado por: Baal_30 en 2 Marzo 2015, 08:54 am
uff vaya, así me resulta más complejo, pero si funciona... xD Un par de preguntitas Gus, si me las permites... que últimamente te estoy dando mucho la brasa  :rolleyes:

1- ¿En el catch, en vez de poner number = askForNumber(), no se podría poner solamente askForNumber() ?

2- En el main, highestNumber la inicializas en "0d" ¿Que significa esa "d"?

3- Y creo, que en este caso no haría falta hacer static la variable exceptionCounter, ¿o si es necesario para que se mantenga el valor cada vez que se llama al método en vez de empezar de 0 cada vez?

Mientras voy cambiando los nombres de las variables :P Y me pondré con la POO en breves ¡! :)


Título: Re: Insertar letra en Scanner.nextInt
Publicado por: Usuario Invitado en 2 Marzo 2015, 13:44 pm
1) No. es necesario que el valor devuelto recursivo sea asignado a number. Si no haces, retornará null en lugar de un número correcto porque estás llamando a una réplica del método y este devuelve un valor que debe ser asignado.

2) Bien q hayas preguntado. Si pasas defrente un número real por parámetro éste será tomado como Float. Agregando d al número real indicamos que es Double. En este caso no es necesario.

3) Te felicito, captaste el error oculto :xD

No debe ser static, si ya tenemos un getter para exceptionCounter es completamente innecesario y ademas mal aplicado que sea static. Si lo hacemos y creamos muchos objetos HighestNumberFinder todos ellos compartirán la variable y definitavemente no queremos eso ahora.

Vas aprendiendo. Sigue así. Saludos.


Título: Re: Insertar letra en Scanner.nextInt
Publicado por: Baal_30 en 3 Marzo 2015, 09:02 am
Muchas gracias Gus ;) Aprendo mucho con tus respuestas ¡!


Título: Re: Insertar letra en Scanner.nextInt
Publicado por: Usuario Invitado en 3 Marzo 2015, 14:01 pm
De nada colega. No olvides marcar el tema como solucionado: (http://i.imgur.com/0hp2BlR.png?1)