Autor Tema: No usar break dentro de bucles Java por ser poco elegante CU00669B  (Leído 7510 veces)

jupertivo

  • Sin experiencia
  • *
  • Mensajes: 29
  • Aprendiendo y más allá
    • Ver Perfil
Hola a tod@s. Os transcribo el código de dicho ejercicio. Acepto todo tipo de mejoras, críticas, etc.  :).


Clase MesesDelaño:

Código: [Seleccionar]
public class MesesDelAño {
    public static void main (String[]args) {
        String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto=MesesDelAño[4];
        EntradaDeTeclado entrada;
        System.out.println("Empezamos el programa. Para salir, pulse 'return'");
        System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        do{ 
            entrada=new EntradaDeTeclado();
            if(entrada.getContinuar()) {//Si no se teclea 'Return'
                if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
                System.out.println("\n¡Enhorabuena!. Ha acertado.");
                break;}
                    else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");} }//Si no se acierta
            else {break;} }//Si se teclea 'Return'
        while(entrada.getContinuar());//Compruebo que no se teclea 'Return'
        System.out.println("\nFin del programa"); } }


Clase EntradaDeTeclado:

Código: [Seleccionar]
import java.util.Scanner;
public class EntradaDeTeclado {
    private String entradaTeclado;
    boolean continuar=true;
    public EntradaDeTeclado() { //Constructor
        entradaTeclado="";
        pedirEntrada(); } //Al crear un objeto, se ejecuta este método
    public void pedirEntrada() {
        Scanner entradaEscaner=new Scanner(System.in);
        entradaTeclado=entradaEscaner.nextLine();
        if (entradaTeclado.length()==0) {continuar=false;} }
        //Si pulso 'Return', no se introducirán más datos
    public boolean getContinuar() {return continuar;}
    public String getEntrada() {return entradaTeclado;} }


Gracias por vuestra atención. Saludos
« Última modificación: 21 de Abril 2015, 08:49 por Ogramar »
Descubrir y enmendar los pequeños errores ayuda a no cometer los grandes

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Array estático. Resolución ejercicio CU00669B
« Respuesta #1 en: 20 de Abril 2015, 23:27 »
Hola!

funciona a la perfección!

saludos  :)
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #2 en: 21 de Abril 2015, 08:51 »
Hola para mejorar el diseño te recomendaría seguir lo que se indica en https://www.aprenderaprogramar.com/foros/index.php?topic=2369.msg11309#msg11309

Copio: "Usar un break dentro de un bucle while es una ruptura del flujo natural de un programa. En general entre programadores se considera poco elegante usar esto porque dificulta comprender cómo funcionan los programas.

Para evitar usar el break puedes basarte en un booleano"

La idea es que break sólo se debe usar cuando no hay otras alternativas o cuando las alternativas son muy costosas de programar, pero en este caso se puede prescindir del break con poco esfuerzo.

En este caso:

Código: [Seleccionar]
public class MesesDelAño {
    public static void main (String[]args) {
        String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto=MesesDelAño[4];
        EntradaDeTeclado entrada;
        System.out.println("Empezamos el programa. Para salir, pulse 'return'");
        System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        boolean acertado = false;
        do{ 
            entrada=new EntradaDeTeclado();

            if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
                System.out.println("\n¡Enhorabuena!. Ha acertado.");
                acertado=true;
            }
            else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");}
        }while(entrada.getContinuar() && acertado ==false);//Compruebo que no se teclea 'Return'
        System.out.println("\nFin del programa"); }

}       

Salu2

jupertivo

  • Sin experiencia
  • *
  • Mensajes: 29
  • Aprendiendo y más allá
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #3 en: 21 de Abril 2015, 10:59 »
Buenos días. Gracias por vuestros comentarios. Tomo nota del tema 'break'.
Transcribo el código de la clase MesesDelAño, tal y como me quedaría a mí. He utilizado el mismo booleano para evitar la introducción de 'Return' y para saber si he acertado. Funciona correctamente pero, ¿estaría bien hecho así o no es recomendable hacerlo de esta manera?

