miércoles, 14 de noviembre de 2018

Estructuras de control: bucles for

Un bucle permite ejecutar un bloque de código de forma repetida y controlada. Cada ejecución del código del bloque del bucle se denomina iteración.

Un bucle comienza con la sentencia for, y para controlar las iteraciones del bucle utilizamos una variable a modo de iterador, la cual se declara y se inicializa con un valor inicial. Después, se indica una condición que, mientras se cumpla, se ejecutará el bloque de código del bucle. Para que la variable cambie de valor en cada iteración, debe haber una asignación diferente, normalmente un incremento o un decremento.

Después de definir los parámetros de control del bucle, se especifica el código que ejecutará el bucle, encerrado entre llaves.

El siguiente ejemplo visualiza en pantalla una tabla de multiplicar, cuyo multiplicador va del 1 al 10:

  var tabla int = 2

  for i := 1; i <= 10; i++ {
    fmt.Printf("%d x %d = %d\n", tabla, i, tabla*i)
  }

La variable i es el iterador del bucle. El iterador va cambiando de valor en cada iteración, mientras se cumpla la condición. Cuando deje de cumplirse la condición, se saldrá del bucle. En este caso, el iterador comienza con el valor 1. En cada iteración, el iterador se incrementará. Mientras el iterador sea menor o igual que 10, se irá ejecutando. Pero cuando llegue al valor 11, saldrá del bucle.

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
2 x 10 = 20

El siguiente ejemplo realizará una cuenta atrás, desde 100 hasta 0, de dos en dos:

  for i := 100; i >= 0; i-=2 {
    fmt.Printf("%d, ", i)
  }

También podemos anidar bucles, es decir, definir y ejecutar un bucle dentro de otro. En el siguiente ejemplo, vamos a visualizar las tablas de multiplicar del 1 al 10, cada una de las tablas tendrá un multiplicador del 1 al 10:

  for x := 1; x <= 10; x++ {
    for i := 1; i <= 10; i++ {
      fmt.Printf("%d x %d = %d\n", x, i, x*i)
    }
  }

Bucles for Vs bucles while

Go no contempla bucles while como en otros lenguajes de programación. Sin embargo, es posible utilizar un bucle for de la misma manera a como se utiliza un bucle while

  var tabla int = 2
  var i int = 1

  for i <= 10 {  // while i <= 10
    fmt.Printf("%d x %d = %d\n", tabla, i, tabla*i)
    i++
  }

El iterador (variable i se declara e inicializa antes del bucle. En la declaración del bucle definimos únicamente la condición del bucle. Mientras (while) se cumpla la condición, el bloque de código se repetirá. Por último, dentro del bloque debe haber algo que cambie el valor del iterador, para poder llegar a incumplir la condición y salir del bucle. En este caso, es el incrementador (i++)

Sentencias break y continue

En los ejemplos vistos anteriormente, los bucles siguen una lógica lineal, es decir, que su ciclo de vida está ya definido y se puede predecir. Sin embargo, puede haber ocasiones en las cuales no sabremos cuándo hay que salir del bucle (puede ser en la primera iteración o en la número mil millones), o bien, podemos querer dejar de ejecutar el código del bucle y empezar una nueva iteración.

La sentencia break permite romper la iteración del bucle, saliendo directamente de él.

La sentencia continue deja de ejecutar el código del bucle, saltando directamente al inicio del bucle e iniciando una nueva iteración.

En el siguiente ejemplo vamos a crear un bucle infinito (no hay condición o la condición no se cumple nunca). Dentro de cada iteración va a solicitar al usuario que introduzca una palabra. Si la longitud de la palabra es menor de cinco caracteres se irá al inicio del bucle, omitiendo el resto del código del bucle e iniciando una nueva iteración. Si la longitud es mayor o igual de cinco caracteres, mostrará el mensaje "Tu palabra es: ", y repetirá la palabra introducida. Si la palabra introducida es "ok" (minúsculas) o "OK" (mayúsculas), saldrá del bucle.

  var palabra string

  fmt.Println("Escribe una palabra que la repito")
  fmt.Println("Para salir, escribe 'OK'")

  // Bucle infinito
  for {
    fmt.Print("Dame palabra > ")
    fmt.Scanln(&palabra)

    if palabra == "OK" || palabra == "ok" {
      break   // Sale del bucle
    } else if len(palabra) < 5 {
      continue // Inicio del bucle
    } else {
      fmt.Println("   Tu palabra es: ", palabra)
    }
  }

  fmt.Println("*** Fin del bucle ***")

El resultado es el siguiente:

Escribe una palabra que la repito
Para salir, escribe 'OK'
Dame palabra >  ratón
   Tu palabra es:  ratón
Dame palabra >  hola
Dame palabra >  vaso
Dame palabra >  mano
Dame palabra >  ordenador
   Tu palabra es:  ordenador
Dame palabra >  teléfono
   Tu palabra es:  teléfono
Dame palabra >  ok
*** Fin del bucle ***

Enlaces de interés

No hay comentarios:

Publicar un comentario