miércoles, 6 de junio de 2012

Bucles Anidados


Un bucle anidado es un bucle dentro de otro bucle. Así podemos tener varios
bucles anidados según lo que queramos hacer en nuestro programa.

Ejemplo: el caso de que quisiéramos crear todas las tablas de multiplicar del 1 al 10.

Tendríamos que hacer
1 x 1,1 x 2,1 x 3...1 x 10
2 x 1,2 x 2, 2 x 3...2 x 10
.
.
10 x 1,10 x 2,10 x 3.....10 x 10

El primer factor podría ser una variable que iría cambiando 1 al 10
y el segundo seria otra variable que iría cambiando del 1 al 10.

Con eso sabemos que tenemos las variables: factor1,factor2.
Con estas dos variables tenemos las suficientes para nuestro programa.
Podíamos tener una tercera para el resultado, pero no es realmente necesaria.
Usaremos el tipo de bucle que queramos,conociendo como es.

Definimos las variables:

Tipo entero: factor1,factor2

Para factor1 repetir de 1 hasta 10
        Para factor2 repetir de 1 hasta 10
                 Mostrar factor1 & “ * “ & factor2 & “ = “ & (factor1 * factor2)
        Fin Para
Fin Para

Un ejemplo típico de uso de los bucles anidados es con el uso de un array de varias
dimensiones. Si tuviéramos una pizarra en la que vamos a dibujar un punto, necesitaríamos
saber dos coordenadas. La x y la y. Si tuviéramos almacenados en un array estas coordenadas
tal que así:

coordenadas(x,y)

Para leer todas los datos del array coordenadas lo mas aconsejable es usar dos bucles.
Uno dentro del otro. Anidados

Así iríamos leyendo:

coordenadas(0,0),coordenadas(0,1),coordenadas(0,2)....
coordenadas(1,0),coordenadas(1,1),coordenadas(1,2)...
.
.
coordenadas(x,y)

Hasta llegar al ultimo valor almacenado en el array.

Podemos crear una rejilla. Para el uso de gráficas es fundamental.

Bien. Cuando queremos comentar algo en un programa Gambas usamos el símbolo “ ' “
Así una linea de comentario tendría una aspecto como esto.

' Esto es un ejemplo de comentario

En este código fuente que os pongo ahora. Veréis que en FORM_OPEN()
existen lineas comentadas. Cada linea llama a un procedimiento que ejecuta
un tipo distinto de bucle anidado. Como me interesa ver el resultado de uno
de ellos. Comento el resto y dejo solo uno para que se ejecute.

---código---

'Ejemplos de bucles anidados


Public Sub _new()

End

Public Sub Form_Open()

'bucle_repeat
'bucle_while
bucle_for 'Este es el que se ejecuta
'bucle_for_each

End

Public Sub bucle_for()

Dim a As Integer
Dim b As Integer

For a = 1 To 10 'Repetir de una a diez veces
      For b = 1 To 10 'Repetir de una a diez veces
            Print a & " * " & b & " = " & (a * b)
      Next
      Print 'Para dejar un espacio en blanco
Next

End

Public Sub bucle_dowhile()

Dim a As Integer
Dim b As Integer
a = 1
b = 1

Do While a <= 10 'Hacer mientras a sea mayor o igual a 10
      Do While b <= 10 'Hacer mientras a sea mayor o igual a 10
            Print a & " * " & b & " = " & (a * b)
            b = b + 1
      Loop
      Print
      b = 1
      a = a + 1
Loop

End

Public Sub bucle_repeat()

Dim a As Integer
Dim b As Integer
a = 1
b = 1

Repeat 'Repetir
      Repeat 'Repetir
             Print a & " * " & b & " = " & (a * b)
             a = a + 1
      Until (a > 10) 'Hasta que a sea mayor a 10
      Print 'Para dejar un espacio en blanco
      a = 1
      b = b + 1
Until (b > 10) 'Hasta que b sea mayor a 10

End

Public Sub bucle_for_each()

Dim tabla As Integer[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Dim a, b As Integer

For Each a In tabla ' Por cada numero entero en la tabla
       For Each b In tabla
             Print a & " * " & b & " = " & (a * b)
       Next
       Print 'Para dejar un espacio en blanco
Next

End

---código---

Aquí tenéis un ejemplo de la creación de una rejilla.
Puedes hacer click en las celdas que la forman.




Ejemplo de rejilla

2 comentarios:

  1. Muy bueno el ejemplo de regilla...se me ocurren muchas cosas que se pueden basar en el (realizar mapas de juegos :) )

    ResponderEliminar
  2. Perdona que no te contestase antes.La rejilla es vital en la mayoría de los juegos.Buscaminas,barcos,mapas.Como tu dices, se pueden hacer muchísimas cosas. :-)

    ResponderEliminar