Fundamentos
» Bucles
Bucles
Los bucles sirven para ejecutar un código indefinidamente basándose en que se cumpla o no una condición (una expresión booleana).
while-enddo
Este tipo de bucle ejecuta el código que tiene dentro mientras la condición se cumpla (si es verdadera, sigue ejecutando, si es falsa, para). Primero evalúa la condición y después ejecuta el código, por lo que es posible que el código nunca se ejecute si la condición es falsa la primera vez.
while condicion
// Este código se repetirá mientras que condición sea verdadera
enddo
Ejemplo: pintar los números del 1 al 10
def main
local x
x = 1
while x < 11
println x
x = x + 1
enddo
end
repeat-until
Este tipo de bucle ejecuta el código que tiene dentro hasta que la condición se cumpla (si es falsa, sigue ejecutando, si es falsa, para). Primero ejecuta el código y después evalúa la condición y, si es falsa, repite el bucle de nuevo. Dado que la condición se evalúa al final, el código sabemos que siempre se ejecutará, por lo menos, una vez.
repeat
// Este código se repetirá hasta la que condición sea verdadera (o mientras sea falsa)
until condición
Ejemplo: pintar los números del 1 al 10
def main
local x
x = 1
repeat
println x
x = x + 1
until x == 11
end
Diferencias entre while-enddo y repeat-until
- En los bucles tipo
repeat-untilel código se ejecuta siempre al menos una vez, ya que la condición se evalúa después de ejecutar el código. En los bucleswhile-enddoel código puede que no se llegue a ejecutar nunca (si la condición inicial es falsa la primera vez) - Las condiciones en los dos casos se evalúan justo al revés:
- El código de
while-enddose ejecuta mientras que la condición sea verdadera. - El código de
repeat-untilse ejecuta mientras que la condición sea falsa.
- El código de
def main
local listado, x
listado = {"Roberto", "Pedro", "Loreto", "Pablo"}
x = 0
| |
while x < listado.size
println listado[ x ]
x = x + 1
enddo
|
repeat
println listado[ x ]
x = x + 1
until x == listado.size
|
end | |
foreach : for
Es un bucle que sirve para recorrer listas de una manera cómoda. Ejecuta el código interno del bucle tantas veces como elementos tenga la colección a iterar. Además, asigna en una variable local el elemento que se esta iterando en ese momento.
La sintaxis es:
foreach variable : coleccion endfor
Donde variable es el nombre de una variable local definida dentro de la función. Y coleccion es la lista a iterar.
| Iterar una lista | |
|---|---|
Código con foreach-endfor | Código equivalente con while-enddo |
def main
local elemento, milista
milista = {"A", "B", "C", "D"}
foreach elemento : milista
println elemento
endfor
end
|
def main
local elemento, milista, x
milista = {"A", "B", "C", "D"}
x = 0
while x < milista.size
elemento = milista[x]
println elemento
x = x+1
enddo
end
|
La diferencia es clara: con while-enddo necesitamos una variable x adicional para el indice, la cual debemos incrementar en 1 en cada iteración del bucle. También necesitamos validar en cada iteración si este indice supera el tamaño de la lista (propiedad size). Con foreach-endfor todo esto es automático: simplemente tenemos cargada la variable elemento en cada iteración y no hace falta controlar cuando llegamos al final de la lista.
break
La instrucción break aborta la ejecución dentro de un bucle completamente, continuando la ejecución fuera del mismo. Sólo puede utilizarse dentro de un bucle while, repeat o foreach.
Normalmente, break y loop se utilizan bajo una condición. Por ejemplo, utilizando el ejemplo anterior que itera los elementos de una colección, vamos a efectuar una búsqueda de un elemento. Para ello, iteramos paso a paso todos los elementos de la colección y comparamos cada elemento con un valor que estamos buscando. Si es igual, rompemos el bucle con break y finalizamos la búsqueda.
def main
local numeros, abuscar, posicion, encontrado
numeros = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }
// Elemento a buscar
abuscar = 12
encontrado = false
posicion = 0
while posicion < numeros.size
if numeros[ posicion ] == abuscar
encontrado = true
break
endif
posicion = posicion + 1
enddo
if encontrado
println "Encontrado " + abuscar + " en la posicion " + posicion
else
println abuscar + " no encontrado"
endif
end
El resultado es:
Encontrado 12 en la posición 4
Nota: las posiciones de los elementos en las listas se cuentan desde 0, por lo que la posición 4 es la quinta posición, contando como 0 la primera y 4 la quinta.
loop
La instrucción loop se salta la la iteración o "vuelta" actual dentro de un bucle al inicio y empieza de nuevo. Esto no significa que el bucle finalice, sino que vuelve a empezar desde el principio, saltándose el código que hubiera después de la instrucción loop. Sólo puede utilizarse dentro de un bucle while, repeat o foreach.
def main
local frase, palabra, cantidad, letra
frase = {"el", "perro", "de", "san", "roque", "no", "tiene", "rabo"}
letra = "e"
cantidad = 0
foreach palabra : frase
// Solo nos interesan las palabras que contengan la letra
if !palabra.contains(letra)
// Así que si no tiene la letra, volvemos al principio del bucle
loop
endif
// Si llegamos hasta aquí, es que la palabra actual tiene la letra
cantidad = cantidad + 1
endfor
println "Se han encontrado " + cantidad + " palabras que contienen la '"+letra+"'"
end
El resultado es:
Se han encontrado 5 palabras que contienen la 'e'
Atajos para loop y break
Si solo necesitamos hacer loop o break en una condición determinada, podemos crear una condición en linea de la siguiente manera:
| loop condicional | equivale a: |
|---|---|
if condicion
loop
endif
|
loop if condicion |
| break condicional | equivale a: |
if condicion
break
endif
|
break if condicion |