Tema 12 · Bloque E · Sistemas informáticos. Programación

Tema 12. Fundamentos de la programación textual: del problema al programa

Qué es programar con un lenguaje textual, cómo se estructura un programa y cómo se ejecuta el primero.

Empieza el Bloque E, y empieza de cero: no se supone ningún conocimiento previo de Python. Es también el bloque más importante del curso, porque es el único lugar de la materia donde se aprende a programar —en 2.º de Bachillerato el bloque informático cambia de objeto— y porque los bloques F y G lo aplican sin volver a explicarlo. Aquí no aprenderemos a programar «en general»: aprenderemos a programar sistemas técnicos, que es otra cosa.

Antes de empezar: explícale a otra persona, solo con palabras y sin gestos, cómo atarse un cordón. Descubrirás dos cosas: que hay pasos que nunca habías puesto en palabras, y que cada frase admite dos interpretaciones. Programar es ese ejercicio, con la diferencia de que quien escucha no tiene sentido común para rellenar los huecos.
Al terminar serás capaz de…
  • explicar qué distingue un lenguaje de programación textual y por qué el currículo lo exige;
  • situar Python entre los lenguajes y justificar su elección para esta materia;
  • describir las tres estructuras de la programación estructurada;
  • reconocer las partes de un programa: instrucciones, sintaxis, sangrado y comentarios;
  • trabajar en Jupyter Notebook con Google Colab entendiendo el estado de la sesión;
  • pasar de un enunciado en palabras a un algoritmo descrito en lenguaje natural y de ahí al programa;
  • leer un diagrama de flujo sencillo y reconocer sus cinco símbolos;
  • seguir paso a paso la ejecución de un programa y predecir su estado final;
  • leer un mensaje de error y localizar la línea que lo causa.

1. Qué es programar, y qué significa «textual»

Programar es escribir la secuencia de instrucciones que una máquina ejecutará sin intervención humana. La palabra clave es sin intervención: la máquina no interpreta, no supone y no pregunta. Hace exactamente lo que dice el programa, incluido lo que no querías decir.

Programación por bloques

Se arrastran piezas encajables. Evita los errores de escritura y enseña la lógica, pero limita lo que se puede expresar y no existe fuera del entorno educativo.

Programación textual

Se escribe código como texto. Exige precisión absoluta en la escritura y, en cambio, no tiene techo: es lo que se usa en la industria, en la universidad y en cualquier placa controladora.

El currículo exige textual, y no por caprichoEl criterio 5.1 de la Comunidad de Madrid pide controlar sistemas «utilizando lenguajes de programación informática textuales, aplicando el paradigma de la programación estructurada». Son dos exigencias explícitas. La razón práctica es sencilla: la placa que gobierna un sistema real se programa con texto, y el texto es lo único que se puede versionar, comentar, buscar, comparar y compartir en un repositorio, como vimos en el Tema 4.
Y aquí Python es una herramienta, no una asignatura. En esta materia no programamos por programar: programamos para leer un sensor, decidir y accionar algo. Eso cambia el tipo de ejercicio: casi todos los programas de este bloque calculan una magnitud técnica, tratan una serie de medidas o toman una decisión de control. El objetivo del bloque no es dominar Python: es que el Bloque F pueda existir.

2. Lenguajes de programación y por qué Python

Un lenguaje de programación es un conjunto de reglas —sintaxis— y de significados —semántica— que permiten escribir instrucciones ejecutables. Hay cientos; estos son los que te vas a encontrar.

Lenguajes textuales más habituales y dónde aparecen
LenguajeCaracterísticaDónde se usa
PythonInterpretado, sintaxis muy legible, enorme biblioteca.Ciencia, datos, automatización, educación, microcontroladores con MicroPython.
CCompilado, muy rápido y muy próximo al hardware.Sistemas embebidos, núcleos de sistema operativo.
C++Como C, con orientación a objetos.Arduino, videojuegos, software industrial.
JavaCompilado a una máquina virtual, muy portable.Aplicaciones empresariales, Android.
JavaScriptInterpretado en el navegador.Páginas web y paneles de supervisión como el del Tema 18.
MATLAB y OctaveOrientados al cálculo numérico y matricial.Ingeniería de control y simulación.

