Iterando con un contador

BRIAN, why does this page exist? Can we please cut it for repo hygiene? --MF, 8/6/19

PG: Pink box has too many unclear things to be clear. "The FOR block lets you not only repeat, but count the repetitions and /use/ that number to vary the repetitions." Or something.

BH: Hmm, here we have a FOR variable. We should think about whether we can avoid the name "variable" and call it, I don't know, a procedure output?

En esta página vas a realizar iteraciones para repetir y contar las repeticiones con el objetivo de usar un contador para dibujar formas con patrones repetidos.
spiral nested squares

Ya conoces las siguientes formas de repetir un grupo de comandos:

: Iteración
AAP-2.J.1

Los científicos de la computación definen una estructura de programa repetitivo como un ciclo, repetición, o iteración.

AAP-2.K.1

El código puede repetirse por siempre, un número específico de veces (al usar repetir), o bien hasta que una condición específica se cumpla (por ejemplo al usar repetir hasta que como se presentará en el Laboratorio 5).
repeat (4) (move (100), turn clockwise (90)) repeat until (touching (Leader)?)
{
    point towards (Leader)
    move (1) steps
}

Algunas veces el código dentro de un ciclo necesita saber en que iteración se encuentra (primera, segunda, etc.). Se puede usar el bloque for(i)=(1) to (10){} para llevar el control, y se puede usar su contador en el código a repetir (está representado por defecto por la letra "i" i). Por ejemplo, el bloque para brinda la oportunidad de simplificar un código largo como el siguiente:
say (1) for (2) secs, say (2) for (2) secs, say (3) for (2) secs... say (10) for (2) secs       en for (i)= (1) to (10) {say (i) for (2) secs}

Cada vez que el bloque para ejecuta el código en su interior, incrementa el valor del contador en 1, empezando con el primer valor y terminando en el último valor que aparece (en el ejemplo el 10).

  1. Haz clic en el menú "Archivo" File menu icon en la barra superior de la ventana de Snap y selecciona la opción "Importar..."
  2. El bloque para define un nombre de contador predeterminado, i (letra i de índice). Se puede cambiar este nombre de variable haciendo clic sobre él. Para usar el contado, arrástralo a la ubicación requerida.
  3. Construye el siguiente código que hace que el personaje diga los números del 1 al 10.
    for (i) = (1) to (10) {say (i) for (2) secs}
    1. Luego modifica el código para que el personaje diga 0, 2, 4, 6, 8, ... hasta 30.
    2. Discute tu solución con tu compañero.
  4. Experimenta con espirales.
    1. Construye el siguiente código y pruébalo:
      Este diseño recibe el nombre "cuadriral" porque es un caudrrado espiral.
      pen down; for(length)=(1) to (100){move(2Xlength) steps; turn clockwise (90) degrees}
    2. Talk with Your Partner Asegúrate de poder explicar la razón por la que el "cuadriral" se dibjua hacia afuera.
    3. Intenta cambiar el orden de 100 y de 1 en el bloque para en el código previo. ¿Cuál es el resultado?
    4. Intenta cambiar el ángulo de vuelta en el código a otros valores, por ejemplo 92, 126, etc.
    5. Cambia los valores dentro de turn y move para obtener un resultado más parecido a un espiral normal similar a:
      spiral
  5. "U1L3-Squiral"Save your work as U1L3-Squiral
  6. Abre el proyecto U1L3-Pinwheel. Construye un bloque cuadrados anidados que haga uso de los bloques para y polygon para dibujar cuadrados anidados. Proporciona un valor de entrada que dibuje número de cuadrados a especificar, con cada cuadrado más grande que el anterior:
    nested squares
  1. Construye el bloque polígonos anidados que reciba el campo de entrada número de polígonos y número de lados para los polígonos a dibujar.
  2. Construye un programa que dibuje 12 polígonos regulares, cada uno con un lado más que el polígono anterior, ver el ejemplo a continuación.
    polygons: triangle through decagon
  3. Predice el comportamiento del código que se presenta a continuación antes de ejecutarlo:
    for (tens) = (0) to (9){ for (ones) = (0) to (9){ say (join (tens) (ones)) for (0.3) secs}}
  4. Construye un programa que cuente descendientemente números del 100 al 0, de 10 en 10 (esto es, 100, 90, 80, etc.).
  5. Abajo se encuentran dos animaciones que hacen uso del código pinwheel con campos de entrada. Encuentra la forma de crear tus propias animaciones artísticas.
    Array of pinwheels animation Pinwheel wreath animation

    El código que se presenta a continuación puede darte la idea de cómo crear animaciones. Debes asegurarte de remover los bloques wait 0.5 secs que se encuentra en el código pinwheel para evitar que lo haga más lento. El bloque warp permite dibujar el molinillo de inmediato.

    forever{for(i)=(0) to (50){clear;warp{pinwheel, branches:(12) size:(50) backup:(i)}}}
