Autor Tema: Ejercicio CU00672B ejemplo numeros aleatorios java clase random adivinar número  (Leído 4538 veces)

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Hola, aqui esta mi solución a este ejercicio.
Primero la clase entradaTeclado:
Código: [Seleccionar]
import java.util.Scanner;

public class EntradaTeclado
{
    private String entradaTeclado;
   
    //constructor
    public EntradaTeclado(){
        entradaTeclado="";
    }
   
    //metodo de la clase
    public void pedirEntrada(){
        Scanner sc=new Scanner(System.in);
        entradaTeclado=sc.nextLine();
    }
   
    public String getEntrada(){
        return entradaTeclado;
    }
}

Ahora, la clase que he hecho para crear el número aleatorio a adivinar:


Código: [Seleccionar]
import java.util.Random;

public class NumeroAleatorio
{
    private Random numAleatorio;
    int numSecreto;
   
    public NumeroAleatorio(){
        numAleatorio=new Random();
        numSecreto=0;
        numSecreto=numAleatorio.nextInt(100)+1;//el metodo nextInt devuelve un numero entre 0 y 99, le sumo 1 para que el numero a adivinar este entre 1 y 100
        System.out.println("Se ha generado un número aleatorio entre 1 y 100, intente adivinarlo");
        System.out.println(numSecreto);// es una prueba para comprobar que funciona bien el codigo
    }
   
    public int getNumeroAleatorio(){
        return numSecreto;
    }
}

Esta clase la he hecho para pasar de la entrada de teclado de tipo String a int:

Código: [Seleccionar]
public class DeStringAInt
{
    private String objetoString;
    private int numIntroducido;
   
    public DeStringAInt(){
        objetoString="";
        numIntroducido=0;
    }
   
    public int pasarAInt(String objetoString){//recibo como parametro la entrada de teclado de tipo String
        Integer aux=0 ;// creo una variable aux Integer
        aux=aux.valueOf(objetoString);//Paso la variable String a Integer
        int numIntroducido=(int)aux;//paso a int el objeto integer
        return numIntroducido;// se devuelve un objeto tipo int
    }
}

Y esta es la clase main:

Código: [Seleccionar]
import java.util.Random;

public class AdivinaElNumero
{
    public static void main(String[]args){
        NumeroAleatorio numAleatorio;//declaro objeto tipo NumeroAleatorio
        numAleatorio= new NumeroAleatorio();// creo objeto tipo NumeroAleatorio
        int numSecreto=numAleatorio.getNumeroAleatorio();//el objeto devuelto es de tipo int

        EntradaTeclado sc=new EntradaTeclado();
        sc.pedirEntrada();//la entrada de teclado es un String
       
        DeStringAInt numero=new DeStringAInt();//creo un objeto de tipo DeStringAInt
        int numIntroducido=numero.pasarAInt(sc.getEntrada());//el tipo devuelto por el metodo pasarAInt es un int

        while(numIntroducido!= numSecreto ){
            if (numIntroducido < numSecreto){
                System.out.println("No has acertado, el número secreto es mayor. Prueba otra vez");
                sc.pedirEntrada();
                numIntroducido=numero.pasarAInt(sc.getEntrada());
            }else if(numIntroducido > numSecreto){
                System.out.println("No has acertado, el número secreto es menor. Prueba otra vez");
                sc.pedirEntrada();
                numIntroducido=numero.pasarAInt(sc.getEntrada());
            }
        }
        System.out.println("Enhorabuena!! has acertado");
    }
}

Un saludo y gracias por los consejos.
« Última modificación: 17 de Marzo 2015, 09:27 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00672B numeros aleatorios java clase random
« Respuesta #1 en: 16 de Marzo 2015, 21:50 »
Hola calderas

Ejercicio correcto. Cumple su función, crear un número aleatorio y en un bucle while intentar adivinarlo en sucesivos intentos. Bien.

Además has realizado una colección de clases que todas juntas llegan a buen fin. Bien. Esto te servirá para proyectos más grandes.

Pero, sin menoscabar tu trabajo, aquí van unos comentarios.