Compilado o interpretado

Compilado

Un programa —el compilador— traduce todo el código fuente a instrucciones de máquina antes de ejecutar. Resultado: un archivo ejecutable rapidísimo, y un paso extra cada vez que cambias algo. Es C y C++.

Interpretado

Un programa —el intérprete— lee y ejecuta el código línea a línea. Resultado: pruebas inmediatas y algo menos de velocidad. Es Python.

Por qué Python en esta materiaTres razones, en este orden. 1. Un solo lenguaje de principio a fin: el mismo Python del ordenador sirve, como MicroPython, para la placa ESP32 de los bloques F y G. 2. Sintaxis legible: un programa de control se lee casi como el algoritmo en palabras, y eso importa cuando hay que revisarlo en equipo. 3. Realimentación inmediata: al ser interpretado, se prueba una línea y se ve el resultado, lo que permite el desarrollo incremental del Tema 1 aplicado al código.
Lo que no se estudia en este curso. No hay programación orientada a objetos, ni hilos, ni interfaces gráficas. La orientación a objetos aparece de pasada al usar bibliotecas —escribirás pin.value(1) sin necesitar saber qué es un método—, y eso es todo. El paradigma del curso es el estructurado, que es lo que pide el currículo.

3. El paradigma de la programación estructurada

La programación estructurada sostiene que cualquier programa, por complicado que sea, puede construirse combinando solo tres estructuras de control. No es una opinión pedagógica: es un resultado demostrado, y es la razón de que un programa bien escrito se pueda seguir de arriba abajo.

Secuencia

Una instrucción después de otra, en el orden escrito. Es el caso por omisión: si no dices lo contrario, Python ejecuta en orden.

Selección

Se elige entre dos o más caminos según una condición. En Python, if, elif y else. Es el Tema 14.

Iteración

Un bloque se repite mientras se cumpla una condición o para cada elemento de una colección. En Python, while y for. También el Tema 14.

Una entrada, una salidaLa regla que da nombre al paradigma: cada estructura tiene un solo punto de entrada y un solo punto de salida. Eso permite razonar sobre un programa por partes, sustituyendo mentalmente cada bloque por «lo que hace», sin tener que seguir todos los saltos posibles. Es exactamente la misma idea que el diagrama funcional por bloques del Tema 3: si cada caja tiene entradas y salidas claras, el sistema se entiende; si hay saltos arbitrarios, no.
La carta que cambió la programación. En 1968, el informático Edsger Dijkstra publicó una carta titulada «La sentencia go to considerada perjudicial». El go to permitía saltar a cualquier línea del programa, y su uso libre producía código imposible de seguir, lo que se llamó «código espagueti». La carta abrió el camino a la programación estructurada, y es la razón de que los lenguajes modernos —Python incluido— no tengan go to. No es historia: es el motivo de que puedas leer un programa de arriba abajo.

4. Python y su entorno de trabajo

En este curso se trabaja con Jupyter Notebook a través de Google Colab. Un notebook es un documento formado por celdas, que pueden contener texto explicativo o código ejecutable. La ventaja para una materia técnica es grande: el mismo documento contiene el planteamiento, el cálculo, el código y la gráfica del resultado, y es el formato natural de la memoria del Tema 4.

Los tres entornos del curso y para qué sirve cada uno
EntornoQué esCuándo se usa
Jupyter Notebook con Google ColabNotebooks en el navegador, sin instalar nada.Todo el aprendizaje del lenguaje y los cálculos técnicos. Es el entorno principal.
ThonnyEditor local muy sencillo con depurador paso a paso.Archivos .py, depuración del Tema 15 y grabar la placa.
WokwiSimulador de ESP32 con MicroPython en el navegador.Probar el programa de la placa cuando no hay hardware para todos.
El estado de la sesión: la trampa número uno del notebookLas celdas se pueden ejecutar en cualquier orden, y el intérprete recuerda todo lo ejecutado. Eso significa que un notebook puede funcionar en tu pantalla y fallar al abrirlo de nuevo, porque dependía de una celda que ejecutaste antes y luego borraste. La comprobación obligatoria antes de entregar: reiniciar el entorno y ejecutar todas las celdas de arriba abajo. Si así funciona, el notebook es correcto. Si no, no lo era.

