# Bloques de operaciones Los bloques de esta categoría describen transformaciones de información. Cada operación toma una determinada cantidad de operandos de ciertos tipos y generan nueva información a partir de ellos. Así como los bloques de valores, los bloques de operaciones también tienen tipo. ## Comparación BLOCK:logic_compare@eq: BLOCK:logic_compare@gt: Este bloque describe la comparación entre dos expresiones. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. En el caso de la igualdad (_=_) y la desigualdad (_≠_) los operandos pueden ser de cualquier tipo pero deben ser del mismo (no se puede comparar un número con un texto). Para las demás operaciones, los operandos deben ser números. El resultado es un valor binario. ## Conjunción y Disyunción BLOCK:logic_operation@and: BLOCK:logic_operation@or: Este bloque describe la conjunción o la disyunción de dos expresiones lógicas. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. Los operandos deben ser valores binarios. El resultado también es un valor binario. En el caso de la conjunción (_y_) el resultado es _verdadero_ si ambos operandos son verdaderos. En el caso de la disyunción (_o_) el resultado es _verdadero_ si alguno de los operandos es verdaderos (o ambos lo son). ## Negación Lógica BLOCK:logic_negate: Este bloque describe la negación lógica de una expresión. El operando debe ser un valor binario. El resultado también es un valor binario. Si el operando es _verdadero_ el resultado será _falso_. Si el operando es _falso_ el resultado será _verdadero_. ## Operación Aritmética Binaria BLOCK:math_arithmetic@plus: BLOCK:math_arithmetic@times: Este bloque describe una de las principales operaciones aritméticas binarias. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. En todos los casos los operandos son números y el resultado de la operación también es un número. Si ambos operandos son números enteros, el resultado también será un número entero pero si alguno de ellos es una fracción, el resultado será una fracción. ## Operación Aritmética Unaria Simple BLOCK:math_single1@neg: BLOCK:math_single1@abs: Este bloque describe una de las principales operaciones aritméticas unarias. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. El operando debe ser un número. El tipo del resultado será el mismo que el del operando. Si el operando es entero, el resultado será entero. Si el operando es una fracción, el resultado será una fracción. El signo de menos (_-_) describe la versión negativa del operando. Si este ya es un número negativo, el resultado será su contraparte positiva. Esta operación es equivalente a multiplicar el operando por _-1_. El _valor absoluto de_ siempre describe la versión positiva del operando. Si el operando es positivo describe al mismo número. Si el operando es negativo describe a su contraparte positiva. ## Operación Aritmética Unaria Compleja BLOCK:math_single2@sqr: BLOCK:math_single2@log10: Este bloque describe una operación aritmética unaria compleja. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. El operando debe ser un número. El resultado es una fracción. ## Operación Trigonométrica BLOCK:math_trig: Este bloque describe una operación trigonométrica. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. El operando debe ser un número. El resultado es una fracción. ## Propiedad Matemática BLOCK:math_number_property: Este bloque describe una propiedad sobre un número. Utilizando el menú desplegable en el centro del bloque se puede seleccionar la operación deseada. El operando debe ser un número. El resultado es un valor binario. En el caso de _es divisible por_ toma un segundo operando, también numérico. ## Redondeo BLOCK:math_round: Este bloque describe el número entero resultante de redondear a la fracción operando. Si el operando es un número entero, describe al mismo número. Por defecto (_redondear_) redondéa al número entero más cercano. Utilizando el menú desplegable en el centro del bloque se puede cambiar para redondear hacia arriba o hacia abajo. ## Resto BLOCK:math_modulo: Este bloque describe el resto de realizar una operación de división entera. Ambos operandos deben ser números enteros. El resultado es un número entero. ## Vacuidad de un Texto BLOCK:text_isEmpty: Este bloque indica si el operando es un texto vacío (es decir, si no tiene ningún caracter). El operando debe ser un texto. El resultado es un valor binario. ## Longitud de un Texto BLOCK:text_length: Este bloque describe la cantidad de caracteres de un texto. No cuenta sólo letras sino también números y espacios. La longitud del texto "_Es 42 !_" es siete ya que tiene dos letras, dos números, dos espacios y un signo de exclamación. El operando debe ser un texto. El resultado es un número entero. ## Unión de Textos BLOCK:text_join: Este bloque describe el texto resultante de unir dos (o más) textos. Los operandos pueden ser de cualquier tipo, ya que se convierten a textos al ser ingresados como operandos del bloque. El resultado es un texto. Utilizando el engranaje se puede cambiar la cantidad de operandos. Tener en cuenta que si se quieren unir palabras para formar frases, se deben intercalar espacios entre ellas. Por ejemplo, el resultado de unir los textos "_Hola_" y "_Mundo_" no es "_Hola Mundo_" sino "_HolaMundo_". ## Vacuidad de una Lista BLOCK:lists_isEmpty: Este bloque indica si el operando es una lista vacía (es decir, si no tiene ningún elemento). El operando debe ser una lista. El resultado es un valor binario. ## Longitud de una Lista BLOCK:lists_length: Este bloque describe la cantidad de elementos en una lista. El operando debe ser una lista. El resultado es un número entero. ## Acceso a una Lista BLOCK:operacion_lista_acceso@get: Este bloque describe uno de los elementos de una lista. El operando debe ser una lista. El resultado es del tipo de los elementos de la lista operando. Si el operando es una lista de números, el resultado será de tipo número. Utilizando el menú desplegable se puede seleccionar cuál es el elemento que se desea obtener, en base a su posición dentro de la lista. Cuando la opción seleccionada es _el elemento en la posición_ o _el elemento en la posición (desde el final)_ se debe proveer otro operando de tipo entero para describir la posición. ## Inserción en una Lista BLOCK:operacion_lista_acceso@insert: BLOCK:operacion_lista_acceso@insert_statement: Este bloque permite insertar un elemento en una lista. El operando correspondiente a la lista debe ser de tipo lista. El operando correspondiente al elemento debe ser del tipo de los elementos de la lista. Utilizando el menú desplegable se puede seleccionar en qué posición dentro de la lista se desea insertar el elemento. Cuando la opción seleccionada es _en la posición_ o _en la posición (desde el final)_ se debe proveer otro operando de tipo entero para describir la posición. En modo comando modifica la lista operando insertando el elemento en ella. En modo expresión describe una nueva lista (la resultante de insertar el elemento en la lista operando) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Remoción de una Lista BLOCK:operacion_lista_acceso@remove: BLOCK:operacion_lista_acceso@remove_statement: Este bloque permite quitar un elemento de una lista. El operando debe ser de tipo lista. Utilizando el menú desplegable se puede seleccionar cuál es el elemento que se desea quitar, en base a su posición dentro de la lista. Cuando la opción seleccionada es _el elemento en la posición_ o _el elemento en la posición (desde el final)_ se debe proveer otro operando de tipo entero para describir la posición. En modo comando modifica la lista operando quitando el elemento de ella. En modo expresión describe una nueva lista (la resultante de quitar el elemento de la lista operando) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Indexado en una Lista BLOCK:lists_indexOf: BLOCK:lists_indexOf@count: Este bloque permite indexar un elemento dentro de una lista. El operando correspondiente a la lista debe ser de tipo lista. El operando correspondiente al elemento debe ser del tipo de los elementos de la lista. El resultado es un número. Utilizando el menú desplegable se puede seleccionar el tipo de indexado a realizar. La _primera aparición_ y la _última aparición_ describen las posiciones (la primera y la última respectivamente) dentro de la lista en las que se encuentra un determinado elemento. Si el elemento no se encuentra, el resultado es igual a _0_. La _cantidad de apariciones_ describe la cantidad de veces que dicho elemento se encuentra en la lista. ## Reemplazo en una Lista BLOCK:operacion_lista_acceso@set: BLOCK:operacion_lista_acceso@set_statement: Este bloque permite reemplazar un elemento de una lista por otro. El operando correspondiente a la lista debe ser de tipo lista. El operando correspondiente al elemento debe ser del tipo de los elementos de la lista. Utilizando el menú desplegable se puede seleccionar cuál es el elemento que se desea reemplazar, en base a su posición dentro de la lista. Cuando la opción seleccionada es _el elemento en la posición_ o _el elemento en la posición (desde el final)_ se debe proveer otro operando de tipo entero para describir la posición. En modo comando modifica la lista operando reemplazando el elemento en ella. En modo expresión describe una nueva lista (la resultante de reemplazar el elemento en la lista operando) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Operación Matemática sobre Lista BLOCK:math_on_list: Este bloque describe una operación matemática aplicada a una lista. Utilizando el menú desplegable se puede seleccionar la operación deseada. El operando debe ser una lista de números. La _suma_ describe la suma de todos los elementos de la lista. El resultado es un número. El _mínimo_ y el _máximo_ describen al elemento más chico y al más grande, respectivamente, de entre todos los elementos de la lista. El resultado es un número. El _promedio_ describe el resultado de sumar todos los elementos de la lista y luego dividir ese número por la cantidad de elementos en la lista. El resultado es una fracción. La _mediana_ describe al elemento que queda en el medio de la lista si se ordenan sus elementos. Si la lista tiene cantidad par de elementos, el resultado es un promedio entre los dos más cercanos al medio. El resultado es un número. La _moda_ describe al elemento que más veces aparece en la lista. Si hay más de uno, describe al primero encontrado. El resultado es un número. ## Recorte de Listas BLOCK:operacion_lista_modificacion@sub: Este bloque permite recortar una parte de una lista. El operando debe ser una lista. Utilizando los menúes desplegables se pueden seleccionar los límites entre los cuales recortar la lista. Si las opciones seleccionadas son _el principio_ y _el final_ la lista resultante es la misma que la lista operando. Cuando la opción seleccionada es _la posición_ o _la posición (desde el final)_ se debe proveer otro operando de tipo entero para describir la posición. En modo comando modifica la lista operando recortándola entre los límites declarados. En modo expresión describe una nueva lista (la resultante de recortar la lista operando entre los límites declarados) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Ordenamiento de Listas BLOCK:operacion_lista_modificacion@sort: Este bloque permite ordenar los elementos de una lista. Utilizando los menúes desplegables se puede seleccionar el criterio para ordenar. Si el criterio es _numérico_, el operando debe ser una lista de números. Si el criterio es _alfabético_ o _alfabético, ignorar mayúscula/minúscula_, el operando debe ser una lista de textos. En modo comando modifica la lista operando ordenándola según el criterio. En modo expresión describe una nueva lista (la resultante de ordenar la lista operando según el criterio) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Inversión de Listas BLOCK:operacion_lista_modificacion@reverse: Este bloque permite invertir el orden de la lista. El operando debe ser una lista. En modo comando modifica la lista operando invirtiendo el orden de sus elementos. En modo expresión describe una nueva lista (la resultante de invertir la lista operando) pero sin modificar la lista operando. El modo se puede cambiar desde el menú avanzado del bloque que se abre al hacer clic en la flecha blanca en el extremo izquierdo del bloque. ## Proyección BLOCK:base_map: Describe el resultado de proyectar un número dentro de un rango sobre otro rango. El resultado se corresponde a aquel número cuya proporción sobre el segundo rango es la misma que la del número operando sobre el primer rango. El primer operando debe ser un número. El segundo operando debe ser un rango. El tercer operando debe ser un rango. Además, el primer operando debe pertenecer al rango del segundo operando. Esta operación es útil para convertir una proporción sobre un rango en una proporción sobre otro rango. Por ejemplo, para hacer que la intensidad de un actuador sea proporcional a la intensidad medida por un sensor se podría simplemente conectar el bloque que describe la medición realizada por el sensor en el operando correspondiente a la intensidad del actuador. Sin embargo, el rango de valores posibles del sensor podría no coincidir con el rango de valores admitidos por el actuador. Si por ejemplo se conecta la salida del sonar (que describe valores entre 0 y 50) como operando para el ángulo de un servo (que espera valores entre 0 y 180), el movimiento del servo estará restringido únicamente a los valores posibles del sonar. Si se proyecta la medición del sonar del rango _0 - 50_ al rango _0 - 180_ se logra el comportamiento esperado.