inicio | documentación | contacto
Version para imprimir Imprimir
Inicio » Documentación Estructuras de flujo
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-until el 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 bucles while-enddo el 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-enddo se ejecuta mientras que la condición sea verdadera.
    • El código de repeat-until se ejecuta mientras que la condición sea falsa.
Ejemplo, recorrer los elementos de listas con while y repeat:
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.

Ejemplo:
Iterar una lista
Código con foreach-endforCó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 
Última modificación: miércoles 14 de mayo de 2008 15:33:15
Fecha de creación: viernes 2 de noviembre de 2007 11:15:48
Categorías: Estructuras de flujo
Fundamentos