El primer programa

# Primer programa del curso: mostrar un texto por pantalla
print("KR-1: sistema de riego iniciado")

Dos líneas y ya hay tres cosas que observar. La primera empieza por #: es un comentario, texto para las personas que el intérprete ignora. La segunda es una instrucción: llama a print y le pasa entre paréntesis lo que debe mostrar. Y el texto va entre comillas porque es una cadena de caracteres, no un nombre.

# Calcular la potencia de un motor: el cálculo del Tema 9, ahora en Python
par = 0.35            # N·m
velocidad = 1800      # min-1
omega = 2 * 3.1416 * velocidad / 60
potencia = par * omega
print("Potencia del motor:", potencia, "W")
Fíjate en el punto decimal. En Python los decimales se escriben con punto, no con coma: 0.35 y no 0,35. La coma tiene otro significado —separa elementos—, de modo que escribir 0,35 no da error: da dos números, y el programa hace algo distinto de lo que querías sin avisar. Es el primer choque entre la notación española y la del lenguaje, y conviene tenerlo presente en todos los cálculos del curso.

5. La estructura de un programa

Los elementos de un programa en Python
ElementoQué esEjemplo
InstrucciónUna orden completa; normalmente, una por línea.potencia = par * omega
SintaxisLas reglas de escritura del lenguaje.Los paréntesis de print(...) son obligatorios.
ComentarioTexto desde # hasta el final de la línea, ignorado al ejecutar.# N·m
BloqueConjunto de instrucciones que se ejecutan juntas.Lo que va dentro de un if.
SangradoLos espacios al principio de la línea, que definen el bloque.Cuatro espacios por nivel.
FunciónOperación con nombre a la que se le pasan datos.print, input, round
Biblioteca o móduloConjunto de funciones que se importa para usarlo.import math
En Python el sangrado no es estética: es sintaxisEn casi todos los lenguajes los bloques se delimitan con llaves y el sangrado es una costumbre. En Python, el sangrado es la única forma de indicar qué instrucciones pertenecen a un bloque. Mover una línea cuatro espacios cambia el programa. Suena arriesgado y tiene una consecuencia excelente: es imposible escribir Python mal indentado, así que todo el código de todo el mundo se lee igual. Usa siempre cuatro espacios por nivel y nunca mezcles espacios con tabuladores.
# El sangrado decide el significado. Estos dos programas NO hacen lo mismo.

# A: solo riega si está seco
if humedad < umbral:
    abrir_valvula()
    registrar("riego")

# B: riega si está seco, pero registra siempre
if humedad < umbral:
    abrir_valvula()
registrar("riego")
Nombres: el comentario más barato que existe. humedad_actual y umbral_riego no necesitan explicación; h y u sí. Un nombre bien elegido ahorra un comentario y sobrevive a los cambios, porque un comentario se queda obsoleto y el nombre viaja con la variable. La regla del curso: nombres en minúsculas, con guion bajo para separar palabras, y que digan la magnitud y su unidad cuando haya duda —tiempo_riego_s—.

6. Del enunciado al algoritmo, y del algoritmo al programa

Un algoritmo es una secuencia finita y no ambigua de pasos que resuelve un problema. Y la forma de describirlo en este curso es en español corriente, con frases claras: no se usa ninguna notación formal de pseudocódigo.

Por qué no hay pseudocódigo formal en este cursoUna notación formal de pseudocódigo es un tercer lenguaje que hay que aprender, con su propia sintaxis y sus propios errores, y que después se abandona. Ese esfuerzo se invierte aquí en Python, que es ejecutable desde el primer día y sirve para la placa del Bloque F. El algoritmo se piensa y se escribe en palabras —en la memoria del proyecto, donde lo entiende cualquiera— y se traduce directamente a código.

Los cuatro pasos, con un caso real

