Java: Ciclo While
Los programas que escribimos durante el aprendizaje se vuelven cada vez más complejos y extensos. Aunque todavía están muy lejos de los programas reales, donde la cantidad de líneas de código se mide en decenas y cientos de miles, la complejidad actual puede ser desafiante para las personas sin experiencia.
A partir de esta lección, nos adentraremos en uno de los temas básicos más complejos de la programación: los ciclos.
Todos los programas de aplicación tienen objetivos muy pragmáticos. Ayudan a gestionar empleados, finanzas y, en última instancia, a entretener. A pesar de las diferencias, todos estos programas ejecutan algoritmos que son muy similares entre sí.
Un algoritmo es una secuencia de acciones o instrucciones que nos lleva a un resultado esperado. Esta descripción se aplica a cualquier programa, pero los algoritmos suelen ser algo más específicos.
Imagina que tenemos un libro y queremos encontrar una frase específica en su interior. Recordamos la frase, pero no sabemos en qué página está. ¿Cómo podemos encontrar la página que buscamos?
La forma más sencilla y lenta es revisar el libro secuencialmente hasta encontrar la página deseada. En el peor de los casos, tendríamos que revisar todas las páginas, pero de todas formas obtendríamos el resultado.
Este proceso se llama algoritmo. Incluye la búsqueda de páginas y comprobaciones lógicas para determinar si encontramos la frase o no. No sabemos de antemano cuántas páginas tendremos que revisar, pero el proceso de revisión se repite de la misma manera una y otra vez.
Para realizar acciones repetitivas, necesitamos los ciclos. Cada repetición se llama iteración.
Supongamos que queremos escribir un método que imprima en pantalla todos los números del 1 al número que se especifica como parámetro:
App.printNumbers(3);
// 1
// 2
// 3
No podemos implementar este método con los conocimientos que ya tenemos, ya que no sabemos de antemano cuántas veces se imprimirá en pantalla. Pero con los ciclos, esto no es un problema:
public static void printNumbers(int lastNumber) {
// i es una abreviatura de "índice"
// Se utiliza por convención en muchos lenguajes como contador del ciclo
var i = 1;
while (i <= lastNumber) {
System.out.println(i);
i = i + 1;
}
System.out.println("finished!");
}
App.printNumbers(3);
1 2 3 finished!
https://replit.com/@hexlet/java-basics-while
En el código del método se utiliza el ciclo while
. Está compuesto por tres elementos:
- La palabra clave
while
. Aunque se parece a una llamada a un método, no lo es. - El predicado es una condición que se especifica entre paréntesis después de
while
y se evalúa en cada iteración. - El cuerpo del ciclo es un bloque de código entre llaves, similar a un bloque de código en un método. Todas las constantes o variables definidas dentro de este bloque solo serán visibles dentro de él.
La construcción se lee de la siguiente manera: "haz lo que se especifica en el cuerpo del ciclo mientras la condición i <= lastNumber
sea verdadera". Veamos cómo funciona este código para la llamada App.printNumbers(3)
:
// Se inicializa i
var i = 1;
// El predicado devuelve true, por lo que se ejecuta el cuerpo del ciclo
while (1 <= 3)
// System.out.println(1);
// i = 1 + 1;
// Se termina el cuerpo del ciclo, por lo que se vuelve al principio
while (2 <= 3)
// System.out.println(2);
// i = 2 + 1;
// Se termina el cuerpo del ciclo, por lo que se vuelve al principio
while (3 <= 3)
// System.out.println(3);
// i = 3 + 1;
// El predicado devuelve false, por lo que la ejecución continúa después del ciclo
while (4 <= 3)
// System.out.println("finished!");
// En este punto, i es igual a 4, pero ya no lo necesitamos
// El método finaliza
Lo más importante en un ciclo es su finalización, es decir, salir del ciclo. El proceso que genera el ciclo debe detenerse en algún momento. La responsabilidad de detenerlo recae completamente en el programador.
Por lo general, la tarea se reduce a introducir una variable llamada contador del ciclo. Funciona de la siguiente manera:
- Primero, se inicializa el contador, es decir, se le asigna un valor inicial. En el ejemplo anterior, el contador es la instrucción
var i = 1
, que se ejecuta antes de entrar al ciclo. - Luego, en la condición del ciclo, se verifica si el contador ha alcanzado su valor límite.
- Finalmente, el contador cambia su valor
i = i + 1
Los principiantes cometen la mayoría de los errores en este punto. Supongamos que hay un error en la verificación del predicado. Esto puede llevar a un bucle infinito, una situación en la que el ciclo se ejecuta indefinidamente y el programa nunca se detiene.
En ese caso, tendríamos que detenerlo forzosamente:
public static void printNumbers(int lastNumber) {
var i = 1;
// Este ciclo nunca se detendrá
// y siempre imprimirá el mismo valor
while (i <= lastNumber) {
System.out.println(i);
}
System.out.println("finished!");
}
En algunos casos, los bucles infinitos son útiles. No los estamos considerando aquí, pero es útil ver cómo se ve este código:
while (true) {
// Hacer algo
}
En resumen, ¿cuándo se necesitan los ciclos y cuándo se pueden evitar? No se pueden evitar los ciclos cuando el algoritmo para resolver un problema requiere la repetición de ciertas acciones y no se conoce de antemano la cantidad de operaciones necesarias. Esto fue evidente en el ejemplo del libro que vimos al comienzo de la lección.
Tarea
Modifica el método printNumbers()
para que imprima los números en orden descendente. Para lograrlo, debes comenzar desde el límite superior y contar hacia abajo. Esto significa que el contador debe inicializarse con el valor máximo, y dentro del cuerpo del ciclo, debes decrementarlo hasta alcanzar el límite inferior.
Ejemplo de llamada y salida:
printNumbers(4);
4
3
2
1
finished!
¿El ejercicio no pasa la prueba, qué debo hacer? 😶
Si te quedaste atascado, es el momento perfecto para hacer una pregunta en las "Discusiones".
* Asegúrate de incluir la salida de las pruebas. Sin ella, es casi imposible entender qué está mal, incluso si muestras tu código. Los programadores tienen dificultades para ejecutar el código en su mente, pero casi siempre es posible entender a dónde mirar a partir del error que recibiste.
Mi código funciona en mi entorno, pero no aquí 🤨
Las pruebas están diseñadas de manera que verifican la solución de diferentes maneras y con diferentes datos. A menudo, una solución funciona con ciertos datos de entrada pero no con otros. Para entender este punto, revisa la pestaña "Pruebas" y presta atención a los mensajes de error, que suelen contener pistas.
Mi código es diferente a la solución del profesor 🤔
Esto es normal 🙆. En programación, una tarea puede tener muchas soluciones diferentes. Si tu código pasa la prueba, cumple con los requisitos de la tarea.
En raras ocasiones, la solución puede estar ajustada para pasar las pruebas, pero esto suele ser evidente.
Leí la lección, pero no entendí nada 🙄
Crear materiales de aprendizaje comprensibles para todos es bastante difícil. Hacemos nuestro mejor esfuerzo, pero siempre hay margen para mejorar. Si encuentras material que no entiendes, describe el problema en las "Discusiones". Es ideal si puedes formular los aspectos que no entiendes en forma de preguntas. Por lo general, necesitamos unos días para hacer mejoras.
Por cierto, tú también puedes contribuir a mejorar los cursos: en la parte inferior hay un enlace al código fuente de las lecciones, que se puede modificar directamente en el navegador.
Definiciones
Bucle While — una instrucción para repetir un bloque de código mientras se cumple una determinada condición.