Las estructuras de control deciden qué líneas se ejecutan y cuántas veces. Sin ellas, un programa solo puede hacer una lista fija: siempre las mismas cuentas, en el mismo orden, sin reaccionar a la luz. El avisador existe precisamente porque el camino HIGH y el camino LOW no se ejecutan a la vez. El si es la estructura de esa exclusión. El mientras y el para son las estructuras de la repetición.
La condición se evalúa una vez por llegada al si. Si es verdadera, se ejecuta el bloque de dentro hasta el si no o hasta el fin. Si es falsa y hay si no, se ejecuta el otro bloque. Si es falsa y no hay si no, no se ejecuta nada y se sigue detrás del fin. Los dos bloques no se ejecutan nunca en la misma pasada. Por eso el LED no puede recibir HIGH y LOW a la vez desde un solo si bien escrito: las dos asignaciones viven en caminos distintos.
Se pueden anidar. Un si dentro de otro sirve cuando la segunda pregunta solo tiene sentido si la primera fue sí: si hay poca luz, y además el pulsador de silencio no está pulsado, entonces HIGH. Si anidas por costumbre, el programa se vuelve una escalera ilegible. Dos preguntas independientes pueden ser dos si seguidos, no uno dentro de otro. Dibújalo: si los rombos no dependen, no se meten.
mientras condición … fin repite el cuerpo mientras la condición siga siendo verdadera. En algún lugar del cuerpo, o en un dato que el cuerpo espera, esa condición tiene que poder volverse falsa. Si no cambia nada de lo que la condición mira, el bucle no termina. El laboratorio corta a las doscientas vueltas y lo dice. En una placa, ese bucle se come el loop y el LED deja de atender el sensor: no hay un mensaje de error, hay un aparato sordo. Por eso la traza de un mientras se hace con pocas vueltas en el cuaderno, tres o cuatro, antes de soltarlo.
para i = 1 hasta 4 … fin es la repetición contada. i toma 1, 2, 3 y 4, en ese orden, y el cuerpo se ejecuta una vez por valor. El índice se declara solo con el para: no hace falta un let previo. Úsalo cuando sepas cuántas vueltas son: los cuatro primeros enteros, o los índices de un vector en la lección siguiente. No uses para si la salida depende de un sensor que puede tardar una lectura o veinte. Ahí el mientras dice mejor la verdad, o el loop de la placa, que ya es el mientras de fondo.
Trazar es escribir el valor de las variables después de cada paso interesante, no «ejecutar mentalmente» de un vistazo. Para el para de suma, la tabla es corta:
antes: suma = 0
i = 1: 0 + 1 = 1
i = 2: 1 + 2 = 3
i = 3: 3 + 3 = 6
i = 4: 6 + 4 = 10 Si tu cabeza dijo 16, sumaste mal o contaste una vuelta de más. El laboratorio no sustituye esa tabla: la confirma. Quien no puede hacer la tabla con cuatro vueltas tampoco entenderá el error cuando el vector tenga cuarenta.
if (luz < UMBRAL) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); es el si. for (int i = 0; i < 4; i++) acumula igual que el para, con la diferencia de que el índice en C++ suele escribirse con el incremento dentro del paréntesis. while (n < 3) n = n + 1; es el mientras. Dentro de loop, meter otro mientras que espere «hasta que amanezca» bloquea el resto de lecturas. Si necesitas esperar, en un sketch serio se mira millis y se sigue; en este curso basta con no poner un bucle de espera infinito y saber por qué.
El interruptor entra como una condición más. Puedes exigirlo con un si anidado o con una condición compuesta: luz < 500 && pulsador == 0. && exige las dos cosas. || exige una. ! niega. No hace falta memorizar una tabla enorme: prueba dos combinaciones en el editor, ON y OFF, y lee el pin resultante. Eso es una traza de control, no un ensayo de hardware.
si. Ejecuta un camino si la condición es verdadera.
si no. El camino contrario. Opcional, nunca simultáneo.
fin. Cierra el bloque. El intérprete lo necesita para saber el alcance.
mientras. Repite mientras la condición sea verdadera. Tiene que poder acabar.
para. Repite un índice desde un número hasta otro, incluidos.
Índice. La variable del para. En los vectores, además, señala una casilla.
Traza. Tabla de valores paso a paso. Es una herramienta, no un adorno de la memoria.
&&. Y lógico. Las dos condiciones tienen que cumplirse.
Anidar. Un si dentro de otro. Solo cuando la segunda pregunta depende de la primera.
Bloqueo. Un bucle que no deja volver a leer el sensor. En loop, deja el avisador sordo.
para i = 1 hasta 4 con suma = suma + i da 10, no 4 y no 16.
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10 16 sería sumar otra vez o usar el índice mal. La tabla de cuatro filas lo zanja.
Si solo escribes el camino HIGH, una luz de 800 no toca el pin. El pin se queda en lo que valiera antes, que puede ser HIGH de una lectura anterior. El si no con LOW deja el estado definido en los dos casos.
mientras n < 3 sin una línea n = n + 1. El laboratorio corta el bucle. En la placa no habría ese corte amable.
Cada caso es una entrega del avisador del patio del IES Duero (Aranda de Duero). Lee la situación antes de la decisión.
Situación. El grupo copia cuatro si, uno por cada número del cuaderno.
No conviene. Porque «así se ve» cada hora.
Decisión. Un solo si con la variable luz, y los cuatro números se prueban cambiando la entrada.
Por qué: Cuatro si, uno por cada número del cuaderno, no son un algoritmo: son cuatro resultados pegados. Mañana la lectura es otra y el programa no sirve. Un solo si con la variable luz cubre las horas que todavía no has medido.
Situación. para i = 1 hasta 1000000 para «asegurarse».
No conviene. Porque el ordenador puede.
Decisión. Trazar cuatro vueltas y dejar el hasta en el número que de verdad mide el problema.
Por qué: Un para hasta un millón «para asegurarse» esconde que no sabes cuántas vueltas hacen falta y llena la traza de ruido. El ordenador puede, y eso no justifica el límite. Se trazan las cuatro vueltas reales y el hasta se deja en ese número.
Situación. while (luz >= 500) { luz = analogRead(A0); } antes de atender otra cosa.
No conviene. Porque así «no hace nada» hasta que oscurece.
Decisión. Leer una vez por vuelta de loop y decidir HIGH o LOW cada vez, sin atrapar el control.
Por qué: Un mientras que espera a que la luz baje, antes de atender otra cosa, puede no regresar. El avisador tiene que poder apagarse cuando la luz vuelva, en la vuelta siguiente del loop. Se lee una vez por vuelta y se decide, no se bloquea la espera.
Situación. La condición compuesta solo se ensaya con el interruptor encendido.
No conviene. Porque el caso interesante es el de noche.
Decisión. Probar las cuatro combinaciones de comparación y pulsador, aunque sea en una tabla de dos por dos.
Por qué: Una condición con && tiene cuatro casos si cada parte es sí o no. Ensayar solo con el interruptor encendido deja tres caminos a ciegas, aunque el caso de noche sea el interesante. Se prueban las cuatro combinaciones y se anota el LED de cada una.
El problema no cambia: si la luz del patio del IES Duero baja de 500, hay que avisar. Cambia quién ejecuta. El pseudocódigo lo ejecuta el laboratorio de esta página. El sketch lo compilaría el IDE de Arduino hacia la UNO. El fragmento de Python lo ejecutaría una Raspberry Pi con gpiozero, si hubiera placa. Aquí no hay placa.
suma acaba en 10. n acaba en 3. El si solo escribe si la traza del para es la correcta.
let suma = 0
para i = 1 hasta 4
suma = suma + i
fin
si suma == 10
escribe "traza bien"
fin
let n = 0
mientras n < 3
n = n + 1
fin
El for incluye el incremento en la cabecera. El if/else es el si/si no. El pin 13 no se escribe en los dos caminos a la vez.
int suma = 0;
for (int i = 1; i <= 4; i++) {
suma = suma + i;
}
int luz = analogRead(A0);
if (luz < 500) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
El while de Python usa sangría en lugar de fin. El pseudocódigo del laboratorio usa fin para que la sangría no sea el único cierre.
n = 0
while n < 3:
n = n + 1
# No envuelvas led.on() en un while True
# sin una lectura nueva: bloquearías el aviso.
| Vuelta | i | suma después |
|---|---|---|
| antes | — | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 3 | 6 |
| 4 | 4 | 10 |
Incluye el 4. El resultado 10 es el que tiene que aparecer en el entorno al ejecutar el ejemplo. Si el canvas muestra otra suma, no es «un redondeo»: es otro bucle.
| Hora | luz | ¿Entra el sí? | Pin |
|---|---|---|---|
| 17:30 | 420 | sí | HIGH |
| 17:32 | 510 | no | LOW |
| 17:35 | 390 | sí | HIGH |
| 17:41 | 600 | no | LOW |
| 17:48 | 500 | no | LOW |
| 18:02 | 250 | sí | HIGH |
| 18:15 | 880 | no | LOW |
| 18:27 | 499 | sí | HIGH |
Misma estructura de si, ocho entradas. No escribas ocho programas.
Haz la tabla del para en el cuaderno antes de pulsar Ejecutar. Si coincide, ya sabes leer un bucle pequeño. Si no coincide, no cambies el programa para que cuadre con tu intuición: cambia la tabla o encuentra la vuelta que te sobra. El laboratorio es el árbitro, no el atajo.
Prueba un si anidado con el interruptor. Primera pregunta: luz < 500. Segunda, solo en el sí: pulsador == 0. Con OFF (pulsador 0) y luz 420 tienes que obtener HIGH. Con ON tienes que obtener el otro camino, el del silencio. Son dos trazas, no una.
Cuando el índice de un para se use para mirar un vector, el hasta tendrá que ser la longitud menos uno. Esa frase es la puerta de la lección siguiente. Si hoy tu para va de 1 a 4 sobre cuatro personas, mañana sobre cuatro casillas numeradas desde 0 se te caerá una.
| Criterio | Aún no | En proceso | Conseguido | Notable |
|---|---|---|---|---|
| si | Un solo camino | si sin fin | si, si no, fin | Caso igual al umbral en el camino correcto |
| para | No sabe el índice | Vueltas de más | Tabla 1, 3, 6, 10 | Predice el resultado antes de ejecutar |
| mientras | No termina | Termina de casualidad | La condición cambia en el cuerpo | Explica el corte de seguridad |
| Traza | No hay tabla | Tabla a medias | Coincide con el laboratorio | Incluye ON y OFF del pin |
| Placa | Copia sin mirar | Solo el if | if, for y el riesgo del while en loop | No bloquea la lectura del sensor |
El si elige un camino. El para cuenta. El mientras repite mientras pueda acabar. La traza de cuatro filas vale más que ejecutar diez veces sin mirar.
Abre cada pregunta, responde en el cuaderno y después mira la solución. El párrafo «Por qué» es la parte que se estudia.
Respuesta. Vale 10.
Por qué: Las vueltas suman 1, luego 2, luego 3 y luego 4.
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
Si obtuviste 6, te dejaste la última vuelta: 1 + 2 = 3 y 3 + 3 = 6.
Si obtuviste 15, empezaste en 0 mal o llegaste hasta 5: 10 + 5 = 15. La tabla no perdona el «más o menos».
Respuesta. Porque el programa ha dejado de leer y ya no puede apagar, o ni siquiera ha llegado a la línea de apagar.
Por qué: Estable no es correcto. Un avisador sordo coincide a veces con el estado que esperabas y engaña. El laboratorio corta ese bucle precisamente para que no confundas un cuelgue con una decisión.
Respuesta. Si solo hay una lectura por vuelta, el for no aporta y estorba la lectura.
Por qué: El for tiene sentido para recorrer varias casillas o repetir una cuenta. Usarlo como sinónimo de «esto es programación» añade un índice que nadie traza. loop ya es el ritmo del controlador.
En la vida real
Escribes y dibujas aquí mismo: no hay salto a otro módulo. La misma herramienta, a pantalla completa, está en l26-estructuras-de-control.html y en el marco (útil si el navegador permite file:// en iframes).
Escribe un para que acumule del 1 al 4 y, antes de ejecutar, anota en el cuaderno la suma que esperas. Ejecuta y confronta. Añade un si / si no que ponga el pin en HIGH o LOW según un umbral, y pruébalo con el interruptor en los dos estados si tu condición lo usa. Una buena entrega incluye la tabla escrita, no solo la captura del canvas.
reto_id: bach1-tic-L26