Les vencimos

1º Bachillerato · TIC I

Lección 26 · C · Programación

Estructuras de control

1º Bachillerato · TIC I · Decreto 40/2022 CyL

Objetivos

  1. Escribir un si con si no y un fin, y trazar los dos caminos.
  2. Escribir un mientras que avance hacia su condición de salida.
  3. Escribir un para con inicio, fin e índice explícitos.
  4. Seguir una traza de pocas vueltas en el cuaderno y contrastarla con el laboratorio.
  5. Reconocer if, while y for en un sketch sin copiarlos a ciegas.

Explicación

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.

si, si no, fin

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

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

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

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.

En la placa

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.

Condición y bucle leer luz ¿luz < 500? HIGH volver
El si excluye caminos. El para cuenta vueltas. No hacen el mismo trabajo y no se dibujan igual.

Glosas de esta lección

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.

Ejemplos resueltos

Ejemplo 1 — Suma que cuenta de más

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.

Ejemplo 2 — si sin si no y LOW olvidado

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.

Ejemplo 3 — mientras que no avanza

mientras n < 3 sin una línea n = n + 1. El laboratorio corta el bucle. En la placa no habría ese corte amable.

Decisiones de aula

Cada caso es una entrega del avisador del patio del IES Duero (Aranda de Duero). Lee la situación antes de la decisión.

1. Un si para cada lectura fija

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.

2. para hasta el infinito

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.

3. Espera dentro de loop

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.

4. && sin probar el OFF

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 mismo avisador, en tres lenguajes

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.

Tres estructuras

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

En el sketch

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);

Cuidado con el while de la Pi

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.

Traza del para, fija

Vueltaisuma después
antes—0
111
223
336
4410

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.

Traza con las lecturas del patio

Horaluz¿Entra el sí?Pin
17:30420síHIGH
17:32510noLOW
17:35390síHIGH
17:41600noLOW
17:48500noLOW
18:02250síHIGH
18:15880noLOW
18:27499síHIGH

Misma estructura de si, ocho entradas. No escribas ocho programas.

Lectura guiada

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.

Errores que se repiten

Rúbrica de esta lección

CriterioAún noEn procesoConseguidoNotable
siUn solo caminosi sin finsi, si no, finCaso igual al umbral en el camino correcto
paraNo sabe el índiceVueltas de másTabla 1, 3, 6, 10Predice el resultado antes de ejecutar
mientrasNo terminaTermina de casualidadLa condición cambia en el cuerpoExplica el corte de seguridad
TrazaNo hay tablaTabla a mediasCoincide con el laboratorioIncluye ON y OFF del pin
PlacaCopia sin mirarSolo el ifif, for y el riesgo del while en loopNo bloquea la lectura del sensor

Mini cierre

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.

Comprueba

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.

1. ¿Cuánto vale suma después de para i = 1 hasta 4 con suma = suma + i, si suma empezó en 0?

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».

2. ¿Por qué un mientras que no modifica nada de su condición es un error aunque el LED «se quede encendido» y parezca estable?

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.

3. En loop ya hay una repetición. ¿Para qué meter otro for que lee el sensor una sola vez por vuelta?

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

Castilla y León, sin servidor

  • El horario del instituto es un para: de la 1ª a la 6ª, índice conocido. El recreo no se alarga con un mientras sin condición.
  • En el claustro, «si llueve» tiene si no aunque nadie lo escriba: se sale al patio o no se sale. En el programa, el si no hay que escribirlo.
  • Un semáforo en ámbar intermitente que no vuelve a consultar el sensor es el mientras bloqueado: parece que decide y solo repite.
  • En León o en Ávila, el mismo sketch se puede trazar en la pizarra antes de pedir la única placa del departamento.
Laboratorio · en esta página Abrir en pestaña →

si / si no / fin, mientras / fin y para i = a hasta b / fin. El canvas enseña las variables al terminar. Hay un tope de pasos para que un bucle mal cerrado no congele la página.

GPIO 18

Simulación local · sin hardware

Raspberry Pi (BCM) · paralelo didáctico Arduino UNO D13 · pin GPIO 18

Estado del pin: LOW · LED apagado

OFF

Puedes leer el pulsador dentro de un si. Si está en OFF, pulsador vale 0 y ese camino no se toma. HIGH enciende el LED (en la Pi, 3,3 V; en Arduino UNO el paralelo didáctico es digitalWrite HIGH en D13). No se envía nada fuera de esta página.

Pulsa Ejecutar. El resultado se queda en esta página.

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).

Reto Profesor

La tabla de cuatro vueltas

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