Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: PARTISANO70 en 09 de Mayo 2019, 22:43

Título: Java: cómo mejorar el código y elegir bien condiciones en bucles while CU00659B
Publicado por: PARTISANO70 en 09 de Mayo 2019, 22:43
Propuesta de solución para el ejercicio CU00659B del tutorial pdf de programación Java desde cero:

Código: [Seleccionar]
/**
 * Write a description of class deletreaConWhile here.
 *
 * @author (RMB)
 * @version (a version number or a date)
 */
import java.util.Scanner;

public class deletreaConWhile
{
    public static void main (String[] args){
    System.out.println("Inicial el Programa");//Letrero de inicio del programa
    System.out.println("Deletrear con while\n");//Letrero de lo que hace el programa
   
    //Declaración de variables tipo String
    String cadena;
    String deletrea;
        cadena = "";
        deletrea = "";
   
    //Declaración de variables Contadoras
    int lonCad;                             //Guarda la longitud de la cadena
    int contador = 0;                       //Primer parámetro del substring
    int i = 1;                              //Segundo parámetro del substring
   
    System.out.println("Introduce una cadena"); //Letrero de indicación
    Scanner scCadena = new Scanner (System.in); //Creamos el objeto tipo Scanner
    cadena = scCadena.nextLine();               //Guardamos el valor del objeto en la variable
   
    System.out.println("La cadena dice " + cadena); //Mostramos la cadena completa
    lonCad = (cadena.length()+1);                   //Guardamos la longitud de la cadena
    System.out.println("La cadena contiene " + (lonCad-1)+ " letras");  //Nos muestra cuantas letras tiene la cadena
       
        while(true){                                //Se inicia el ciclo while con la condición verdadera (true)
            deletrea=cadena.substring(contador,i);  //Almacenamos la subcadena en la variable deletrea
            System.out.println("Letra "+ i + " "+ deletrea);   
            contador++;                         //Incrementamos el valor de contador en 1
            i++;                                //Incrementamos el valor de i en 1
           
            if (i == lonCad){       //Establecemos un condición para poder romper el ciclo while
                break;              //Cuando el valor de i se compare con el valor de la longitud se rompe el ciclo
            }                       //Cierre de la condición                     
        }                           //Cierre del ciclo while
   }                                //Cierre del método principal
}                                   //Cierre de la clase

Título: Re:Ejercicio CU00659B
Publicado por: Kabuto en 10 de Mayo 2019, 15:34
Hola.

Aunque el programa funcione, has optado por usar un bucle infinito (while(true)) para luego "romperlo" con un break cuando se cumpla la condición de salida.

ESto lo has hecho siguiendo el ejemplo explicativo de esa entrega 59, pero fíjate que en esa misma entrega ya se indica que esta forma de hacer el bucle while es meramente un ejemplo explicativo y no debería ser la forma habitual de proceder

Citar
[...] en general la salida a un bucle se realizará de forma natural mediante la evaluación de la condición y no mediante una instrucción break;.

Así que lo ideal sería que reescribas tu bucle while y en el lugar del true pongas ahí la condición que ha de cumplirse para que se repita el while.

Esta condición es muy similar a la que has usado en el if, pero será distinta.

Fíjate que en el if, has tenido que pensar en la condición que VA A PONER FIN al bucle.

En cambio, para la condición del while, vas a tener que pensar en la condición que VA A HACER QUE SE REPITA el bucle.

Es decir, MIENTRAS se cumpla dicha condición, el bucle se repetirá. Cuando  deje de cumplirse, el bucle finalizará.


El uso de break para romper bucles, ya sean while, do..while o for debe evitarse siempre que sea posible.
Habrá situaciones muy concretas en las que usar break puede suponer una simplificación importante del código y entonces sí podría ser preferible su uso.

Hay puristas de la programación que te dirán que no, que usar break para romper bucles es prácticamente un sacrilegio je je...
Yo no diría tanto. Siempre evito usar break, pero si me encuentro en una de esas situaciones que hacen que el código quede más simplificado y más legible, entonces no dudo en emplearlo.

En fin, prueba a reescribir ese while como te he dicho, y si tienes dudas pregunta.
Elegir bien las condiciones en los bucles tiene su importancia. En este caso no es difícil, pero hay ocasiones en las que hay que combinar más de una condición. Y saber elegir las condiciones óptimas y en que orden combinarlas, es importante.
Título: Re:Ejercicio CU00659B Corregido
Publicado por: PARTISANO70 en 10 de Mayo 2019, 20:12
Código:

Código: [Seleccionar]
/**
 * Write a description of class deletreaConWhile here.
 *
 * @author (RMB)
 * @version (a version number or a date)
 */
import java.util.Scanner;

public class deletreaConWhile
{
    public static void main (String[] args){
    System.out.println("Inicial el Programa");//Letrero de inicio del programa
    System.out.println("Deletrear con while\n");//Letrero de lo que hace el programa
   
    //Declaración de variables tipo String
    String cadena;
    String deletrea;
        cadena = "";
        deletrea = "";
   
    //Declaración de variables Contadoras
    int lonCad;                             //Guarda la longitud de la cadena
    int contador = 0;                       //Primer parámetro del substring
    int i = 1;                              //Segundo parámetro del substring
   
    System.out.println("Introduce una cadena"); //Letrero de indicación
    Scanner scCadena = new Scanner (System.in); //Creamos el objeto tipo Scanner
    cadena = scCadena.nextLine();               //Guardamos el valor del objeto en la variable
   
    System.out.println("La cadena dice " + cadena); //Mostramos la cadena completa
    lonCad = (cadena.length()+1);                   //Guardamos la longitud de la cadena
    System.out.println("La cadena contiene " + (lonCad-1)+ " letras");  //Nos muestra cuantas letras tiene la cadena
       
        while(i < lonCad ){                          //Se inicia el ciclo while mientras el valor de i < la longitud de la cadena
            deletrea=cadena.substring(contador,i);  //Almacenamos la subcadena en la variable deletrea
            System.out.println("Letra "+ i + " "+ deletrea);   
            contador++;                         //Incrementamos el valor de contador en 1
            i++;                                //Incrementamos el valor de i en 1
        }                           //Cierre del ciclo while
   }                                //Cierre del método principal
}                                   //Cierre de la clase

Título: Re:Ejercicio CU00659B
Publicado por: Kabuto en 10 de Mayo 2019, 23:40
OK. Ahora ningún purista de la programación podrá acusarte de cometer sacrilegios con el break je je..

Por último comentar que, sin duda está todo correcto, pero siempre hay alguna mejora posible y por ejemplo en este caso podrías haberte ahorrado algunas variables como lonCad y contador, haciendo algo como esto:

Código: [Seleccionar]
        int i = 0;
        while(i < cadena.length() ){
            deletrea=cadena.substring(i, i+1);
            System.out.println("Letra "+ i + " "+ deletrea);   
            i++;
        }

E incluso la variable deletrea nos la podríamos ahorrar también.

Esto lo comento como algo secundario. No es importante ahora mismo.
De hecho cuando se empieza a programar, puede venir bien usar más variables de lo necesario para clarificar mejor las ideas de lo que se está haciendo.
Con el tiempo, cuando ya se tienen las ideas más claras, tú mismo irás descubriendo que el código se puede simplificar fácilmente.

Un saludo.

Título: Re:Ejercicio CU00659B
Publicado por: PARTISANO70 en 13 de Mayo 2019, 23:23
Muchas gracias por las observaciones para corregir el desarrollo del ejercicio; seguimos en la capacitación.. Saludos