Autor Tema: incomparable types a and b if (numero == f) error Java ejercicio curso CU00672B  (Leído 3011 veces)

micaelasol

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Hola, he estado intentando hacer este ejercicio pero no logro terminarlo. El ejercicio es el código CU00672B del programa formativo para programadores en Java de aprenderaprogramar.

Citar
Crea un programa Java que permita “jugar a adivinar un número” como se expone a continuación. El programa debe iniciarse indicando “Se ha generado un número aletatorio entero entre 1 y 100, intente adivinarlo”. El usuario introducirá un número y si el número aleatorio generado por el ordenador es menor deberá indicarse “No has acertado: el número es menor. Prueba otra vez”. Si el usuario introduce un número menor que el número aleatorio deberá indicarse “No has acertado: el número es mayor”. El programa terminará cuando el usuario introduzca el número aleatorio que había escogido el ordenador.

En la clase testAdivinarNumero me da error cuando quiero comparar la variable numero (int) con la entrada que también iría a ser un número. No sé si la entrada es tomada como un String entonces tengo que pasarlo a un int.

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

public class testAdivinarNumero {
   
    public static void main (String [] args){
        EntradaTeclado entradaScanner;
        adivinarNumero numero = new adivinarNumero();
        System.out.println("Se ha creado un número aleatorio entre 1 y 100");
        System.out.println("Ingrese un número: ");
        entradaScanner = new EntradaTeclado();       
       
        if (numero == entradaScanner){
            System.out.println ("Usted ha adivinado el número");
        } else if (numero > entradaScanner){
            System.out.println ("El número ingresado es mayor. Intentelo de vuelta: ");
        }else if (numero < entradaScanner){
            System.out.println ("El número ingresado es menor. Intentelo de vuelta: ");
        }

    }
   
}

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

public class adivinarNumero
{
    int numero;
   
    public adivinarNumero(){
        Random numeroAleatorio = new Random();
        numero = numeroAleatorio.nextInt(100);
        numero = 36;
    }
   
}

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

public class EntradaTeclado
{
    private String entrada;
   
    public EntradaTeclado(){
        entrada = "";
    }
   
    public void pedirEntrada(){
        Scanner entradaTeclado = new Scanner (System.in);
        entrada = entradaTeclado.nextLine();
    }
   
    public String setEntrada (String valorEntrada){
        entrada = valorEntrada;
        return entrada;
    }
   
    public String getEntrada () {return entrada;}
   
}

Que quede claro que todavía no lo he terminado al ejercicio.
Muchas gracias por la ayuda!
« Última modificación: 19 de Agosto 2022, 19:43 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Generar números aleatorios en Java. Clase Random y método nextInt.
« Respuesta #1 en: 15 de Marzo 2022, 21:02 »
Sí, tu clase EntradaTeclado retorna un String, por tanto no puedes compararlo con un int, a no ser que lo transformes.

