La programación es el proceso utilizado para idear y ordenar las acciones necesarias para realizar un proyecto virtual, o para preparar el funcionamiento exacto de ciertas máquinas como robots.
La programación necesita codificar las instrucciones a través de lenguajes comprensibles para los ordenadores, de cara a ejecutar dichas instrucciones. El conjunto de instrucciones codificado se llama algoritmo. Un algoritmo puede contener diferentes tipos de elementos y aquí vamos a definir los más básicos para crear programas sencillos.
Es importante entender que la programación se puede realizar a diferentes niveles, según el nivel de profundización en las instrucciones. Los entornos y lenguajes de programación a alto nivel engloban varias instrucciones en una única instrucción para facilitar la programación.
En los entornos de programación por bloques se utilizan instrucciones de alto nivel. Por ejemplo, para programar el movimiento del gato de Scratch, le diríamos "Mover XX pasos", cuando realmente la instrucción "Mover" debería traducirse en varias instrucciones como "Situar la imagen en la posición del eje X = X + 1". En robótica, un entorno de programación a alto nivel podría incluir la instrucción "Avanzar" en lugar de poner varias instrucciones para mover cada uno de los motores del robot en una dirección determinada.
En realidad, es bastante habitual "hablar" a alto nivel, entendiendo que los receptores del mensaje entienden una serie de acciones implicadas en nuestro mensaje. Como vemos en la imagen, una instrucción a alto nivel sería "Preparar la sartén para freír", mientras que a más bajo nivel las instrucciones serían "Poner aceite en la sartén", "Poner la sartén al fuego", "Esperar a que el aceite esté caliente".
Un algoritmo es una secuencia de pasos o instrucciones que hay que seguir para llegar al resultado que queremos obtener. El algoritmo, es decir, las instrucciones, han de ser claras y sencillas para que cualquier persona pueda seguirlas sin ningún problema.
Por ejemplo, las instrucciones que te dan los sistemas de navegación vía satélite (GNSS) para llegar desde un punto de partida a un destino específico. En la imagen se pueden ver las instrucciones para llegar desde la Plaza Mayor a la Puerta del Sol en la ciudad de Madrid.
Un diagrama de flujo sirve para representar de forma gráfica un proceso, como es un algoritmo. Además, los diagramas de flujo son especialmente recomendables cuando se aprende programación, de cara a establecer un plan de todo lo que se tiene que programar antes de iniciarse con la programación en sí.
Para saber hacer diagramas de flujo tenemos que conocer primero los elementos básicos que podemos encontrar en uno de ellos, y posteriormente saber relacionarlos aplicados al procedimiento de un programa concreto.
Representa el inicio y el final del diagrama.
En robótica no se suele incluir el terminal del final del diagrama, ya que los programas suelen tener un bucle (repetición) infinita.
Representa los datos de entrada y los datos de salida.
Se representan fuera del flujo principal y se relacionan con éste en función de la dirección de la línea de flujo: entrada con línea hacia el flujo, salida con línea desde el flujo.
Representa cada proceso, instrucción o acción concreta que se ejecuta.
Para identificar cuáles son las instrucciones/procesos de nuestro programa, debemos pensar en que, como acciones, tienen que comenzar con un verbo. P.e. "Encender el LED"
Representa una condición que puede resultar en dos valores: si/no, V/F.
En el caso de ser una condición numérica puede resultar en dos o tres valores: mayor que (número), menor que (número), igual a (número).
Se utiliza con instrucciones de control.
Las líneas de flujo de información (flechas) relacionan todos estos elementos y, además, indican el sentido de los procesos. Por eso, con un diagrama de flujo bien construido, cualquier persona podría replicar nuestro programa.
A continuación, podemos ver un ejemplo de aplicación de estos elementos en un diagrama de flujo de un programa.
En este caso, al iniciar el programa se propone un decisión en función de un dato de entrada:
si el pulsador o botón está pulsado (decisión: SI) se ejecuta el proceso de Encender LED.
si el pulsador o botón no está pulsado (decisión: NO) se ejecuta el proceso de Apagar LED.
Estas instrucciones permite que el programa "controle" las instrucciones a ejecutar, es decir, que el programa pueda tomar decisiones y realizar una instrucción u otra en función de una condición. Para tomar esta decisión, las condiciones pueden tomar diferentes valores. En el ejemplo anterior veíamos cómo, si el valor del pulsador es "pulsado" se enciende un LED, y si el valor del pulsador NO es "pulsado" se apaga un LED.
Las instrucciones de control son, fundamentalmente, condicionales y bucles.
Los condicionales permiten establecer las condiciones que posibilitan al programa tomar decisiones. Los condicionales más básicos son 3: IF, IF...else, switch...case.
Condicional IF
Una sentencia condicional es una instrucción que se ejecuta o no en función del valor de una condición. Dependiendo de si la condición se da o no, se ejecutará o no una instrucción (o un conjunto de instrucciones).
Es muy sencillo, por ejemplo: Si se hace de noche, encenderé mi linterna.
Condicional IF...else
En muchos caso la sentencia IF se nos queda corta. Para los casos en los que una variable puede tomar dos valores es más adecuado utilizar un IF… ELSE.
Por ejemplo: Si empieza a llover, abriré el paraguas. Aquí partimos de que no está lloviendo, y sólo si empieza a llover ejecutaré la condición escrita: abrir el paraguas.
En este caso el “de lo contrario” sería seguir sin abrir, que es lo mismo que el estado inicial por lo que no hace falta incluir esa segunda condición. Pero, ¡cuidado! si no incluimos la condición de cerrar el paraguas, seguiría abierto aunque deje de llover.
Switch...case
Otras veces una variable puede tomar más de dos valores. Para estos casos en los que una variable toma varios valores existe otra sentencia conocida como SWITCH...CASE.
Por ejemplo, si voy de exploración al campo, tendré en cuenta la condición del tiempo:
si el valor = lluvia, entonces llevo el paraguas abierto
si el valor = noche, entonces llevo una linterna encendida
si el valor = día, entonces llevo una linterna apagada
si el valor = nublado, entonces llevo el paraguas cerrado
While
Estos bucles se utilizan cuando queremos repetir una acción un número indefinido de veces, mientras que se cumpla una condición.
Por ejemplo: mientras llueve, leo un libro. Si hiciese esto mismo con el condicional IF, al abrir el libro y ponerme a leer, el programa seguiría ejecutando el resto de instrucciones aunque deje de llover. Sin embargo, con el bucle While, hasta que no pare de llover, no pararé de leer el libro. De hecho, en algunos entornos de programación en lugar de While (Mientras) la instrucción es Hasta, por lo que los valores de la condición se toman al revés.
FOR
El bucle FOR se utiliza para repetir una o más instrucciones un número determinado de veces. Por tanto, utilizamos el bucle FOR sólo cuando sabemos seguro el número de veces que queremos que se ejecute una acción.
Por ejemplo, si yo quiero freír 37 espárragos, sin bucles tendría que repetir 37 veces la instrucción "Freír espárrago" en mi programa.
"Freír espárrago" "Freír espárrago" "Freír espárrago" "Freír espárrago" "Freír espárrago" "Freír espárrago" "Freír espárrago" "Freír espárrago" (...)Con el bucle FOR podríamos poner directamente:
FOR 37 "Freír espárrago"Una variable es un espacio en la memoria del programa donde guardamos un dato. Los datos, como sabemos, pueden ser de entrada o de salida respecto a los procesos.
Las variables deben declararse, es decir, guardarse inicialmente con un nombre concreto. Así se indica al programa qué tipo de dato guardamos en esa variable (número, letras, booleano).
Si no guardamos todos los datos que tenemos que usar en variables, luego no podremos utilizarlos, ya que el programa no los recordará.
También declaramos el valor exacto que tiene el dato cuando se ejecuta el programa, que puede variar durante su ejecución o puede mantenerse invariable, en función de cómo lo hayamos programado, por ejemplo:
Valores que guardamos directamente en el programa. P. e. el valor del nº Pi para realizar operaciones con él durante la ejecución del programa.
Contadores para registrar alguna puntuación o similar. P. e. el nº de respuestas acertadas. Estas variables se inician en 0 y, si la persona acierta (condicional), se suma 1 a la variable (Aciertos = Aciertos + 1)
Datos que debemos registrar tras iniciarse un programa. P. e. pedir el nombre a un usuario para dirigirse directamente a él por su nombre durante la ejecución.
Valores de sensores en un robot. Estos valores cambian continuamente. P. e. registrar el valor del sensor de luz, con un rango valores de 0 a 1023.
Cuando tengamos una tarea que se repite mucho, o cuando queramos organizar mejor nuestro proyecto, crearemos una función que realice dicha tarea cada vez que la llamemos. Por tanto, podríamos decir que una función es una tarea, una instrucción general que contiene varias instrucciones o pasos (un algoritmo específico), y que permite ejecutar dicha tarea con esa sola instrucción las veces que queramos.
Si retomamos el ejemplo anterior, diríamos que “freír un espárrago” sería una función, una tarea que se compone de las instrucciones antes descritas. Esta función o tarea la podremos reutilizar en todas las recetas que lleven espárrago frito: parrillada de verduras, risotto de espárragos, etc.
Traducido al lenguaje que utilizamos para programar: parrillada de verduras y risotto de espárragos serían programas concretos. “Freír un espárrago” sería una función, una tarea que repetimos a menudo y que si la escribimos de esta forma nos ahorra el tener que escribir todas las veces el conjunto de instrucciones (el algoritmo: preparar la sartén, echar el espárrago, etc.).