Curso básico de Java - #7 - Modificadores del flujo: Bucles

Buenas,
Este tema tratara sobre los elementos de control del flujo de ejecución de repetición, o mas comúnmente llamados bucles.

Estos bucles nos permiten repetir la ejecución de un bloque de código, normalmente según una condición (valor booleano) o un volumen de datos.


While
Este bucle contiene un bloque de código el cual se ejecutara según un valor booleano.
El ciclo del bucle es el siguiente:

  1. Comprobar la condición/valor booleano del bucle.
  2. Si el resultado es true, ejecutar el bloque de código.
    Si el resultado es false, terminar el bucle y seguir con el programa.
  3. Si se ha ejecutado el bloque de código, volver al punto 1.
Sintaxis
while([valor booleano])
{
    // Bloque de codigo.
}
Ejemplo contar hasta 10
int num = 0;  // Declara e inicializa num a 0.

// Mientras num sea menor que 10 el bucle se repetirá.
while(num < 10)
{
    num++;  // Incrementa num en 1.
    System.out.println(num);  // Imprime num.
}
Ejemplo adivina el numero
Scanner entrada = new Scanner(System.in);  // Declara e inicializa objeto scanner.
int num = 0;  // Declara e inicializa num a 0.

// Mientras num sea diferente que 7 el bucle se repetirá.
while(num != 7)
{
    // Le pide y recoge un nuevo valor para num.
    System.out.print("Adivina el numero: ");
    num = entrada.nextInt();
}

// El bucle termina y felicita al usuario por adivinar el numero.
System.out.println("¡Muy bien!");

Do - while
Este bucle es muy parecido al bucle while, de ahí que compartan el nombre.
Lo único que cambia es cuando se ejecuta la condición para seguir el bucle; mientras que en el while se ejecuta al principio del bucle, antes de ejecutar el bloque de código, en el do - while se ejecuta al final de este, siendo así que el bloque de código se ejecutara por lo menos una vez antes de la decidir si el bucle seguirá o no.

Muchas veces se podrá llevar a cabo el mismo proceso con estas dos estructuras.

Sintaxis
do
{
    // Bloque de codigo.
} while([valor booleano]);
Ejemplo
Scanner entrada = new Scanner(System.in);  // Declara e inicializa objeto scanner.
int num = 0;  // Declara e inicializa num a 0.

// Mientras num sea diferente que 7 el bucle se repetirá.
do
{
    // Le pide y recoge un nuevo valor para num.
    System.out.print("Adivina el numero: ");
    num = entrada.nextInt();
} while(num != 7);

// El bucle termina y felicita al usuario por adivinar el numero.
System.out.println("¡Muy bien!");


For
Este se suele usar para ejecutar un bloque de código un numero determinado de veces.
Es un poco mas complejo que while, porque en su declaración contempla la declaración de una variable, una condición y una acción que suele consistir en el decremento / incremento de la variable.
Suele usarse para casos como el ejemplo de contar hasta 10 que hemos visto con el bucle while.

Sintaxis
for([tipo] [variable] = [valor]; [condición/valor booleano]; [acción])
{
    // Bloque de código.
}
Ejemplo contar hasta 10
/* Declaramos el contador i con el valor 1.
 * Mientras el contador sea menor o igual a 10 seguiremos ejecutando el bucle.
 * En cada ejecución incrementaremos el contador en 1.
 */
for (int i = 1; i <= 10; i++)
{
    System.out.println(i);  // Imprime el valor de i.
}

Normalmente se usa una variable int para controlar el numero de ejecuciones, pero no tiene porque, veamos este otro ejemplo con String:

Ejemplo con String
for (String s = ""; s.length() < 10; s+= "*")
{
	System.out.println(s);
}

Output:

*
**
***
****
*****
******
*******
********
*********

For - Each
Como su nombre indica, es muy similar a la estructura for, solo que nos despreocupamos de tener que declarar un contador, crear una condición y una acción.
Se suele usar para recorrer listas, arrays
En la declaración del for each se declara una variable del mismo tipo que la lista a recorrer y luego se proporciona la lista.
En esa variable se almacenara el valor que lea de la lista en esa “vuelta”,

Sintaxis
for ([tipo] [variable] : [lista])
{
    // Bloque de codigo.
}
Ejemplo recorrer un array
int [] numeros = {1, 2, 3, 4};  // Declarar e inicializar array.

for (int i : numeros) // Recorrer array y en cada vuelta guardar el siguiente valor en i.
{
    System.out.println(i); // Imprimir el valor de esa vuelta.
}

Output:

1
2
3
4
Ejemplo recorrer una matriz
// Declarar e inicializar matriz.
int [][] numeros = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

for (int[] i : numeros) // Recorrer filas de la matriz y guardarlas en el array i.
{
    for (int j : i) // Recorrer el array i y guardar los valores en j.
    {
        System.out.print(j + " ");  // Imprimir valores.
    }

    System.out.print('\n'); // Al terminar de recorrer una linea imprimir un salto de linea.
}

Output:

1 2 3 4 
5 6 7 8 
9 10 11 12 

Ejemplo con lo aprendido
Veamos el mítico juego de adivinar un numero mediante pistas:

AdivinaElNumero.java
import java.util.Scanner;

/* Clase Principal.*/
public class AdivinaElNumero
{
	/*Metodo principal.*/
	public static void main(String[] args)
	{
		// Decalrar variables necesarias.
		Scanner   entrada    = new Scanner(System.in);
		boolean   adivinado  = false;
		final int numSecreto = 7;
		int       numUsuario;
		int       intentos   = 0;
		
		// Bucle do - while. Se ejecutara mientras que adivinado sea false (porque invertimos su valor con !).
		do
		{
			// Pedir y recoger el numero del usuario.
			System.out.print("> Adivina el numero: ");
			numUsuario = entrada.nextInt();
			
			intentos++;  // Incrementamos el numero de intentos en 1.
			
			/* if: Decidir que hacer con el numero.*/
			if (numSecreto > numUsuario)  // Si el numero secreto es mas grande que el del usuario le daremos la pista "Mas arriba".
			{
				System.out.println("  !> Mas arriba.");
			}
			else if (numSecreto < numUsuario)  // Si el numero secreto es mas pequeño que el del usuario le daremos la pista "Mas abajo".
			{
				System.out.println("  !> Mas abajo.");
			}
			else  // Si no se cumple ninguna de las condiciones anteriores podemos suponer que el numro del usuario es el mismo que el numero secreto.
			{
				System.out.println();  // Salto de linea. cumpliria la misma funcion el caracter '\n'.
				System.out.println("> ¡Muy bien! El numero secreto era " + numSecreto + ".");  // Felicitar al usuario.
				System.out.println("> Numero de intentos: " + intentos + ".");  // Imprimir el numero de intentos del usuario.
				adivinado = true;  // Actualizar el valor de adivinado para poder salir del bucle.
			}
			
		} while (!adivinado);
		
		entrada.close(); // Cerrar el objeto Scanner.
		
	}
}
Output de ejemplo
> Adivina el numero: 20
  !> Mas abajo.
> Adivina el numero: 10
  !> Mas abajo.
> Adivina el numero: 2
  !> Mas arriba.
> Adivina el numero: 5
  !> Mas arriba.
> Adivina el numero: 7

> ¡Muy bien! El numero secreto era 7.
> Numero de intentos: 5.

En el siguiente tema veremos los elementos de control break, continue, return y throw, centrandonos principalmente en break y continue.

1 me gusta