Código: [Seleccionar]
public class MesesDelAño {
    public static void main (String[]args) {
        String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto=MesesDelAño[4];
        EntradaDeTeclado entrada;
        boolean continuar=false;
        System.out.println("Empezamos el programa. Para salir, pulse 'return'");
        System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        do{ 
            entrada=new EntradaDeTeclado();
            continuar=entrada.getContinuar();
            if(continuar) {//Si no se teclea 'Return'
                if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
                    System.out.println("\n¡Enhorabuena!. Ha acertado.");
                    continuar=false;}//Se ha acertado, por lo que se sale del programa
                    else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");} }//Si no se acierta
            else {continuar=false;} }//Si se teclea 'Return'
        while(continuar);//Compruebo que se ha acertado o si se teclea 'Return'
        System.out.println("\nFin del programa"); } }
 

Saludos.
Descubrir y enmendar los pequeños errores ayuda a no cometer los grandes

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #4 en: 21 de Abril 2015, 11:18 »
Hola, tienes un if anidado dentro de otro if, eso muchas veces se dice que es poco adecuado por ser poco claro, sobre todo si puede hacerse de otra manera. Puedes corregirlo o puedes dejarlo así, es algo que quedaría a tu criterio como programador.

Por ejemplo puedes eliminar el if anidado así:

Código: [Seleccionar]
public class MesesDelAño {
    public static void main (String[]args) {
        String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto=MesesDelAño[4];
        EntradaDeTeclado entrada;
        boolean continuar=false;
        System.out.println("Empezamos el programa. Para salir, pulse 'return'");
        System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        do{ 
            entrada=new EntradaDeTeclado();
            continuar=entrada.getContinuar();
            if(continuar && entrada.getEntrada().equals(mesSecreto)) {//Si no se teclea 'Return'
               
                    System.out.println("\n¡Enhorabuena!. Ha acertado.");
                    continuar=false;}//Se ha acertado, por lo que se sale del programa
                    else {System.out.println("No ha acertado. ");} }//Si no se acierta
           
        while(continuar);//Compruebo que se ha acertado o si se teclea 'Return'
        System.out.println("\nFin del programa"); } } 

Salu2

jupertivo

  • Sin experiencia
  • *
  • Mensajes: 29
  • Aprendiendo y más allá
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #5 en: 21 de Abril 2015, 13:07 »
Hola otra vez. Entiendo lo de los 'if anidados'. Puede ser complejo de entender.
El problema es que intento que si pulsa 'Return' (orden de finalización del programa) al introducir el mes, directamente se acabe el programa, y no pase por el 'else' y le diga que no ha acertado. Demasiado afinar, creo.
Saludos.
Descubrir y enmendar los pequeños errores ayuda a no cometer los grandes

jupertivo

  • Sin experiencia
  • *
  • Mensajes: 29
  • Aprendiendo y más allá
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #6 en: 21 de Abril 2015, 19:17 »
Hola. Aquí estoy "dando la vara otra vez". No he podido dejar de pensar en como hacer el código anterior sin utilizar 'if' anidados. Creo que encontré la solución. Os la expongo a continuación.

Código: [Seleccionar]
public class MesesDelAño {
    public static void main (String[]args) {
        String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        String mesSecreto=MesesDelAño[4];
        EntradaDeTeclado entrada;
        boolean continuar=false;
        System.out.println("Empezamos el programa. Si pulsa solo 'Return' el programa finalizará ");
        System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
        do{ 
            entrada=new EntradaDeTeclado();
            continuar=entrada.getContinuar();
            if(!continuar) {System.out.println("\nHa pulsado 'Return'");} //Si se pulsa 'Return', el programa finaliza
            else if(entrada.getEntrada().equals(mesSecreto)) { //Si se acierta ...
                System.out.println("\n¡Enhorabuena!. Ha acertado.");
                continuar=false;} //Se ha acertado, por lo que el programa finaliza
                else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");}  }//Si no se acierta ...
        while(continuar); //Se comprueba si se ha acertado el mes o si se ha pulsado 'Return'
        System.out.println("\nFin del programa"); } }


Saludos
Descubrir y enmendar los pequeños errores ayuda a no cometer los grandes

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #7 en: 21 de Abril 2015, 19:40 »
Pues sí, ahora haces lo que pretendías y sin el if anidado así que perfecto  ;D


jupertivo

  • Sin experiencia
  • *
  • Mensajes: 29
  • Aprendiendo y más allá
    • Ver Perfil
Re:No usar break dentro de bucles Java por ser poco elegante CU00669B
« Respuesta #8 en: 21 de Abril 2015, 19:49 »
Gracias Ogramar por la atención. Saludos.
Descubrir y enmendar los pequeños errores ayuda a no cometer los grandes

 

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