4. Ahora empecemos con lo nuevo: Los sensores

4.1. Bloques condicionales de programación: ¿Cómo hacemos que tome decisiones?

Para que nuestro Q-Scout pueda tomar una decisión en función de lo que percibe por medio de sus sensores, es necesario utilizar unos bloques llamados condicionales. Estos bloques requieren de que el programador defina una condición para que se ejecute una serie de instrucciones que se encuentran dentro del bloque condicional. 

Este bloque como resultado de evaluar una condición puede obtener como resultado (valores lógicos o booleanos)  un verdadero o un falso. En el caso de que resulte verdadero se va a ejecutar las instrucciones dentro del bloque condicional, si la evaluación de la condición resultara ser falsa no se ejecutaría el conjunto de instrucciones dentro del bloque condicional y se pasaría directamente al próximo bloque que se encuentra debajo.  

Vamos con un ejemplo para que se entienda mejor. 

Este programa se puede interpretar de la siguiente manera: El Q-Scout va a avanzar y luego se preguntará ¿el valor que me indica el sensor ultrasónico (recordemos que es la distancia a la que se encuentra un obstáculo frente a él) es menor a 10 (nos referimos a centímetros)? Si la respuesta a esa pregunta resulta ser que sí (verdadero), entonces el robot se va a detener y tocar una nota (seria como un aviso). Ahora bien, si la respuesta a la pregunta resultaràáser que no (falso), entonces el Q-Scout ignoraria a los bloques (detener movimiento y tocar nota) dentro del bloque condicional y seguiría con la intruciòn o bloque que sigue, en este caso el de girar a la derecha. Y como todo está dentro de un bloque de repetir por siempre, el proceso se vuelve a repetir indefinidamente. 

Bloques condicionales

Antes de iniciar juguemos un rato para entender mejor: 

https://pilasbloques.program.ar/online/#/desafio/242 

https://pilasbloques.program.ar/online/#/desafio/246 

Como pudimos apreciar hay dos bloques que le permiten decidir a Churrasco, los bloques condicionales, el simple y el doble o compuesto.

El simple es el que ya vimos y explicamos más arriba. 

Este evalúa una condición y solo en el caso de que resulte verdadera va a ejecutar los bloques que se encuentren dentro, y si fuera falso los va a ignorar. Ahora bien, ¿qué pasa si queremos que nuestro amigo robótico tenga la posibilidad de hacer dos cosas diferentes o de seguir uno de dos caminos posibles en función de la evaluación de una condición?. Para ello necesitamos utilizar el bloque de condiciòn doble o compuesto. 

En este caso, el bloque va a evaluar la condición y de resultar verdadera va a ejecutar un conjunto de bloques o de instrucciones y sino (es decir, falso) va a ejecutar otro conjunto de bloques o instrucciones. Veamos un ejemplo.

Este programa se puede interpretar de la siguiente manera: El Q-Scout va a avanzar y luego se preguntará ¿el valor que me indica el sensor ultrasónico (recordemos que es la distancia a la que se encuentra un obstáculo frente a él) es menor a 10 (nos referimos a centímetros)? Si la respuesta a esa pregunta resulta ser que sí (verdadero), entonces el robot se va a detener y tocar una nota (seria como un aviso). Ahora bien, si la respuesta a la pregunta resultara ser que no (falso), entonces el Q-Scout realizaría lo definido en la otra parte del bloque condicional, en este caso, girar a la derecha. Y como todo está dentro de un bloque de repetir por siempre, el proceso se vuelve a repetir indefinidamente. 

Bloques condicionales anidados

Los bloques condicionales anidados consisten en tener una instrucción condicional dentro de otra, es decir, dependiendo de la veracidad o falsedad de la primera condición se deriva otra condición. De esta manera nos queda una condición dentro de otra.

¿Cómo hacemos para que nuestro Q-Scout tenga la posibilidad de seguir más de dos caminos?

Podemos incluir un bloque condicional dentro de otro de esta forma el Q-Scout tendría tres posibilidades. A esto se llama anidamiento

 Veamos un ejemplo: 

Aqui vemos que si un valor es mayor a cero prenderà la luz de color rojo, que si es menor que cero prenderá la luz de color amarilla y sino es mayor ni menor a cero entonces es igual a cero y entonces prenderá la de color verde. 

Si quisiéramos que nuestro amigo robótico tenga más de tres posibles caminos a seguir solo tendríamos que añadir otro bloque condicional compuesto dentro de el último. 

Si tienes problemas para comprender la lógica del anidamiento puedes armar las diferentes condiciones de forma separada utilizando el bloque condicional simple. 

Operadores

Como pudiste notar en las condiciones de los programas de ejemplos se utilizó un bloque con esta forma , el mismo se utiliza para comparar o relacionar un valor con otro y poder definir si el primer valor es menor que el segundo valor. Esta relación o comparación puede resultar verdadera o falsa. 

Para poder acceder a los bloques operadores debemos ir al área de “bloques de construcción” y dentro de la sección llamada “operadores” y dentro nos vamos a encontrar con los siguientes: 

Los primero son los llamados operadores aritméticos y son los utilizados para operar valores numéricos, es decir, para sumarlos, restarlos, dividirlos y multiplicarlos. 

El segundo grupo corresponde a los operadores relacionales, como su nombre indica sirven para establecer relaciones entre valores. Con ellos podemos decir si un valor es menor, mayor o igual a otro. 

Por último, en el tercer grupo encontramos los operadores lógicos y nos van a servir para trabajar con las condiciones dentro de los bloques condicionales en principio.

El operador "Y" se utiliza para unir dos bloques booleanos y ambos deben ser verdaderos para que el resultado sea verdadero. Si solo uno o ninguno de los bloques es verdadero, el resultado será falso. Este operador se puede apilar para probar múltiples condiciones.

El operador "O" devuelve verdadero si al menos una de las condiciones es verdadera. Si ninguna de las condiciones es verdadera, el resultado será falso. Este operador también se puede apilar para probar múltiples condiciones.

El operador "NO" invierte el valor booleano de la entrada, devolviendo el valor opuesto. En este curso no utilizaremos este operador…por el momento.