1 · Entender el enunciado

«Riega el bancal si el sustrato está seco, pero solo entre las 7 y las 10 de la mañana, y nunca más de 30 segundos seguidos.» Identifica los datos —humedad, hora—, las condiciones y el resultado.

2 · Escribir el algoritmo en palabras

«Leer la humedad y la hora. Si la humedad es menor que el umbral y la hora está entre 7 y 10, abrir la válvula, esperar 30 segundos y cerrarla. En cualquier caso, registrar lo ocurrido.»

3 · Definir los casos de prueba

Antes de escribir código: seco a las 8 → riega. Seco a las 15 → no riega. Húmedo a las 8 → no riega. Exactamente en el umbral → hay que decidir qué pasa, y decidirlo es parte del diseño.

4 · Traducir a Python y comprobar

Cada frase del algoritmo se convierte en una o dos líneas. Después se ejecuta con los casos de prueba y se comprueba que dan lo esperado.

# El algoritmo anterior, traducido paso a paso

humedad = 410          # lectura del sensor, en cuentas del ADC
hora = 8               # hora del día, de 0 a 23
umbral = 500           # por debajo de este valor, el sustrato está seco

if humedad < umbral and 7 <= hora < 10:
    print("Abrir la válvula durante 30 s")
else:
    print("No regar ahora")
Los casos de prueba se escriben antes que el programa. Es el hábito profesional más rentable, y es la razón de que el paso 3 vaya antes del 4. Si defines los casos después, los defines a la medida de lo que has escrito y no comprueban nada. Y ese caso incómodo —«exactamente en el umbral»— es donde están casi todos los fallos: no es una rareza de examen, es la frontera real de la decisión.
Piensa: el enunciado decía «nunca más de 30 segundos seguidos». El programa anterior no lo garantiza: solo imprime un mensaje. ¿Qué haría falta añadir para que la restricción se cumpla de verdad, incluso si el programa se interrumpe a mitad del riego? (Pista: la respuesta no está en el if, sino en el diseño del Tema 18 y en la válvula normalmente cerrada del Tema 8.)

7. Leer un diagrama de flujo

Un diagrama de flujo representa un algoritmo con símbolos normalizados unidos por flechas. En este curso se aprende a leerlo, porque aparecerá en libros, en manuales y en pruebas, pero no se usa como método de diseño: para eso están las palabras y el propio Python.

Diagrama de flujo: inicio, leer humedad, decisión si la humedad es menor que el umbral; por el sí abre la válvula 30 segundos, por el no sigue directamente; ambos caminos llegan a esperar una hora y el flujo vuelve a la lectura, formando un bucle sin fin. A la derecha, los cinco símbolos normalizados.
El mismo algoritmo del KR-1, dibujado. Fíjate en la flecha de retorno: un programa de control no termina, se repite indefinidamente. Eso reaparecerá en el Tema 18.
Los cinco símbolos que hay que reconocer
SímboloSignificaEn Python
Rectángulo redondeadoInicio o fin del programa.El principio y el final del archivo.
RectánguloProceso: hacer algo.Una instrucción o un bloque.
RomboDecisión, con dos salidas rotuladas.ifelse
ParalelogramoEntrada o salida de datos.input, print, leer un sensor.
FlechaLínea de flujo: el orden de ejecución.El orden de las líneas; una flecha hacia atrás es un bucle.
Cómo se lee sin perderse. Empieza en «inicio» y recorre una sola flecha a la vez, anotando en una hoja el valor de cada dato. En cada rombo, decide qué salida tomas con los valores que tienes anotados. Si llegas a una flecha que va hacia atrás, has encontrado un bucle: pregúntate qué tendría que cambiar para salir de él. Si nada puede cambiar, el bucle es infinito, y eso puede ser un error o —como aquí— el comportamiento deseado.

8. Seguir la ejecución paso a paso

El criterio 5.3 pide expresamente «mostrar el progreso paso a paso de la ejecución de un programa a partir del estado inicial y predecir su estado final». Se hace con una tabla de traza: una fila por instrucción ejecutada y una columna por variable.