En programación se usa la lógica de: ante un problema complejo, afrontarlo partiéndolo en varios componentes, y solucionar estos de uno en uno.
Pero esto no es lo mismo que dividir las 100 líneas de un código en cuatro módulos de 25 líneas cada una y llamarlos en el orden adecuado. Esto falsea el principio de: Divide y vencerás.

Además la compartimentación del código en varias clases tiene el propósito de que estas clases sean recipientes de código válidos para otras ocasiones sin cambiar su contenido.
Tu clase NumeroAleatorio solo te sirve para los cien primeros enteros.
La clase DeStringAInt si que sirve para cualquier ocasión de convertir un String a int, pero una solo línea de código puede sustituir a toda la clase.
Tu clase EntradaTeclado, es operativa, pero para obtener el String deseado has de ejecutar dos instrucciones cada vez.

Te adjunto una versión compacta de tu ejercicio.  (+ compacto, + eficiente)

Código: [Seleccionar]
import java.util.Random;
import java.util.Scanner;
public class AdivinaElNumeroBis
{
    public static void main(String[]args){
        Random aleatorioNumero = new Random();
        int valorSecreto = aleatorioNumero.nextInt(100) + 1;
        System.out.println("Se ha generado un número aleatorio entre 1 y 100, intente adivinarlo");
        Scanner inputKB = new Scanner(System.in);
        System.out.println("La KGB nos informa que el numero secreto es: " + valorSecreto);
//        int numeroTecleado = inputKB.nextInt();
        int numeroTecleado = Integer.valueOf(inputKB.nextLine());
        while (numeroTecleado != valorSecreto) {
            if (numeroTecleado < valorSecreto) {
                System.out.println("No has acertado, el número secreto es mayor. Prueba otra vez");
            } else {
                System.out.println("No has acertado, el número secreto es menor. Prueba otra vez");
            }
            numeroTecleado = inputKB.nextInt();
//           numeroTecleado = Integer.valueOf(inputKB.nextLine());
        }
        System.out.println("Enhorabuena!! has acertado");
    }
}

Estas dos líneas se puede intercambiar, hacen lo mismo.
            numeroTecleado = inputKB.nextInt();
            numeroTecleado = Integer.valueOf(inputKB.nextLine());

Saludos

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Muchisimas gracias por tu consejo. Si te digo la verdad, al principio comence todo el codigo, menos la clase entradaTeclado, en la clase Main. Pero decidi separarlo en clases. No era ni mucho menos tan limpio y eficiente como el que me das...claro, pero si pense en crear clases y hacer llamadas mas que en escribir todo el codigo seguido.

A partir de ahora tendre en cuenta tus consejos a la hora de planificar el trabajo.

En cuanto a estas lineas,
  numeroTecleado = inputKB.nextInt();
  numeroTecleado = Integer.valueOf(inputKB.nextLine());
Comprendo la primera, el metodo nexInt de la clase Scanner, pero en la segunda tengo una duda, el metodo valueOf de la clase Integer, pasa de String a Integer pero este Integer se le asigna directamente a la variable numeroTeclado, que es un int.
¿Esto se puede hacer directamente siempre, de Integer a int?
Muchas gracias por vuestra ayuda.
Un saludo.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola calderas

    int numeroTecleado = Integer.valueOf(inputKB.nextLine());

Exacto, se puede hacer siempre. La expresión anterior es un ejemplo de la conversión de Integer a int.
Esta conversión (automática) la hace el compilador, pues el primitivo int y el objeto Integer guardan el mismo tipo de información (un número entero con un determinado rango de valores posibles). La diferencia entre estos tipos es que uno tiene métodos y el otro no.

Tal como se explica en entregas anteriores de este curso la elección de un primitivo int o un objeto de tipo Integer para nuestro código depende de:

Si solo queremos hacer operaciones matemáticas con el valor, usar un int.
Tipo primitivo sin métodos.

Si hemos de transformar el valor, averiguar propiedades, etc. usaremos un Integer para aprovechar sus métodos, como el valueOf(String) de este ejercicio.

La siguiente instrucción es igualmente válida:
    int numeroTecleado = (int) Integer.valueOf(inputKB.nextLine());
La ventaja que tiene es que todo está indicado y conducido aunque pueda decirse que es redundante.

Saludos

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Gracias por la aclaración.
Un saludo.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".