Autor Tema: Solucion Ejercicio CU00669B - Arrays o arreglos Java cuándo usar for o while  (Leído 5869 veces)

jotase1507

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Buenas tardes, envio mi codigo, no supe como salir del for, por lo cual aumente excesivamente al contador obligando a la salida, no se si eso es correcto por lo cual si me equivoco agradecere la correccion :)

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

public class EntradaDeTeclado {
    private String entradaTeclado;
 
    public EntradaDeTeclado ()  {
        entradaTeclado="";
        pedirEntrada();
    }
 
    public void pedirEntrada ()  {   
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();     
    }
 
    public String getEntrada () {
        return entradaTeclado;
    }
}

Clase Main
Código: [Seleccionar]
import java.util.*;

public class Prueba {
    //Ejercicio 69
    public static void main(String [] args){
        System.out.println("Inicia el programa.");
        String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto = arrayMesesDelAnho[9];
       
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        for (int i = 0; i < arrayMesesDelAnho.length; i++){
            EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
            if (mesIngresado.getEntrada().equals(mesSecreto)) {
                System.out.println("¡Ha acertado!");
                i = i + 11;
            } else {
                System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");
            }
        }
    }
}
« Última modificación: 11 de Febrero 2015, 17:01 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Solucion Ejercicio CU00669B - Arrays o arreglos Java.
« Respuesta #1 en: 10 de Febrero 2015, 20:24 »
Hola jotase

En este caso, el uso del for no es lo más adecuado, pues no sabemos cuantas veces hay que repetir el código.
Aquí lo que irá bien es un while con una condición boolean

El fondo del programa está bien con el manejo del array

A continuación tienes tu clase Prueba con unos pequeños cambios para trabajar con el while

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

public class Prueba {
    //Ejercicio 69
    public static void main(String [] args){
        System.out.println("Inicia el programa.");
        String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto = arrayMesesDelAnho[9];
        System.out.println(arrayMesesDelAnho.length);
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        boolean acierto = false;
        int intentos = 0;
        do {
            //         for (int i = 0; i < arrayMesesDelAnho.length; i++){
            EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
            if (mesIngresado.getEntrada().equals(mesSecreto)) {
                System.out.println("Intento: " + (++intentos) + " ¡Ha acertado!");
                //                 i = i + 11;
                acierto = true;
            } else {
                System.out.println("Intento: " + (++intentos) + " No ha acertado. Intente adivinarlo introduciendo otro mes: ");
            }
        } while (!acierto);
    }
}
Saludos

jotase1507

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:Solucion Ejercicio CU00669B - Arrays o arreglos Java.
« Respuesta #2 en: 10 de Febrero 2015, 21:52 »
De hecho sabia que habia algo mal, no se me habia ocurrido usar un boolean como condicional. Cambie mi codigo y tratando de no copiar el suyo, hice lo siguiente. Si hay algo que no convence, agradecere el feedback :)

Clase Prueba
Código: [Seleccionar]
public class Prueba {
    //Ejercicio 69 (corregido)
    public static void main(String [] args){
        System.out.println("Inicia el programa.");
        String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto = arrayMesesDelAnho[9];
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        boolean acierto = false;
        while (acierto == false) {
            EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
            if (mesIngresado.getEntrada().equals(mesSecreto)) {
                System.out.println("¡Ha acertado!");
                acierto = true;
            } else {               
                System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");
            }
        }
    }
}

toni_apr

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

Tu versión está perfecta.
La condición del while controla la salida del bucle.

Saludos

adrianpza

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Estimados amigos quiero presentar una solucion un tantito mas compacta pero igual de funcional: (corriganme si me equivoco gracias...)

Código: [Seleccionar]
import java.util.Scanner;
public class MesSecreto{
   
    public static void main(String [] args){
        String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
        boolean vSwitch = false;
        String mesSecreto = mes[9];
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
        while(vSwitch == false){
            Scanner sc = new Scanner(System.in);
            String temp = sc.nextLine();
            if(temp.equals(mesSecreto)){
                System.out.println("Ha acertado!");
                vSwitch = true;
                return;
            }
            System.out.println("No ha acertado. Intente nuevamente: ");
        }
    }   
}
       

adrianpza

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Aqui dejo el mismo ejercicio donde el mes secreto lo elije el ordenador por medio de la clase Random y el metodo int(int n) donde nos devuelve un pseudarandom del 0 al 12
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Random;
public class MesSecreto{
   
    public static void main(String [] args){
        String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
        boolean vSwitch = false;
        Random aleatorio;
        aleatorio= new Random();
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
        while(vSwitch == false){
            String mesSecreto = mes[aleatorio.nextInt(13)];
            Scanner sc = new Scanner(System.in);
            String temp = sc.nextLine();
            if(temp.equals(mesSecreto)){
                System.out.println("Ha acertado!");
                vSwitch = true;
                return;
            }
            System.out.println("No ha acertado. Intente nuevamente: ");
        }
    }   
}

toni_apr

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

Si, tu código es compacto.

De las dos soluciones al ejercicio, está mejor la primera, de la que no hay nada que objetar.

En la segunda tienes esta línea:
      String mesSecreto = mes[aleatorio.nextInt(13)];
que te dará error cuando el nextInt coja el valor 12  (de 0 a 12) pues en tu array el valor máximo es 11 (de 0 a 11).

Además la línea anterior la colocas dentro del while, lo que provoca que cambia el mes secreto en cada bucle. Así puede darse el caso de que ni con 12 intentos ni con 120 aciertes el mes secreto.

Seguro que sabes como arreglarlo.

Saludos

adrianpza

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Estimado moderador,, corrijo el error pero dejo el Random dentro del ciclo while pues, como dije en el titulo, mi idea es que el mes lo escoja el ordenador y no el programador.
ademas en esta correccion he eliminado la sentencia 'vSwitch = true' que estaba dentro de la cindicion 'if' ya que al invocar 'return' el programa no volvera a evaluar vSwitch,, corrigame si me equivoco por favor y muchas gracias por su atencion.
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Random;
public class MesSecreto{
   
    public static void main(String [] args){
        String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
        boolean vSwitch = false;
        Random aleatorio;
        aleatorio= new Random();
        System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
        while(vSwitch == false){
            String mesSecreto = mes[aleatorio.nextInt(12)];
            Scanner sc = new Scanner(System.in);
            String temp = sc.nextLine();
            if(temp.equals(mesSecreto)){
                System.out.println("Ha acertado!");
                return;
            }
            System.out.println("No ha acertado. Intente nuevamente: ");
        }
    }   
}

toni_apr

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

Muy bien, has rectificado el cálculo del mes secreto.
Cambiar el mes secreto en cada bucle del while es tu elección para este programa, que yo no había contemplado. De acuerdo.

En cuanto a colocar un return para salir del while, no es una opción válida. Pues si tu método tiene más instrucciones después del while no se ejecutarán, ya que el return obliga a abandonar el método en el acto.
La ideal era la anterior
    vSwitch = true;
dentro del if pero sin el return.

Saludos

 

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