total = 0
lecturas = 0
for medida in [420, 515, 380, 610]:
    total = total + medida
    lecturas = lecturas + 1
media = total / lecturas
print("Humedad media:", media)
Traza de la ejecución, instrucción a instrucción
PasoInstrucciónmedidatotallecturasmedia
1total = 00
2lecturas = 000
31.ª vuelta del bucle4204201
42.ª vuelta5159352
53.ª vuelta38013153
64.ª vuelta61019254
7media = total / lecturas61019254481,25
8print(...)61019254481,25
La traza no es un ejercicio de examen: es la herramienta de depuraciónCuando un programa da un resultado raro, la pregunta no es «¿qué está mal?» sino «¿en qué paso el valor deja de ser el que esperaba?». La traza responde a eso, y es exactamente lo que hará el depurador de Thonny en el Tema 15 de forma automática. Hacerla a mano unas cuantas veces es lo que permite entender después lo que el depurador muestra.
Piensa: ¿qué pasa si la lista de lecturas está vacía? La variable lecturas valdría 0 y la división de la línea 6 sería entre cero: el programa se detiene con un error. En un programa de control que se ejecuta solo en el huerto, detenerse no es una opción. Volveremos sobre esto en el Tema 15, al hablar de casos límite.

9. Los primeros errores, y cómo leerlos

Vas a escribir programas con errores desde hoy y durante el resto de tu vida. Lo que distingue a quien programa bien no es cometer menos: es leer el mensaje en lugar de mirar la pantalla con desconfianza.

Los seis errores del primer día
MensajeQué ha pasadoCómo se arregla
SyntaxErrorEl intérprete no entiende la escritura: falta un paréntesis, dos puntos o una comilla.Mirar la línea indicada y la anterior: el paréntesis suele faltar antes.
IndentationErrorEl sangrado no es coherente.Cuatro espacios por nivel, sin mezclar tabuladores.
NameErrorSe usa un nombre que no existe: una errata, o una variable no definida todavía.Comprobar la escritura y el orden de las líneas o de las celdas.
TypeErrorSe opera con tipos incompatibles: sumar un texto y un número.Convertir el tipo. Es el Tema 13.
ZeroDivisionErrorDivisión entre cero.Comprobar el divisor antes de dividir.
Ningún mensaje, resultado raroError lógico: el programa hace bien lo que le pediste, y le pediste otra cosa.Traza, casos de prueba y depurador. Es el más difícil y el más frecuente.
Cómo se lee un mensaje de errorSe lee de abajo arriba. La última línea dice el tipo de error y una descripción; la penúltima, el archivo y la línea donde ocurrió. Todo lo de arriba es el camino que siguió la ejecución hasta llegar allí, y suele sobrar al principio. Copiar el texto de la última línea en un buscador resuelve la mayoría de los casos, y leer lo que ya dice el mensaje resuelve casi todos los demás.
Y una advertencia sobre la ayuda automática. Un asistente de inteligencia artificial puede escribirte un programa que funcione y que no entiendas, y eso es peor que un programa que falla: cuando haya que modificarlo en el huerto, en junio, nadie sabrá dónde tocar. La regla del bloque es la del Tema 4: puedes usarlo para entender un error o revisar tu redacción, pero el código que entregas tienes que poder explicarlo línea a línea, y se declara qué herramientas has usado.

Comprueba lo que has aprendido

Este tema se demuestra con un notebook que se ejecuta de arriba abajo y con un algoritmo que se entiende antes de leer el código.

Qué debería mostrar tu trabajo
AspectoQué debes demostrarEvidencias posibles
Del enunciado al algoritmoQue escribes el algoritmo en palabras y defines los casos de prueba antes de programar.Algoritmo en español, tabla de casos de prueba con el caso del umbral incluido.
Estructura del programaQue el código tiene comentarios útiles, nombres significativos y sangrado correcto.Programa comentado, nombres con magnitud y unidad, cuatro espacios por nivel.
EntornoQue dominas el notebook y su estado de sesión.Notebook que funciona tras reiniciar el entorno y ejecutar todo de arriba abajo.
TrazaQue sigues la ejecución paso a paso y predices el estado final.Tabla de traza de un programa con bucle, con la predicción hecha antes de ejecutarlo.
ErroresQue lees los mensajes y localizas la causa.Tres errores provocados a propósito, con su mensaje y su corrección explicada.

