Autor Tema: Java: cómo mejorar el código y elegir bien condiciones en bucles while CU00659B  (Leído 2756 veces)

PARTISANO70

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
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

« Última modificación: 22 de Septiembre 2020, 11:31 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re:Ejercicio CU00659B
« Respuesta #1 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.
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

PARTISANO70

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
Re:Ejercicio CU00659B Corregido
« Respuesta #2 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

« Última modificación: 22 de Septiembre 2020, 11:29 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re:Ejercicio CU00659B
« Respuesta #3 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.

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

PARTISANO70

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
Re:Ejercicio CU00659B
« Respuesta #4 en: 13 de Mayo 2019, 23:23 »
Muchas gracias por las observaciones para corregir el desarrollo del ejercicio; seguimos en la capacitación.. 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".