Pero es que además, en realidad no estás comparando el int con la entrada de teclado. Estás comparando el int con el objeto EntradaTeclado
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
       
        if (numero == entradaScanner){

Una vez instanciado tu objeto EntradaTeclado, tendría que pedir una entrada, y luego retornarla para poder comparar:
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
        entradaScanner.pedirEntrada();
               
        if (numero == entradaScanner.getEntrada()){
Aquí ahora si estaríamos con el problema de comparar un int con un String, que puedes resolverlo transformando a Integer
Código: [Seleccionar]
        entradaScanner = new EntradaTeclado();       
        entradaScanner.pedirEntrada();
               
        if (numero == Integer.parseInt(entradaScanner.getEntrada())){

Por otra parte, no necesitas escribir una clase específica para pedir entradas por teclado.
Quizás en un programa más complejo, donde te interese hacer un control específico de lo que entra el usuario, o como lo retornas.., entonces sí.

Pero en este caso, donde simplemente quieres que el usuario introduzca un valor int, puedes declarar directamente un objeto Scanner en el programa principal y que pida el int
Citar
import java.util.Scanner;

public class testAdivinarNumero {
   
    public static void main (String [] args){
        Scanner entradaScanner = new Scanner(System.in);
        adivinarNumero numero = new adivinarNumero();
        System.out.println("Se ha creado un número aleatorio entre 1 y 100");
        System.out.println("Ingrese un número: ");
        int numImgresado = entradaScanner.nextInt();       
       
        if (numero == numImgresado ){
            System.out.println ("Usted ha adivinado el número");
        } else if (numero > numImgresado ){
            System.out.println ("El número ingresado es mayor. Intentelo de vuelta: ");
        }else if (numero < numImgresado ){
            System.out.println ("El número ingresado es menor. Intentelo de vuelta: ");
        }

    }
   
}

Así te ahorras tener que escribir/usar una clase, que en realidad no va a hacer nada que no pueda hacer la propia clase Scanner por sí sola.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

micaelasol

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re: Generar números aleatorios en Java. Clase Random y método nextInt.
« Respuesta #2 en: 21 de Marzo 2022, 19:04 »
Intento resolver este ejercicio pero estoy super trabada.

Intento pasar la entrada String a un int oara compraralo con el número "incógnita":

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

public class testAdivinarNumero {
   
    public static void main (String [] args){
        Scanner entradaScanner = new Scanner(System.in);
        adivinarNumero numero = new adivinarNumero();
        System.out.println("Se ha creado un número aleatorio entre 1 y 100");
        System.out.println("Ingrese un número: ");
        int entrada = entradaScanner.nextInt();
       
        if (numero == Integer.parseInt(entrada)){
            System.out.println ("Usted ha adivinado el número!!");
        } else if (numero > entrada){
            System.out.println ("El número ingresado es mayor. Intentelo de vuelta: ");
        }else if (numero < entrada){
            System.out.println ("El número ingresado es menor. Intentelo de vuelta: ");
        }
       
       
    }
   
}

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

public class adivinarNumero
{
    int numero;
    String entrada;
   
    public adivinarNumero(){
        Random numeroAleatorio = new Random();
        numero = numeroAleatorio.nextInt(100);
        numero = 36;
    }
   
    public String setEntrada (String valorEntrada){
        entrada= valorEntrada;
        return entrada;}
       
    public String getEntrada(){return entrada;}
       
   
}

Agradezco su ayuda!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Generar números aleatorios en Java. Clase Random y método nextInt.
« Respuesta #3 en: 22 de Marzo 2022, 12:20 »
La variable entrada, ya es un int. Así que hacerle un parseInt() es innecesario, porque ya es un int.

Citar
int entrada = entradaScanner.nextInt();
       
        if (numero == Integer.parseInt(entrada)){

De todos modos, intentas comparar entrada, que es int, con numero que es de la clase adivinarNumero

No puedes compararlos, son cosas distintas. Aunque ambos sean valores numéricos, no se pueden comparar directamente porque están modelados de formas distintas.
entrada es un int primitivo, básicamente es un trocito de memoria RAM que ocupa 32 bit.
numero es un objeto adivinarNumero, al ser una clase POO, es algo mucho más complejo que una simple dirección de memoria reservada.
Por eso no se pueden comparar, al menos no directamente.

Parte del problema radica en que quizás estás buscando una solución más compleja de lo necesario.

El número secreto, o sea, el número que hay que adivinar, no tiene porque ser una clase POO.
Basta con que sea un simple int, igual que el número que ingresará el usuario. La diferencia es que uno va a proceder del teclado del usuario y el otro nos lo dará un objeto Random.

Esta podría ser la forma sencilla de solucionarlo. Añado algo importante que tú no habías puesto, un bucle que se repita hasta que el usuario haya acertado el número secreto:
Código: [Seleccionar]
public class AdivinarNumero {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
Random azar = new Random();
int numSecreto = azar.nextInt(100) + 1;
boolean acertado = false;

while(!acertado) {
System.out.print("Acierta un numero entre 1 y 100: ");
int numero = teclado.nextInt();

if (numero == numSecreto) {
System.out.println("Enhorabuena! Has acertado");
acertado = true; //Esto pondrá fin al bucle
}
else if (numero < numSecreto)
System.out.println("Fallaste! El numero es mayor");
else
System.out.println("Fallaste! El numero es menor");
}

teclado.close();
System.out.println("\n\t\tFIN DE PROGRAMA");
}

}

Como ves, aquí no hay ningún problema en comparar los números, porque ambos son int.
Y con esto es suficiente.

Sin embargo, vamos a darle una vuelta de tuerca. Vamos a seguir tu planteamiento de hacer que el número "secreto", sea una clase POO.
Por ejemplo, esta:
Código: [Seleccionar]
public class NumeroSecreto {

private int secreto;

public NumeroSecreto() {
Random azar = new Random();
secreto = azar.nextInt(100) + 1;
}

public int getSecreto() {
return secreto;
}

}
Al construir un objeto de esta clase, obtendremos un int con un valor generado por un Random.

Si lo aplicamos en el programa principal, ahora las comparaciones (marco en rojo) nos van a dar error:
Citar
public class AdivinarNumero {

   public static void main(String[] args) {
      Scanner teclado = new Scanner(System.in);

      NumeroSecreto numSecreto = new NumeroSecreto();
      boolean acertado = false;
      
      while(!acertado) {
         System.out.print("Acierta un numero entre 1 y 100: ");
         int numero = teclado.nextInt();
         
         if (numero == numSecreto) {
            System.out.println("Enhorabuena! Has acertado");
            acertado = true; //Esto pondrá fin al bucle
         }
         else if (numero < numSecreto)
            System.out.println("Fallaste! El numero es mayor");
         else
            System.out.println("Fallaste! El numero es menor");
      }

      teclado.close();
      System.out.println("\n\t\tFIN DE PROGRAMA");
   }

}

¿Por qué da error si el número secreto, en esencia, es un int?
Sí, el numero secreto es un atributo int, pero está "encapsulado" en una clase POO y eso hace que no se pueda comparar directamente con otros int.

Directamente no..., pero, hay otra forma.

Tú intentaste usar el método Integer.parseInt(). Bien, pues no sirve en este caso.
Este método solo puede convertir objetos String a Integer(int).
Pero no podemos pedirle que haga lo mismo con un objeto NumeroSecreto.

En realidad, no necesitamos ayuda externa. Nuestra clase NumeroSecreto ya tiene un método get() que nos puede retornar el atributo int que tenemos encapsulado.
Así que basta con invocar este método para poder comparar con "simples int".
Citar
public class AdivinarNumero {

   public static void main(String[] args) {
      Scanner teclado = new Scanner(System.in);

      NumeroSecreto numSecreto = new NumeroSecreto();
      boolean acertado = false;
      
      while(!acertado) {
         System.out.print("Acierta un numero entre 1 y 100: ");
         int numero = teclado.nextInt();
         
         if (numero == numSecreto.getSecreto()) {
            System.out.println("Enhorabuena! Has acertado");
            acertado = true; //Esto pondrá fin al bucle
         }
         else if (numero < numSecreto.getSecreto())
            System.out.println("Fallaste! El numero es mayor");
         else
            System.out.println("Fallaste! El numero es menor");
      }

      teclado.close();
      System.out.println("\n\t\tFIN DE PROGRAMA");
   }

}

Listo.
Espero haber aclarado tus dudas. Si no fuera así, no dejes de preguntar.
Un saludo.
« Última modificación: 22 de Marzo 2022, 12:22 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

micaelasol

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re: Generar números aleatorios en Java. Clase Random y método nextInt.
« Respuesta #4 en: 25 de Marzo 2022, 10:20 »
Muchísimas gracias!

 

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".