Prueba honesta: entrega tu notebook a otro equipo y pídeles que lo ejecuten desde cero. Si necesitan que les expliques en qué orden pulsar, todavía no está terminado.

Glosario del tema

Algoritmo
Secuencia finita y no ambigua de pasos que resuelve un problema.
Bloque
Conjunto de instrucciones que se ejecutan juntas; en Python se delimita por el sangrado.
Cadena de caracteres
Dato formado por texto, escrito entre comillas.
Celda
Unidad de un notebook que contiene texto o código ejecutable.
Código fuente
Texto del programa tal como lo escribe una persona.
Comentario
Texto dirigido a las personas que el intérprete ignora; en Python empieza por almohadilla.
Compilador
Programa que traduce todo el código fuente a instrucciones de máquina antes de ejecutarlo.
Diagrama de flujo
Representación gráfica de un algoritmo con símbolos normalizados unidos por flechas.
Error lógico
Fallo en el que el programa se ejecuta sin avisos pero no hace lo que se pretendía.
Instrucción
Orden completa dirigida al intérprete.
Intérprete
Programa que lee y ejecuta el código fuente línea a línea.
Iteración
Estructura de control que repite un bloque de instrucciones.
Notebook
Documento formado por celdas de texto y de código, con sus resultados.
Programación estructurada
Paradigma que construye cualquier programa combinando secuencia, selección e iteración, cada una con una entrada y una salida.
Programación textual
Programación en la que el código se escribe como texto, frente a la programación por bloques.
Sangrado
Espacios al comienzo de una línea; en Python determina a qué bloque pertenece.
Selección
Estructura de control que elige entre caminos alternativos según una condición.
Secuencia
Ejecución de las instrucciones una tras otra en el orden escrito.
Sintaxis
Conjunto de reglas de escritura de un lenguaje de programación.
Traza
Registro del valor de las variables paso a paso durante la ejecución.

Resumen esencial

  1. Programar es escribir instrucciones que la máquina ejecutará sin interpretar, sin suponer y sin preguntar.
  2. El currículo exige lenguaje textual y paradigma estructurado: es lo que se usa en una placa real y lo único que se puede versionar y revisar.
  3. En esta materia Python es una herramienta al servicio del control de sistemas, no el objeto de estudio.
  4. Un lenguaje compilado se traduce entero antes de ejecutar; uno interpretado se ejecuta línea a línea. Python es interpretado, y eso permite probar al instante.
  5. Python se elige por tres razones: un solo lenguaje también para la placa, sintaxis legible y realimentación inmediata.
  6. La programación estructurada construye cualquier programa con secuencia, selección e iteración, cada una con una sola entrada y una sola salida.
  7. En un notebook, las celdas pueden ejecutarse en cualquier orden: antes de entregar hay que reiniciar el entorno y ejecutar todo de arriba abajo.
  8. En Python los decimales llevan punto; escribir coma no da error, da otra cosa.
  9. El sangrado de Python es sintaxis, no estética: cuatro espacios por nivel y sin mezclar tabuladores.
  10. Un nombre bien elegido ahorra un comentario y no se queda obsoleto.
  11. El algoritmo se describe en español corriente; no se usa ninguna notación formal de pseudocódigo, porque ese esfuerzo se invierte en Python.
  12. Los casos de prueba se escriben antes del programa, y el caso del umbral es donde se esconden casi todos los fallos.
  13. Los diagramas de flujo se aprenden para leerlos: cinco símbolos y una regla, seguir una flecha a la vez anotando los valores.
  14. La traza —una fila por instrucción y una columna por variable— es la herramienta con la que se responde a «en qué paso deja de ser lo que esperaba».
  15. Los mensajes de error se leen de abajo arriba; el error sin mensaje, el lógico, es el más frecuente y el más difícil.

Fuentes y recursos fiables