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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Insertar letra en Scanner.nextInt
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Insertar letra en Scanner.nextInt  (Leído 3,911 veces)
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Insertar letra en Scanner.nextInt
« 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 ¡! :)


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Insertar letra en Scanner.nextInt
« Respuesta #1 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.


« Última modificación: 1 Marzo 2015, 23:12 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Insertar letra en Scanner.nextInt
« Respuesta #2 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 ¡! :)
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Insertar letra en Scanner.nextInt
« Respuesta #3 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.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Insertar letra en Scanner.nextInt
« Respuesta #4 en: 3 Marzo 2015, 09:02 am »

Muchas gracias Gus ;) Aprendo mucho con tus respuestas ¡!
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Insertar letra en Scanner.nextInt
« Respuesta #5 en: 3 Marzo 2015, 14:01 pm »

De nada colega. No olvides marcar el tema como solucionado:
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre almacenar palabra letra a letra
.NET (C#, VB.NET, ASP)
Meyer900 5 9,597 Último mensaje 27 Septiembre 2008, 19:59 pm
por SeniorX
dividir cadena letra por letra
Scripting
morenochico 3 8,773 Último mensaje 3 Julio 2009, 18:46 pm
por leogtz
Identificar letra por letra en un Textbox
Programación Visual Basic
pungados 5 15,686 Último mensaje 31 Agosto 2009, 00:21 am
por SRVAM
Insertar en una nueva hoja de al pasar de una letra A a B y asi sucesivamente c#
.NET (C#, VB.NET, ASP)
joalbela 3 3,030 Último mensaje 8 Marzo 2011, 19:45 pm
por [D4N93R]
Como cifrar letra por letra en C++ « 1 2 ... 6 7 »
Programación C/C++
Royca3 67 61,798 Último mensaje 23 Agosto 2013, 05:32 am
por erest0r
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines