# Variables, lógica y funciones

# Variables y arreglos

<p class="callout info">Una variable es un dato almacenado en la memoria del ordenador, al que nos referimos por un nombre y cuyo valor puede ser cambiado durante la ejecución de un programa.</p>

Las variables pueden almacenar tres tipos básicos de datos:

- **Booleanos**. Un dato de este tipo sólo puede tomar los valores verdadero o falso, a veces nombrados como true y false, high y low, alto y bajo ó 0 y 1.
- **Numéricos**. Los números almacenados pueden ser enteros, reales, complejos, etc.
- **Alfanuméricos**, como caracteres o cadenas de texto

Para ilustrar el uso y la utilidad de las variables, vamos a modificar nuestro **termómetro digital** para que, además de la temperatura actual, muestre también las **temperaturas máxima y mínima** registradas a lo largo del tiempo.

Comenzaremos por la parte más básica: al pulsar el botón A, micro:bit mostrará en pantalla la temperatura actual. Para ello usamos el bucle de eventos <span style="color: rgb(185, 106, 217);">**al presionarse el botón A**</span>, el bloque <span style="color: rgb(53, 152, 219);">**mostrar número**</span> y la función <span style="color: rgb(132, 63, 161);">**-**</span> para restar **3** grados a la lectura del sensor de **<span style="color: rgb(185, 106, 217);">temperatura (ºC)</span>** y obtener así una lectura más precisa, tal y como se indicó en el capítulo de **Bucles y eventos de tiempo: un termómetro**.

![Temperatura.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/temperatura.jpg)

Las temperaturas **máxima** y **mínima** van a ser almacenadas en **dos** **variables** que debemos crear previamente. Puesto que cada variable debe tener asignado un nombre, vamos a llamarlas <span style="color: rgb(224, 62, 45);">**tmax**</span> y **<span style="color: rgb(224, 62, 45);">tmin</span>**.

Para crear una variable hay que deplegar el menú <span style="color: rgb(224, 62, 45);">**Variables**</span>, pulsar sobre <span style="color: rgb(224, 62, 45);">**Crear un variable...**</span> y darle el nombre deseado. Tras crear las variables <span style="color: rgb(224, 62, 45);">**tmax**</span> y **<span style="color: rgb(224, 62, 45);">tmin</span>**, el aspecto del menú debería ser el siguiente:

[![Variables.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables.jpg)

Nada más encender o reinicializar la placa conviene **guardar el valor de la temperatura actual en las variables creadas**. Para ello usaremos la estructura **<span style="color: rgb(53, 152, 219);">al iniciar</span>**, el valor proporcionado por la entrada **<span style="color: rgb(185, 106, 217);">temperatura (ºC)</span>** y las funciones de asignación de valores **<span style="color: rgb(224, 62, 45);">fijar tmax a</span>** y **<span style="color: rgb(224, 62, 45);">fijar tmin a</span>**.

![Inicializar variables.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/inicializar-variables.jpg)

<p class="callout info">El bloque <span style="color: rgb(224, 62, 45);">**fijar...a**</span> asigna a la variable el valor numérico indicado, mientras que el bloque **<span style="color: rgb(224, 62, 45);">cambiar... por</span>** suma a la variable el valor indicado.</p>

Las temperaturas máximas y mínimas guardadas en <span style="color: rgb(224, 62, 45);">**tmax**</span> y en <span style="color: rgb(224, 62, 45);">**tmin**</span> van a ser actualizadas cada minuto. Es necesario por lo tanto usar un evento de tiempo del tipo <span style="color: rgb(45, 194, 107);">**cada 60000 ms** <span style="color: rgb(0, 0, 0);">de la siguiente forma:</span></span>

[![Actualizar tenperatura.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/actualizar-tenperatura.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/actualizar-tenperatura.jpg)

Hemos vuelto a usar dos bloques <span style="color: rgb(224, 62, 45);">**fijar a**</span> para cambiar los valores de las temperaturas máxima y mínima. Por otro lado, las funciones **<span style="color: rgb(132, 63, 161);">min de...y...</span>** y <span style="color: rgb(132, 63, 161);">**max de...y...**</span> se encuentran en el menú <span style="color: rgb(132, 63, 161);">**Matemática**</span>.

El primer bloque de asignación da a la variable <span style="color: rgb(224, 62, 45);">**tmin**</span> el valor mínimo entre la temperatura actualmente medida con la entrada <span style="color: rgb(185, 106, 217);">**temperatura (º)**</span> y la temperatura mínima anteriormente guardada en <span style="color: rgb(224, 62, 45);">**tmin**</span>.

El segundo bloque de asignación da a la variable <span style="color: rgb(224, 62, 45);">**tmax**</span> el valor máximo entre la temperatura actualmente medida con la entrada <span style="color: rgb(185, 106, 217);">**temperatura (º)**</span> y la temperatura máxima anteriormente guardada en <span style="color: rgb(224, 62, 45);">**tmax**</span>.

Ya sólo queda mostrar las temperaturas registradas cada vez que se pulse del botón B. No nos olvidarnos de restar 3 grados a las temperaturas guardadas con el fin de proporcionar unas lecturas más precisas.

[![Mostrar registros.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/mostrar-registros.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/mostrar-registros.jpg)

Un <span style="color: rgb(230, 126, 35);">**arreglo**</span> es una variable que contiene varios valores numéricos o textuales organizados en filas. El menú **<span style="color: rgb(230, 126, 35);">Arreglos</span>** contiene bloques para crear arreglos, asignarles valores y acceder a los valores guardados. En la imagen se muestra un arpegio guardado como una lista de cuatro notas musicales.

[![Lista01.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/lista01.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/lista01.jpg)

Por último, Para manejar <span style="color: rgb(230, 126, 35);">**variables de texto**</span>, existen muchos bloques específicos disponible en el menú **<span style="color: rgb(230, 126, 35);">Texto</span>**.

# Dado de seis caras

Mediante el generador de números aleatorios podemos convertir micro:bit en un **dado**, de forma que cada vez que la placa sea agitada muestre en pantalla el resultado de una tirada.

[![Dado01.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/dado01.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/dado01.png)

Para empezar, es preciso crear una variable que almacene el número aleatorio generado por micro:bit cuando sea agitado. Llamaremos a esta variable <span style="color: rgb(224, 62, 45);">**resultado**</span>, y la crearemos desde el menú **<span style="color: rgb(224, 62, 45);">Variables</span>**, para lo cual hay que pulsar sobre **<span style="color: rgb(224, 62, 45);">Crear una variable...</span>**

**<span style="color: rgb(224, 62, 45);">![Dado00.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/dado00.png)</span>**

Un evento de tipo **<span style="color: rgb(185, 106, 217);">si agitado</span>** borarrá la pantalla y hará sonar una pequeña melodía antes de mostrar el resultado de la tirada. El bloque <span style="color: rgb(185, 106, 217);">**<span style="color: rgb(224, 62, 45);">fijar resultado a</span>** </span><span style="color: rgb(132, 63, 161);">**escoger al azar de 1 a 6**</span> asignará a la variable <span style="color: rgb(224, 62, 45);">**resultado**</span> un valor aleatorio de 1 a 6. El bloque <span style="color: rgb(132, 63, 161);">**escoger al azar de...a...**</span> se encuentra en el menú <span style="color: rgb(132, 63, 161);">**Matemática**</span>.

Seguidamente, una estructura condicional <span style="color: rgb(45, 194, 107);">**si...entonces**</span> decidirá qué icono mostrar en la pantalla en función del resultado.

[![Dado05.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/dado05.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/dado05.png)

El código mostrado es muy fácil de adaptar a otros eventos aleatorios, como el lanzamiento de una moneda al aire o el juego de piedra, papel y tijera, cuyo código se presenta a continuación:

[![Pikachú.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/pikachu.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/pikachu.jpg)

# Metrónomo digital

Usaremos variables para convertir micro:bit en un metrónomo digital. Mediante los botones A y B cambiaremos el tempo del metrónomo, mientras que agitando la tarjeta encenderemos y apagaremos el sonido del metrónomo.

En primer necesitamos una variable que almacene el tempo, y a la que vamos a llamar, obviamente, <span style="color: rgb(224, 62, 45);">**tempo**</span>. Otra variable se llamará **<span style="color: rgb(224, 62, 45);">marcha</span>**, y almacenará los valores **<span style="color: rgb(224, 62, 45);">verdadero</span>**, si el metrónomo está en marcha o **<span style="color: rgb(224, 62, 45);">falso</span>**, si está parado. **<span style="color: rgb(224, 62, 45);">Marcha</span>** será por lo tanto una **variable de tipo booleano**.

La variable <span style="color: rgb(224, 62, 45);">**findepulso**</span> almacenará el momento exacto medido en milisegundos en el que debe acabar cada pulso.

Para crear las variables hay que acceder al menú **<span style="color: rgb(224, 62, 45);">Variables</span>** y pulsar sobre **<span style="color: rgb(224, 62, 45);">Crear una variable... </span>**El aspecto que presentará el menú desplegable una vez creadas las variables es el siguiente:

[![Variables08.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables08.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables08.png)

Seguidamente daremos unos valores iniciales a las variables: 120 para el **<span style="color: rgb(224, 62, 45);">tempo</span>** y **<span style="color: rgb(224, 62, 45);">falso</span>** para **<span style="color: rgb(224, 62, 45);">marcha</span>**. Este último valor indica que el metrónomo estará parado cuando sea encendido o reiniciado.

![Variables01.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables01.png)

Recordemos que el bloque con la constante **<span style="color: rgb(22, 145, 121);">falso</span>** se obtiene del menú <span style="color: rgb(22, 145, 121);">**Lógica**</span>.

El metrónomo se pondrá en marcha o se parará cada vez que se agite. Usaremos un evento **<span style="color: rgb(185, 106, 217);">si agitado</span>** del menú **<span style="color: rgb(185, 106, 217);">Entrada</span>** y cambiaremos el valor de <span style="color: rgb(224, 62, 45);">**marcha**</span>. Gracias al operador **<span style="color: rgb(22, 145, 121);">no</span>**, del menú <span style="color: rgb(22, 145, 121);">**Lógica**</span>, si el valor de **<span style="color: rgb(224, 62, 45);">marcha</span>** es **<span style="color: rgb(224, 62, 45);">falso</span>**, cambiará a **<span style="color: rgb(224, 62, 45);">verdadero</span>**, y si es **<span style="color: rgb(224, 62, 45);">verdadero</span>**, cambiará a **<span style="color: rgb(224, 62, 45);">falso</span>**.

[![Variables02.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables02.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables02.png)

Cuando se pulse el botón A el tempo disminuirá un pulso y cuando se pulse el botón B el tempo aumentará un pulso.

[![Variables03.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables03.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables03.png)

Al pulsar A+B micro:bit mostrará en pantalla el tempo.[![Variables06.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables06.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables06.png)

El bloque <span style="color: rgb(53, 152, 219);">**para siempre**</span> será el encargado de hacer sonar un pitido con cada pulso y de mostrar brevemente el icono de una corchea en la pantalla **<span style="color: rgb(224, 62, 45);">LED</span>**.

[![Variables07.png](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/variables07.png)](https://libros.catedu.es/uploads/images/gallery/2023-09/variables07.png)

En primer lugar, el bucle <span style="color: rgb(22, 145, 121);">**si <span style="color: rgb(224, 62, 45);">marcha</span> entonces**</span> se asegura de que el metrónomo sólo funcione si la variable **<span style="color: rgb(224, 62, 45);">marcha</span>** tiene el valor **<span style="color: rgb(224, 62, 45);">verdadero</span>**. En caso contrario el bucle no hará nada.

Si el metrónomo está en marcha, la variable **<span style="color: rgb(224, 62, 45);">findepulso</span>** tomará el valor en milisegundos en el que debe acabar la ejecución del pulso actual. Este valor es la suma del tiempo actual, **milisegundos (ms)**, y de la duración de un pulso en milisegundos, es decir, 60000 ms/min dividido entre el tempo en pulsos/min. La variable **milisegundos (ms)** se encuentra en el menú **Avanzado/Control**.

Seguidamente se hace sonar una nota breve, se muestra una corchea en pantalla, se espera un instante y se borra la pantalla.

Como todavía quedará tiempo para que finalice el pulso actual, se introduce un bucle de espera cuyo funcionamiento es el siguiente: <span style="color: rgb(45, 194, 107);">**mientras**</span> el tiempo actual en ms sea menor que el tiempo en el que debe finalizar el pulso, no se hará nada. Por el contrario, cuando el tiempo actual en ms sea igual o mayor al tiempo de **<span style="color: rgb(224, 62, 45);">findepulso</span>**, el pulso habrá acabado, el bucle <span style="color: rgb(45, 194, 107);">**mientras**</span> finalizará y se iniciará una nueva ejecución del bucle **<span style="color: rgb(53, 152, 219);">para siempre</span>** (un nuevo pulso).

# Uso de funciones

A menudo es preciso **repetir muchas veces a** lo largo de un programa **un mismo fragmento de código**. Para no tener que escribir el mismo código una y otra vez en aquellas partes del programa donde deba ser ejecutado, MakeCode permite el uso de **funciones**.

Una **función** es por lo tanto un trozo de código al que asignamos **un nombre que podemos invocar** en cualquier momento y desde cualquier parte del programa para que se ejecute. En otros lenguajes de programación, las funciones como las de MakeCode son denominidas **rutinas**, **subrutinas**, **módulos**, **métodos** o <span style="color: rgb(224, 62, 45);">**procedimientos**</span>.

Consideremos del código siguiente, que convierte a micro:bit en una **alarma**: cada vez que la tarjeta es agitada presenta un icono intermitente y produce un sonido.

[![Funcion00.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/funcion00.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/funcion00.jpg)

Después de ajustar el volumen al máximo, un bucle <span style="color: rgb(45, 194, 107);">**repetir 4 veces**</span>, muestra un icono, después reproduce una melodía pregrabada por medio del bloque <span style="color: rgb(224, 62, 45);">**play...hasta que termine**</span>, borra la pantalla y espera medio segundo.

Podemos hacer más sensible la alarma añadiendo más eventos para dispararla, por ejemplo, el giro de la placa a la izquierda.

[![Funcion01.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/funcion01.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/funcion01.jpg)

Para cualquier otro evento que deba activar la alarma habrá que repetir **volver a repetir el código**, llenando el área de programación de bloques. Solucionemos este probllema creando una función a la que vamos a llamar **<span style="color: rgb(35, 111, 161);">activar</span>**.

Tan sólo hay que pulsar en el menú **Avanzado** <span style="color: rgb(35, 111, 161);">**Funciones**</span>, pulsar sobre <span style="color: rgb(35, 111, 161);">**crear una variable...**</span> y darle el nombre elegido. Inmediatamente aparecerá el nuevo bloque de código correspondiente a la función activar.

[![Funcion02.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/funcion02.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/funcion02.jpg)

Ahora debemos completar el código de la función:

[![Funcion03.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/funcion03.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/funcion03.jpg)

Finalmente, cada evento que deba disparar la alarma incorporará una llamada a la función, que aparecerá como un bloque denominado como <span style="color: rgb(35, 111, 161);">**llamada activar** </span>dentro del menú **<span style="color: rgb(35, 111, 161);">Funciones.</span>**

[![Funcion04.jpg](https://libros.catedu.es/uploads/images/gallery/2023-09/scaled-1680-/funcion04.jpg)](https://libros.catedu.es/uploads/images/gallery/2023-09/funcion04.jpg)