Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: guillemolero en 08 de Agosto 2015, 09:49

Título: Por qué no se debe usar break para salir de un bucle while mal diseño CU00662B
Publicado por: guillemolero en 08 de Agosto 2015, 09:49
Hola a todos.

Pongo aquí el código del ejercicio resuelto de la entrega 62 del curso.
Lo he comprobado con palabras de distinto e igual tamaño y parece que funciona correctamente. Espero corrección alguna :3.

Muchas gracias :D


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

public class Ejercicio
{
    public static void main(String [] args)
    {
        String entrada1 = "";
        String entrada2 = "";
       
        System.out.println("Introduce la primera palabra:");
        Scanner scanner1 = new Scanner(System.in);
        entrada1 = scanner1.nextLine();
       
        System.out.println("Introduce la segunda palabra:");
        Scanner scanner2 = new Scanner(System.in);
        entrada2 = scanner2.nextLine();
       
        int k = 0;
       
        while (entrada1.length() > k || entrada2.length() > k)
        {
            k+=1;
            System.out.println("¿Letra " +k+ " igual en las dos palabras?");
            if(entrada1.length() >=k && entrada2.length() >= k)
            {
                if(entrada1.substring(k-1,k).equals(entrada2.substring(k-1,k)))
                {
                    System.out.println("Si");
                }
                else
                {
                    System.out.println("No");
                }
            }
            else if (entrada1.length() < k)
            {
                System.out.println("La primera palabra no tiene letra " + k);
            }
            else if (entrada2.length() < k)
            {
                System.out.println("La segunda palabra no tiene letra " + k);
            }
            else
            {
                break;
            }
        }
    }
}
Título: Re:Java, ejercicio resuelto CU00662B.
Publicado por: RaGa en 09 de Agosto 2015, 16:03
Hola Guille!

Primeramente he de darte la bienvenida al foro ya que veo que es tu primera publicación, bienvenido!

Analizando tu ejercicio veo que lo has hecho muy bien, felicitaciones por ello.
Lo único para observar que tengo por mi parte es respecto a la utilización de la sentencia 'break' que empleas para salir del bucle while.
Si bien es válida la utilización de 'break' siempre trataremos de eviarla, diseñando los bucles de tal manera que nuestra salida del while sea más limpia, es decir: cuando la condición impuesta en while deja de cumplirse.

En este caso particular de tu ejercicio, la utilización del break no era necesaria. Reescribo el código eliminando el último 'else' (y convietiendo el último 'else if' en 'else').

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

public class Ejercicio
{
    public static void main(String [] args)
    {
        String entrada1 = "";
        String entrada2 = "";
       
        System.out.println("Introduce la primera palabra:");
        Scanner scanner1 = new Scanner(System.in);
        entrada1 = scanner1.nextLine();
       
        System.out.println("Introduce la segunda palabra:");
        Scanner scanner2 = new Scanner(System.in);
        entrada2 = scanner2.nextLine();
       
        int k = 0;
       
        while (entrada1.length() > k || entrada2.length() > k)
        {
            k+=1;
            System.out.println("¿Letra " +k+ " igual en las dos palabras?");
            if(entrada1.length() >=k && entrada2.length() >= k)
            {
                if(entrada1.substring(k-1,k).equals(entrada2.substring(k-1,k)))
                {
                    System.out.println("Si");
                }
                else
                {
                    System.out.println("No");
                }
            }
            else if (entrada1.length() < k)
            {
                System.out.println("La primera palabra no tiene letra " + k);
            }
            else
            {
                System.out.println("La segunda palabra no tiene letra " + k);
            }
           
        }
    }
}

Analízalo y cualquier duda estamos aquí para volverlo a revisar.
Título: Re:Java, ejercicio resuelto CU00662B.
Publicado por: guillemolero en 09 de Agosto 2015, 16:38
Ya entiendo ¡Tienes toda la razón!

Gracias por el recibimiento. Voy a corregir el código ahora mismo. Y ya que estoy... Una pregunta: ¿Por qué está tan mal visto el uso de break en programación?

Siempre he tenido esa curiosidad :P

Un saludo.
Título: Re:Java comprobar si dos palabras son iguales letra a letra ejercicio CU00662B
Publicado por: RaGa en 09 de Agosto 2015, 23:10
Hola Guille:

Bueno, para responder a tu pregunta con solidéz argumental y espaldas para sostener lo dicho creo que deberíamos invocar a alguien con más estrellas y galardones en su uniforme que las que luzco yo.  ;D

Hasta que eso suceda me arriesgaría a decir que el uso de la sentencia break cuando el bucle puede ser resuelto sin él, evidencia un pobre diseño.
De todos modos no creo que se trate de un mero hecho estético evitar el break, sino que pienso podría estar relacionado con  cuestiones de diseño de estructura y solidez.
Igualmente convengamos también que el uso del break no es un error, de hecho forma parte del set de sentencias de Java.
Título: Re:Java comprobar si dos palabras son iguales letra a letra ejercicio CU00662B
Publicado por: Alex Rodríguez en 09 de Agosto 2015, 23:26
Hola, sin estrellas ni galardones  ;), el uso de instrucciones que crean disrupciones en el flujo natural de programas se consideran inadecuadas por generar estructuras de código de diseño pobre y difícil seguimiento. Un bucle while tiene una puerta natural para entrar o salir (la condición). Salir con un break es como salir por la ventana, puedes hacerlo, pero no es lo más adecuado.

Para quien quiera leer más: Modificación directa del flujo de programas: entregas CU00177A a CU00183A del curso de Bases de la programación http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59

Saludos
Título: Re:Java comprobar si dos palabras son iguales letra a letra ejercicio CU00662B
Publicado por: RaGa en 10 de Agosto 2015, 02:11
Muchas gracias Alex.
Y excelente el aporte del material para consultar. Saludos.
Título: Re:Por qué no se debe usar break para salir de un bucle while mal diseño CU00662B
Publicado por: guillemolero en 10 de Agosto 2015, 14:18
Ya veo.

Muchísimas gracias a ambos y ¡perdón por las molestias!

Seguiré con el curso a ver si lo termino con éxito :D. Un saludo.