CAB 7. Lenguaje Arduino. Estructuras de Control

7.1 Introducción

Una vez que hemos visto los Aspectos Generales del Lenguaje Arduino y las estructuras para almacenar los datos en memoria, es decir las Variables y Constantes, podemos empezar a implementar los algoritmos que utilizan y operan con esos datos mediante las estructuras de control.

Estas instrucciones nos permitirán implementar el flujo algorítmico y podemos agruparlas en dos grupos

  • Estructuras Condicionales, con las que se decidirá si se ejecuta o no una secuencia de instrucciones dependiendo de si se cumplen o no unas condiciones concretas.
  • Estructuras de Bucles, que se encargaran de repetir una serie de instrucciones un número determinado de veces de forma independiente o dependiente del cumplimiento de una serie de condiciones.

En los siguientes apartados vamos a ver con más detalle estas estructuras o instrucciones.

7.2 Estructuras Condicionales

Estas estructuras son las siguientes.

7.2.1 Estructura if

Como hemos dicho, if es una estructura condicional, cuya sintaxis vemos a continuación

if (condición) {
   // Bloque de instrucciones que se ejecutan si la condición es verdadera
}

Si la condición se cumple, es decir es cierta o verdadera, se ejecutan las instrucciones contenidas entre las llaves { } . En caso contrario no se ejecutan y se salta a la instrucción siguiente.

Aclaraciones a tener en cuenta

  • La condición puede ser de diferente tipo pero su evaluación siempre debe dar como resultado una expresión lógica. Ejemplos serían (a > 10), (a != 0), …
  • Si el bloque de instrucciones a ejecutar, en caso de cumplirse la condición, es una sola línea de código se puede expresar ésta sin las { } o con ellas. Mi recomendación, atendiendo a la legibilidad del código, es utilizar siempre las { } sea el bloque de instrucciones de una o de varias líneas. A continuación un ejemplo de dos instrucciones correctas