Albers-style nested squares       Albers-style nested squares       Albers-style nested squares       Albers-style nested squares
  1. Encuentra la forma de usar el bloque para con el objetivo de enlazar cuadrados de la forma que se presenta en las imágenes. Construye un bloque con dos campos de entrada que permitan especificar la cantidad de cuadrados que contendrá la pintura y qué tan grande será el cuadrado actual en relación al anterior.
    Tough Stuff Cuadrados concéntricos
painting-by-Josef-Albers

A la derecha se despliega una pintura de Josef Albers. Él estaba interesado en experimentar con una variación de colores, dentro de la "familia" del colores similares. Snap! permite hacer experimentos similares.

  1. ¿Cuál es el color favorito del autor para esta actividad?
  2. En el caso que no hayas comletado la actividad basada en el trabajo de Kazimir Malevich: entonces debes leerla ahora para aprender las funcionalidades de Snap! para rectángulos sólidos y familia de colores.
  3. Muy bien, ahora entremos en detalles.
    Aleatoriedad: Los cuatro ejemplos que se presentan arriba son diferentes a la pintura de Albers en el sentido que incluyen colores ocasionales que no son de la misma familia. Esto puede hacer las pinturas más interesantes para alguien que no comparta el interés de Albers en diferencias nínimas de color. Demasiada aleatoriedad, puede en cambio, hacer la pintura menos interesante. Compara los ejemplos que se presentan arriba; a la izquierda uno de ellos está basado claramente en la familia naranja. Otro de ellos tiene colores en violeta, verde, naranja, un poco de caos en el que se presenta en cuarta posición. Revisa de nuevo el proyecto "Conversando" en el caso que no recuerdes la forma de elegir algo en especial una de cada seis veces, o una de catorce veces. Otras opciones aleatorias que se pueden tomar son el número de cuadrados, la cantidad que se reducirá el tamaño del mismo en comparación con el siguiente, la posición horizontal y vertical de uno de los cuadrados en relación al siguiente (la figura es más interesante en las que la posición es diferente, con el resultado que el cuardado más pequeño no se encuentra necesariamente en el centro).
  4. Tough Stuff Tough Stuff Tough Stuff ESte bloque es un cuadriral, pero en lugar de cambiar el valor de move, cambia el valor de turn:
    inspi repeat:(num) size:(size) angle:(angle) : for (i) = (1) to (num) {move (size) steps; turn ((i) * (angle)) degrees}
    1. Intenta dibujar el resultado posible con un ángulo de 2.
    2. A continuación construye el programa y prueba los siguientes valores:
      Es posible detener cada una de las pruebas con el botón "detener". stop button Es útil si estás seguro que nada nuevo pasará, ¡pero no te has decidido tan rápido!
      inspi with (1000,10,80), (1000,5,1), (1000,5,7), (1000,5,13), (1000,10,77)
    3. ¿Qué ha pasado? ¿Puedes formular una teoría para predecir la forma que se dibuja para un ángulo en particular?
      Pista: Piensa en la divisibilidad.