// Bloque de instrucciones de una sola línea entre llaves
if (a > b) {
   a = a + 3;
{

// Bloque de instrucciones de una sola línea sin llaves
if (a > b)
   a = a + 3;
  • Hay que tener en cuenta, si realizamos una comparación de valores en la condición, que es algo muy habitual, no utilizar el = que es un operador de asignación, sino el == que es uno de comparación. Este es un error muy habitual al principio en la programación. Ejemplo correcto a continuación
// Ejemplo de una comparación de valores en la condición
if (a == b) {                 // operador de comparación
   a = 0;                     // operador de asignación   
}

7.2.2 Estructura if – else

Esta estructura es, una variante o mejor dicho, una ampliación de la anterior.

Su sintaxis es

if (condición) {
   // Bloque de instrucciones que se ejecutan si la condición es verdadera
}
else {
   // Bloque de instrucciones que se ejecutan si la condición NO es verdadera
}

En este caso, de forma similar al anterior, si la condición se cumple, es decir es cierta o verdadera, se ejecutan las instrucciones contenidas entre las llaves { } .

Pero, en caso contrario, es decir, si la condición no es cierta osea es falsa, se ejecutan las instrucciones contenidas entre las llaves del else.

Veamos a continuación, un ejemplo

// Ejemplo de la instrucción de control if-else
if (a > 0){
   a = a + 1;                // Se ejecuta si a > 0
}
else {
   a = a - 1;                // Se ejecuta si NO a > 0
}

7.2.3 Estructura switch – case

La sintaxis de la instrucción o estructura de control condicional switch es

switch (variable_condición) {
   case condición_1:
      // Bloque de instrucciones que se ejecuta si la condición_1 se cumple
      break;
   case condición_2:
      // Bloque de instrucciones que se ejecuta si la condición_2 se cumple
      break;

   ... ...

   case condición_n:
      // Bloque de instrucciones que se ejecuta si la condición_n se cumple
      break;
   default:
      // Bloque de instrucciones que se ejecuta si NINGUNA de las condiciones anteriores se cumple
      break;
}

En este caso estamos ante una estructura de control condicional que nos permite la comprobación de múltiples condiciones.

Realmente seria el equivalente de varios if-else anidados.

Esta instrucción nos permite evaluar la variable_condición y dependiendo de su valor ejecutar el bloque de instrucciones correspondientes.

A continuación un ejemplo de su uso que nos clarificará su funcionamiento

// d es una variable que contiene el valor de la dirección de una pelota que rebota en pantalla
// d = 1 --> dirección de pelota arriba
// d = 2 --> dirección de pelota derecha
// d = 3 --> dirección de pelota abajo
// d = 4 --> dirección de pelota izquierda
// (x,y) es la posición x,y del plano de pantalla que ocupa la pelota

switch (d) {
   case 1:
      y = y - 1;   // desplazamos la pelota un pixel hacia arriba
      break;
   case 2:
      x = x + 1;   // desplazamos la pelota un pixel hacia la derecha
      break;
   case 3:
      y = y + 1;   // desplazamos la pelota un pixel hacia abajo
      break;
   case 4:
      x = x - 1;   // desplazamos la pelota un pixel hacia la izquierda
      break;
   default:
      error("Valor d incorrecto");  // Mostramos un error, pues la variable d tendría un valor incorrecto.
      break;
}

Si la variable que debemos evaluar no tiene un valor evaluado por ningún case entonces se ejecutará el bloque de instrucciones de default.

Es importante destacar y tener en cuenta, como hemos podido observar, que cada bloque de instrucciones de case debe terminar con la instrucción break; Esto es así para indicar que una vez ejecutado el conjunto de instrucciones correspondientes al bloque case el flujo del programa debe terminar y salir de la estructura condicional switch-case y continuar con la siguiente instrucción. En caso contrario podemos generar un comportamiento no esperado en nuestro programa.

7.3 Estructuras de Bucles

A continuación veremos con más detalle este tipo de estructuras.

7.3.1 Estructura for

La sintaxis de un bucle for es la siguiente

for (inicialización; condición; instrucción) {
   // Bloque de instrucciones que se ejecutan un número finito n de veces
}

En esta definición encontramos varias partes que vamos a explicar brevemente

  • Inicialización, se utiliza para inicializar variables que vamos a utilizar dentro del bucle. Durante la ejecución del bucle, solo se ejecuta una única vez al principio.
  • Condición, nos permite definir cuándo debe terminar el bucle. El bucle se ejecutará hasta que la condición sea 0 o false.
  • Instrucción, suele utilizarse para incrementar o disminuir variables que intervienen normalmente en la condición.

En un bucle for no siempre estarán presentes las tres partes enumeradas: inicialización, condición e instrucción.

Vamos a ver un ejemplo de bucle for

// Ejemplo de Bucle for
int ciclo = 0;

for (i = 0; i < 10; i = i +1){
   ciclo = ciclo + 1;
}

// Al finalizar el bucle for la variable ciclo tendrá un valor de 10
// ya que el bucle se habrá ejecutado 10 veces (valor de i de 0 a 9)

En el ejemplo anterior, las partes del for serían

  • Inicialización, se asigna el valor 0 a la variable i en la primera ejecución del bucle for
  • Condición, cada iteración o ciclo del bucle se comprueba si se cumple i < 10. Si es verdadera se vuelve a ejecutar ciclo = ciclo + 1. En caso de ser falsa se ejecutaría la siguiente instrucción al bucle for.
  • Instrucción, cada iteración o ciclo del bucle se incrementa la variable i en 1

Un caso especial de finalización del bucle for anticipadamente se produciría si se ejecutara una sentencia break dentro del bloque de instrucciones del bucle. En ese caso esta instrucción provocaría la salida inmediata del bucle y la continuación de la ejecución de las sentencias o instrucciones siguientes al mismo.

El bucle for es muy versátil como irás comprobando con la práctica y es muy utilizado en la programación, desde condiciones muy simples hasta bastante complejas que nos permitirán aprovechar su gran potencial.

Uno de los usos más habituales de un bucle for es para recorrer los elementos de una array.

7.3.2 Estructura while

Es otra estructura de bucle cuya sintaxis es

while (condición) {
   // Bloque de instrucciones que se ejecutan mientras se cumpla la condición
}

En este caso, nos hayamos ante un tipo de bucle cuyo bloque de instrucciones se ejecuta mientras se cumpla la condición.

Se saldrá del bucle cuando la condición no se cumpla, es decir que ésta sea falsa, o cuando se ejecute una instrucción break.

Las diferencias con el bucle for son

  • En el caso del while no conocemos el número máximo de ejecuciones que pueden realizarse
  • En el caso del while no es necesario que estemos ante un bucle finito, pues puede darse el caso de ejecutarse infinitamente mientras no se apague o se pulse el reset de la placa Arduino.

Por ejemplo un bucle while con ejecución infinita sería

// Ejemplo de un while que no termina mientras no se apague o resetee Arduino
// ya que la condición siempre será verdadera, siempre se cumple

while (true) {
   // Instrucciones diversas, menos break
}

Tanto en el caso del bucle for como en el while podemos interrumpir la ejecución de una iteración y continuar la siguiente mediante la instrucción continue.

Veamos el funcionamiento de continue con un ejemplo, cuya explicación está en los comentarios del mismo.

// Ejemplo de instrucción continue
// También funcionaría de forma similar en un bucle for

a = 0;

while (a < 10) {
   a = a + 1;
   if (a % 2 == 0) {   // Esta condición es a modulo 2, es decir el resto de dividir a por 2
      continue;        // Cuando el resto es 0, es decir, el número es par se salta el resto de instrucciones
   }                   // del bucle y se vuelve al principio del while
   
   // Resto de instrucciones del bucle while
   // Pero estas instrucciones solo se ejecutarán cuando a es impar
   // Ya que cuando es impar el continue devuelve el control al principio del bucle while de nuevo
}   

7.3.3. Estructura do-while

La sintaxis de esta estructura de bucle es

do {
   // Bloque de instrucciones que se ejecutan mientras se cumpla la condición
while (condición);

Estamos de una estructura muy similar a la anterior while, con una única diferencia

  • En el while la condición se verifica al iniciar el bucle. Por lo tanto, se debe cumplir ésta para entrar en el bucle.
  • Por el contrario en el do-while la condición se verifica al finalizar el bucle. Es decir, la primera vez se ejecutará siempre el bloque de instrucciones que están dentro del mismo, tanto si la condición es cierta como si no lo es.

Aunque el matiz es pequeño, resultan útiles ambas estructuras, dependiendo de la casuística concreta del algoritmo.

Para recordar y simplificando mucho la diferencia principal entre el while y el do-while, consiste en que con el do-while nos aseguramos que las instrucciones del bloque interior del mismo se ejecutan siempre al menos una vez.

7.4 Estructura Especial goto

En el caso de goto es una instrucción remanente de los primeros lenguajes Basic en los que cada línea de código iba precedida de un número que la identificaba.

Un ejemplo sencillo que limpia la pantalla de texto e imprime infinitamente el conocido «Hola Mundo» sería el siguiente

10 REM Ejemplo de programa en lenguaje BASIC
20 CLS
30 PRINT("HOLA MUNDO")
40 GOTO 30

En el caso del lenguaje Arduino la instrucción goto se comporta de una forma similar. Su sintaxis sería

etiqueta_1:
   // Instrucciones
   ...
   // y mas instrucciones

goto etiqueta_1;

Su funcionamiento permite saltar la ejecución del programa a la parte del código marcada previamente con el nombre de la etiqueta que utilizamos en la instrucción goto.

Como he indicado, esta instrucción es meramente residual y su uso totalmente desaconsejable por hacer el código lioso, engorroso y poco legible. Esta orden ya creaba y crea situaciones de errores de ejecución algorítmica cuanto más se emplea su uso y mayor es el código del programa.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies