Las estructuras semánticas de un lenguaje que no tienen como objetivo dejar como resultado un dato sino controlar algún aspecto de nuestro algoritmo, como lo son aquellas entidades que permiten controlar el flujo de la lógica, las llamarlos instrucciones, y en esa categoría caen “órdenes” especiales, como por ejemplo las transferencias condicionales o incondicionales que veremos más adelante.
Esto no quiere decir que una instrucción semántica no pueda “dejar” un valor: habrá instrucciones especiales que, a pesar de que controlan el flujo o dirección de un algoritmo, luego que lo hacen son capaces de dejar un valor, y en ese caso podemos involucrar dichas instrucciones dentro de expresiones, lo que garantiza flexibilidad y expresividad en la escritura de un algoritmo.
Esto no quiere decir que una instrucción semántica no pueda “dejar” un valor: habrá instrucciones especiales que, a pesar de que controlan el flujo o dirección de un algoritmo, luego que lo hacen son capaces de dejar un valor, y en ese caso podemos involucrar dichas instrucciones dentro de expresiones, lo que garantiza flexibilidad y expresividad en la escritura de un algoritmo.
EXPRESIONES Y FUNCIONES
Definiremos expresión, a la combinación de valores y funciones, donde las funciones “operan” sobre valores o datos que denominamos argumentos para obtener un valor, resultado de la expresión reducida. Las funciones paramétricas reciben valores como argumentos usados.
Todos hemos intentado alguna vez sumar dos números. Los argumentos son los números, y la función es la suma que se define con dos parámetros, y que es la acción ejercida sobre los argumentos. En la expresión 4 + 5, 4 y 5 son argumentos y + es la función sobre dos parámetros.
Un argumento es un valor sobre el que va a actuar una función. El valor puede generarse desde el resultado de otra función.
Todos hemos intentado alguna vez sumar dos números. Los argumentos son los números, y la función es la suma que se define con dos parámetros, y que es la acción ejercida sobre los argumentos. En la expresión 4 + 5, 4 y 5 son argumentos y + es la función sobre dos parámetros.
Un argumento es un valor sobre el que va a actuar una función. El valor puede generarse desde el resultado de otra función.
Expresión
Es un valor único, o una combinación de valores, que a su vez son argumentos de funciones, y cuyos resultados se convierten en argumentos para otras funciones, buscando obtener un valor o conjunto de valores resultante.
En pocas palabras, una expresión tiene que devolver un valor, y en informática, es posible hablar de valor nulo.
Las expresiones son entonces mezclas de acciones sobre datos, sin importar qué tan complejo sea ese accionar sobre los datos. Sin embargo, la característica fundamental de cualquier expresión es que “deja” como resultado un nuevo dato que podría ser usado por otra función, o podría ser almacenado en una variable, o simplemente desechado.
En pocas palabras, una expresión tiene que devolver un valor, y en informática, es posible hablar de valor nulo.
Las expresiones son entonces mezclas de acciones sobre datos, sin importar qué tan complejo sea ese accionar sobre los datos. Sin embargo, la característica fundamental de cualquier expresión es que “deja” como resultado un nuevo dato que podría ser usado por otra función, o podría ser almacenado en una variable, o simplemente desechado.
Expresiones Irreductibles
Supongamos el dato 5 que es de tipo ::Z+. El número entero 5 es una expresión, pues por si sola, es capaz de expresar valor a pesar de que simplemente es un dato, por lo que diremos que trata de una expresión que no puede ser reducida.
Por otro lado, la expresión (3 + 3) de tipo ::Z+ es una expresión reducible que resultará en el dato irreducible 6 de tipo ::Z+.
En el caso de tipos que no son números, también hablamos de expresiones. Por ejemplo, el valor lógico o booleano .t. es irreducible por si solo, pero puede ser operado con operadores relacionales o lógicos de forma individual en contexto unarios como es el caso de la negación, o junto a otro valor booleano en contextos binarios.
También cuando hablamos de caracteres y cadenas caracteres (como en el texto, “Hola”, o el texto “Χάρηκα”, o el texto “स्वागत” del tipo ::String), podemos hablar de expresiones, ya que son datos sobre los que podemos accionar con funciones.
Uno de los tipos más interesantes es el tipo caracter ::Char, ya que no solo representa letras y grafemas en cualquier alfabeto, runas, etc., sino que también representa un valor entero asociado a su código UNICODE, y por tal motivo se puede usar como un número entero cualquiera dentro de las expresiones. Por ejemplo, la expresión ‘त’ + ‘ρ’ tendrá como resultado un dato de tipo ::Z a pesar de que la función resta se está dando sobre argumentos de tipo ::Char.
O también podríamos aplicar un operador unario antes del caracter, para convertirlo a un entero. Por ejemplo, -‘A’ daría como resultado -65.
Por otro lado, la expresión (3 + 3) de tipo ::Z+ es una expresión reducible que resultará en el dato irreducible 6 de tipo ::Z+.
En el caso de tipos que no son números, también hablamos de expresiones. Por ejemplo, el valor lógico o booleano .t. es irreducible por si solo, pero puede ser operado con operadores relacionales o lógicos de forma individual en contexto unarios como es el caso de la negación, o junto a otro valor booleano en contextos binarios.
También cuando hablamos de caracteres y cadenas caracteres (como en el texto, “Hola”, o el texto “Χάρηκα”, o el texto “स्वागत” del tipo ::String), podemos hablar de expresiones, ya que son datos sobre los que podemos accionar con funciones.
Uno de los tipos más interesantes es el tipo caracter ::Char, ya que no solo representa letras y grafemas en cualquier alfabeto, runas, etc., sino que también representa un valor entero asociado a su código UNICODE, y por tal motivo se puede usar como un número entero cualquiera dentro de las expresiones. Por ejemplo, la expresión ‘त’ + ‘ρ’ tendrá como resultado un dato de tipo ::Z a pesar de que la función resta se está dando sobre argumentos de tipo ::Char.
O también podríamos aplicar un operador unario antes del caracter, para convertirlo a un entero. Por ejemplo, -‘A’ daría como resultado -65.
Notación infija
La forma natural en que estamos acostumbrados a trabajar con funciones u operadores binarios (dos operandos y un operador) es la forma infija, donde el operador está entre los operandos; esto es, lo ponemos entre ellos.
Op1 op Op2 #notación infija
Por ejemplo, si op es el operador suma (+), tendremos:
a + b
En este caso, el operador suma es aplicado a los operandos a y b. En nuestros algoritmos podremos usar esta notación [1].
[1] De igual manera que la notación infija es una convención, podríamos tener otras notaciones, como la sufija y la prefija.
Op1 op Op2 #notación infija
Por ejemplo, si op es el operador suma (+), tendremos:
a + b
En este caso, el operador suma es aplicado a los operandos a y b. En nuestros algoritmos podremos usar esta notación [1].
[1] De igual manera que la notación infija es una convención, podríamos tener otras notaciones, como la sufija y la prefija.
Notación funcional
La notación funcional nos permite escribir una expresión especificando primero el nombre de una función que equivale al operador, y, entre paréntesis los argumentos que equivalen a los operandos. Se le conoce también como notación prefija de Cambridge (Scott, 2019, p.287)
f(a , b) #notación funcional
Por ejemplo, si f es el operador suma (+), tendremos:
+(a , b)
f(a , b) #notación funcional
Por ejemplo, si f es el operador suma (+), tendremos:
+(a , b)
EJEMPLO.
Determine el área de un cuadrado dado su lado, usando notación infija y notación funcional. R/ Notación infija áreaCuadrado <- lado * lado Notación funcional áreaCuadrado <- *(lado , lado) EJEMPLO.
Determine la longitud de la circunferencia de un círculo dado su radio, usando notación infija y notación funcional. Dicha longitud se define como el doble del radio multiplicado por la constante p. R/ Notación infija áreaCírculo <- 2 * p * radio Notación funcional áreaCírculo <- *( * 2 , (p , radio)) EJEMPLO.
Determine el volumen de una esfera dado su radio, usando notación infija y notación funcional. El volumen de una esfera es de 4/3 de la constante pi, multiplicado por el cubo del radio. R/ Notación infija volumenEsfera <- 4 / 3 * p * radio ^ 3 Notación funcional volumenEsfera <- *(/(4 , 3) , *(p , ^(radio , 3))) |
Notación funcional reductora
Un operador o función podría aplicarse a una colección de datos de forma tal que se dé una reducción recursiva [Sco09, pp. 530].
En la notación funcional reductora, se toman los dos primeros datos y el resultado se usa para operar con el siguiente dato en la lista, de izquierda a derecha, y así sucesivamente hasta operar el último elemento, y el resultado nos queda para ser usado en expresiones.
f (Op1, Op2, Op3, …) #notación reductora
En la notación funcional reductora, se toman los dos primeros datos y el resultado se usa para operar con el siguiente dato en la lista, de izquierda a derecha, y así sucesivamente hasta operar el último elemento, y el resultado nos queda para ser usado en expresiones.
f (Op1, Op2, Op3, …) #notación reductora
EJEMPLO.
Determine la suma de los números j, d, b, a en notación infija, notación funcional, y notación funcional reductora. R/ Notación infija σ <- φ + δ + β + α Notación funcional σ <- +( +( +(φ , δ ) , β) , α) Notación reductora σ <- +(φ , δ , β , α) |
En muchos lenguajes de programación existe una función especial denominada reduce, que tiene como parámetro cualquier función binaria, y aplica de forma iterativa la función dada sobre una colección de datos. Primero comienza con los dos primeros, y el resultado lo usa para aplicar la función con el siguiente, y así sucesivamente. Solo para el caso de nuestros pseudocódigos, cualquier función binaria podrá ser usada como reductora de un conjunto de elementos.
FUNCIONES Y ARGUMENTOS
Todo operador es, en realidad, una función. Los lenguajes de programación realmente entienden los operandos como argumentos y operadores como funciones.
Es por eso por lo que la notación funcional es importante, y es recomendable entender que las expresiones deben ser vistas como la aplicación de funciones a argumentos [Sco09, p. 221].
Es por eso por lo que la notación funcional es importante, y es recomendable entender que las expresiones deben ser vistas como la aplicación de funciones a argumentos [Sco09, p. 221].
Aridad de funciones
La aridad de las funciones es el número de parámetros formales requeridos para que una función opere. Por ejemplo, la aridad de la función + es 2, pues requiere dos argumentos o valores que hay que asociar a los parámetros de la función suma. [1]
En el caso de funciones con dos parámetros como por ejemplo la suma, decimos que la función tiene aridad binaria. De igual forma hay funciones unarias que manejan un solo parámetro. Las funciones trigonométricas que nos enseñan en el colegio son ejemplos de funciones unarias, dado que reciben solo un valor, que es el ángulo.
También hay funciones que cumplen roles binarios y binarios, como es el caso del operador suma y resta ( + , - ).
Suponga la función resta, que puede ser usada para restar dos números, o puede ser usada para indicar la resta con el número cero(0).
Mientras que la expresión 0 - 4 presenta aridad binaria, la expresión - 4 presenta aridad unaria.
[1] La diferencia entre argumentos y parámetros, es que los parámetros hacen parte de la definición formal de la función mientras que los argumentos son los valores que se asocian a cada uno de los parámetros al momento de usar la función en algún contexto de algún algoritmo. Esto quedará más claro cuando revisemos el tema de funciones.
En el caso de funciones con dos parámetros como por ejemplo la suma, decimos que la función tiene aridad binaria. De igual forma hay funciones unarias que manejan un solo parámetro. Las funciones trigonométricas que nos enseñan en el colegio son ejemplos de funciones unarias, dado que reciben solo un valor, que es el ángulo.
También hay funciones que cumplen roles binarios y binarios, como es el caso del operador suma y resta ( + , - ).
Suponga la función resta, que puede ser usada para restar dos números, o puede ser usada para indicar la resta con el número cero(0).
Mientras que la expresión 0 - 4 presenta aridad binaria, la expresión - 4 presenta aridad unaria.
[1] La diferencia entre argumentos y parámetros, es que los parámetros hacen parte de la definición formal de la función mientras que los argumentos son los valores que se asocian a cada uno de los parámetros al momento de usar la función en algún contexto de algún algoritmo. Esto quedará más claro cuando revisemos el tema de funciones.
Dirección de evaluación
Dada una expresión, su evaluación se deberá dar de izquierda a derecha, y el orden solo se verá alterado por la prelación (prioridad de evaluación) de los operadores, y por los operadores de agrupación.
Los operadores de asignación a izquierda o a derecha( <-, -> ), si existen, se ejecutarán desde el más interno al más externo, dejando rastro del valor para ser usado por otras expresiones más externas.
Hasta el momento, hemos sido descuidados en cómo una expresión es evaluada. Por ejemplo, la expresión 5 + 4 * 3, podría ser descuidadamente evaluada como 27, cuando, en realidad, prácticamente todos los lenguajes la evaluarían como 60. Nuestros algoritmos en pseudocódigo no serán la excepción.
Es conveniente entonces que revisemos primero los distintos tipos de expresiones, y determinemos con claridad cómo serán evaluadas dichas expresiones en nuestros algoritmos.
Los operadores de asignación a izquierda o a derecha( <-, -> ), si existen, se ejecutarán desde el más interno al más externo, dejando rastro del valor para ser usado por otras expresiones más externas.
Hasta el momento, hemos sido descuidados en cómo una expresión es evaluada. Por ejemplo, la expresión 5 + 4 * 3, podría ser descuidadamente evaluada como 27, cuando, en realidad, prácticamente todos los lenguajes la evaluarían como 60. Nuestros algoritmos en pseudocódigo no serán la excepción.
Es conveniente entonces que revisemos primero los distintos tipos de expresiones, y determinemos con claridad cómo serán evaluadas dichas expresiones en nuestros algoritmos.
EXPRESIONES ARITMÉTICAS
Hablamos de expresiones numéricas cuando aplicamos funciones (operaciones) aritméticas a datos para obtener un nuevo dato numérico. Las funciones aritméticas de los algoritmos que estaremos usando serán las operaciones binarias de aridez 2 tradicionales, a saber, suma, resta, multiplicación, exponenciación, división real, división entera y módulo.
Los operadores son:
+ , operador suma.
* , operador multiplicación.
- , operador resta.
/ , operador división. Entrega el cociente exacto de dividir dos números.
÷ , operador cociente. Entrega el cociente sin residuo de la división (parte entera).
% , operador módulo. Entrega el residuo entero de una división.
^ , operador exponencial. Entrega la base elevada a un exponente.
√ , operador raiz. Entrega la raíz cuadrada. Para otros radicales use ^ a una fracción.
Nota. Por tradición, la funcione multiplicar (* llamado asterisco), reemplaza el símbolo x tradicional de multiplicación, para evitar confusiones con la letra latina x.
Los operadores son:
+ , operador suma.
* , operador multiplicación.
- , operador resta.
/ , operador división. Entrega el cociente exacto de dividir dos números.
÷ , operador cociente. Entrega el cociente sin residuo de la división (parte entera).
% , operador módulo. Entrega el residuo entero de una división.
^ , operador exponencial. Entrega la base elevada a un exponente.
√ , operador raiz. Entrega la raíz cuadrada. Para otros radicales use ^ a una fracción.
Nota. Por tradición, la funcione multiplicar (* llamado asterisco), reemplaza el símbolo x tradicional de multiplicación, para evitar confusiones con la letra latina x.
EJEMPLO.
Identifique cuál de las dos respuestas que se muestran es la correcta para la operación 3 + 4 * 2 , (a) 14 (b) 11 R/ En programación imperativa tradicional, los lenguajes manejan prioridad para determinar el orden de evaluación de las operaciones, por lo que la respuesta correcta es la (b). La respuesta (a) no es correcta en pseudocódigos o en los lenguajes de programación, y eso se debe al uso del concepto de prioridad o prelación de los operadores que veremos a continuación. |
Precedencia de los operadores aritméticos
Dados los operadores aritméticos, definiremos que la suma y la resta tienen igual prioridad. También definiremos que la multiplicación (*) y las divisiones ( / , ÷) tienen también igual prioridad. Pero, se establece, que la prioridad de la multiplicación y la división es mayor a la prioridad de las operaciones de suma y resta. Eso nos permite eliminar ambigüedad.
En cuanto al operador exponente (^), diremos que tiene la máxima prioridad entre los operadores aritméticos. En ese orden de ideas, tenemos:
-25510
Esta forma de dar prelación a los operadores permite estructurar las expresiones de tal forma que se logre el objetivo. Y cuando el uso de estas prioridades no es adecuado para expresarse, o es insuficiente, aún puede usar paréntesis para agrupar expresiones.
Suponga que desea Resolver la expresión 8 + 5 * 2. Primero se resuelve la multiplicación dado que tiene más prioridad que la suma. La expresión ahora se convierte en 8 + 10. Por último, se resuelve la operación suma. El resultado es 18.
Pero ¿cómo hacerlo si se quisiera sumar 8 y 5 y el resultado multiplicarlo por 2? En este caso es mejor que contemos con algún otro operador.
Para todas estas situaciones, usaremos el operador paréntesis como veremos enseguida.
En cuanto al operador exponente (^), diremos que tiene la máxima prioridad entre los operadores aritméticos. En ese orden de ideas, tenemos:
-25510
- + , - ,√ unarios tienen mayor precedencia que todos los demás operadores
- +, - tienen menor precedencia que * y /
- % tiene menor precedencia que * y /, pero mayor que + y -
- +, -, %, * , / , ÷ tienen menor precedencia que ^
Esta forma de dar prelación a los operadores permite estructurar las expresiones de tal forma que se logre el objetivo. Y cuando el uso de estas prioridades no es adecuado para expresarse, o es insuficiente, aún puede usar paréntesis para agrupar expresiones.
Suponga que desea Resolver la expresión 8 + 5 * 2. Primero se resuelve la multiplicación dado que tiene más prioridad que la suma. La expresión ahora se convierte en 8 + 10. Por último, se resuelve la operación suma. El resultado es 18.
Pero ¿cómo hacerlo si se quisiera sumar 8 y 5 y el resultado multiplicarlo por 2? En este caso es mejor que contemos con algún otro operador.
Para todas estas situaciones, usaremos el operador paréntesis como veremos enseguida.
Agrupando aritmética con paréntesis
Los paréntesis juegan varios roles en programación. En el caso de las expresiones aritméticas, el rol de agrupar expresiones, de tal modo que primero se reducen las expresiones más internas en paréntesis hasta que ya no hay nada por reducir, y luego se procede normalmente de izquierda a derecha.
Esto significa entonces que los paréntesis tienen la prioridad más alta entre todos los operadores numéricos.
Esto significa entonces que los paréntesis tienen la prioridad más alta entre todos los operadores numéricos.
EJEMPLO.
Resolver y comparar los siguientes pares de expresiones: (1) (8 + 5) * 2 y 8 + 5 * 2 (2) 6 / 3 + 3 y 6 /( 3 + 3 ) (3) 6 + 3 * 2 / ( 3 + 4 / 2 ) y 6 + 3 * 2 / 3 + 4 / 2 (4) ( ( 8 + 12 ) / 4 ) / ( 5 – 2 ) y 8 + 12 / 4 / 5 - 2 (5) ‘B’ / ( 6 + 5 ) * ’G’y ‘B’ / 6 + 5 * ’G’ R/ (1) los paréntesis se resuelven primero, y la expresión queda (8 + 5 ) * 2 = 13 * 2 = 26 La multiplicación prima sobre la suma, y la expresión queda 8 + 5 * 2 = 8 + 10 = 18 (2) 6 / 3 + 3 = 2 + 3 = 5 6 / (3 + 3) = 6 / 6 = 1 (3) 6+3*2/(3+4/2) = 6+3*2/(3+2) = 6+6/(3+2) = 6+6/5 = 36/5 = 7.2 6+3*2/3+4/2 = 6+3*2/3+4/2 = 6+6/3+4/2 = 6+2+22 = 8+2 = 10 (4) (8+12)/4/(5-2) = 20/4/(5-2) = 5/(5-2) = 5/3 = 1.66666… 8+12/4/5-2 = 8+3/5-2 = 8+0.6-2 = 8.6–2 = 6.6 (5) los caracteres toman el valor de su código UNICODE [1]: ‘B’ / (6+5) * ’G’ = 66/11*71 = 6*71 = 426 ‘B’ / 6+5 * ’G’ = 66/6+5*71 = 11+355 = 366 [1] https:#unicode-table.com/en/ |
Hay que tener en cuenta que los operadores + y - también pueden ser aplicados con aridad 1 (unaria). Esto es, uno solo argumento.
Por ejemplo,
las expresiones -9, -12, +5, +4, es la aplicación de una función a un solo argumento. En lo que sigue, se muestran expresiones equivalentes:
4+-8*-2 = 4+(-8)*(-2)
Por ejemplo,
las expresiones -9, -12, +5, +4, es la aplicación de una función a un solo argumento. En lo que sigue, se muestran expresiones equivalentes:
4+-8*-2 = 4+(-8)*(-2)
Asignación ( <- , -> ) en expresiones
El operador de asignación permite asignar el resultado de una expresión a una variable como lo hacemos en el álgebra, y luego que una variable ha sido asociada a un valor, la variable podrá ser usada dentro de otras expresiones.
El operador de asignación a izquierda <-, o a derecha ->, se evalúan luego que una expresión sea evaluada completamente.
Varias expresiones separadas por coma (,) podrán ser llevadas de forma simultánea a varias variables por medio del uso del operador <-.
x <- 4*8 #x es 32
y <- 8 * 2 #x es 16
Un conjunto de valores también podrá ser usado para asignar sus valores en el orden en que aparecen, a un conjunto de variables, para cargarlas con valores hasta que ya no haya variables disponibles
x,y <- 4, 8*2 #x es 4 , y es 16
x,y,z <- 4+15*2 , 4+8/4 , 2^3+3 #x es 34, y es 6, z es 11
a,b,c <- (1,2,3) #a es 1, b en 2, c en 3
Un conjunto de valores también podrá ser usada para asignar sus valores en el orden en que aparecen, a un conjunto de variables, para cargarlas con valores hasta que ya no haya variables disponibles.
a,b,c <- (1,2,3,4,5) #los valores 4 y 5 no se usan
Una expresión podrá contener asignaciones intermedias, por ejemplo
y <- (x <- 4*8) / 2 #x es 32, y es 16
También se puede hacer asociación a la derecha, y de ese modo, la variable que está siendo asociada al valor, se ubica al lado derecho de la expresión. Por ejemplo
(x -> 4*8) / 2 -> y #x es 32, y es 16
(4*8 -> x) / 2 -> y #x es 32, y es 16
O una combinación
(x <- 4*8) / 2 -> y #x es 32, y es 16
Los lenguajes de programación solo permiten una dirección, aunque hay excepciones.
La recomendación es limitarse a una sola dirección, y no volver complejas las expresiones.
La idea de que en nuestros algoritmos en pseudocódigo permitamos ambas direcciones, es simplemente una decisión de flexibilidad, pues hay personas que en sus mentes solo aceptan una flecha a la derecha mientras se acostumbran y llegan a los lenguajes, y, cuando eso sucede, se enfrentan a la realidad de que prácticamente todos los lenguajes aceptan la variable de asociación a la izquierda.
El operador de asignación a izquierda <-, o a derecha ->, se evalúan luego que una expresión sea evaluada completamente.
Varias expresiones separadas por coma (,) podrán ser llevadas de forma simultánea a varias variables por medio del uso del operador <-.
x <- 4*8 #x es 32
y <- 8 * 2 #x es 16
Un conjunto de valores también podrá ser usado para asignar sus valores en el orden en que aparecen, a un conjunto de variables, para cargarlas con valores hasta que ya no haya variables disponibles
x,y <- 4, 8*2 #x es 4 , y es 16
x,y,z <- 4+15*2 , 4+8/4 , 2^3+3 #x es 34, y es 6, z es 11
a,b,c <- (1,2,3) #a es 1, b en 2, c en 3
Un conjunto de valores también podrá ser usada para asignar sus valores en el orden en que aparecen, a un conjunto de variables, para cargarlas con valores hasta que ya no haya variables disponibles.
a,b,c <- (1,2,3,4,5) #los valores 4 y 5 no se usan
Una expresión podrá contener asignaciones intermedias, por ejemplo
y <- (x <- 4*8) / 2 #x es 32, y es 16
También se puede hacer asociación a la derecha, y de ese modo, la variable que está siendo asociada al valor, se ubica al lado derecho de la expresión. Por ejemplo
(x -> 4*8) / 2 -> y #x es 32, y es 16
(4*8 -> x) / 2 -> y #x es 32, y es 16
O una combinación
(x <- 4*8) / 2 -> y #x es 32, y es 16
Los lenguajes de programación solo permiten una dirección, aunque hay excepciones.
La recomendación es limitarse a una sola dirección, y no volver complejas las expresiones.
La idea de que en nuestros algoritmos en pseudocódigo permitamos ambas direcciones, es simplemente una decisión de flexibilidad, pues hay personas que en sus mentes solo aceptan una flecha a la derecha mientras se acostumbran y llegan a los lenguajes, y, cuando eso sucede, se enfrentan a la realidad de que prácticamente todos los lenguajes aceptan la variable de asociación a la izquierda.
EJEMPLO.
Si se asume que las tres instrucciones están continuas, determine el valor de las variables a medida que se avanza. R/ x <- (4+2)*2 #x es 12 y <- x * 2 #y es 24 y <- y + 1 #y es 25 EJEMPLO: TUPLA DE VARIABLES.
Construya una expresión o expresines que, dados un par de valores (x,y), al cual se le asignarán valores 5 y 7 que corresponden a un punto en el plano cartesiano, determine la distancia al origen. Asigne valores al par coordenado. Asuma continuidad de valores entre las instrucciones. R/ x,y <- (5,7) #crear par coordenado con x es 5, y es 7 c <- x^2 + y^2 #c es 5^2 + 7^2 = 74 d <- c^0.5 #d es 8.6023 EJEMPLO: ECUACIÓN DESPLAZAMIENTO.
Construya expresiones para calcular el desplazamiento vertical en metros de un objeto usando la expresión x0 + v0.t – g.t2/2, donde x0, v0, y t, que corresponden a la posición inicial en metros, la velocidad inicial en m/s, y el tiempo transcurrido en segundos; g es la constante de gravitación terrestre y corresponde al valor 9.80665. Use valores arbitrarios. R/ x0 <- 5 v0 <- 10 t <- 20 g <- 9.80665 d <- x + v * t + (g * t ^ 2) / 2 |
Resumen precedencia operadores aritméticos
- +, - tienen menor precedencia que * y /.
- % tiene menor precedencia que * y /, pero mayor que + y -
- +, -, %, * , / , ÷ tienen menor precedencia que ^.
- + , - , √ unarios tienen mayor precedencia que los funciones binarias +, -, *, / , ÷ , %
- Los paréntesis ( y ) tienen mayor prioridad que todas las funciones numéricas.
- La función de asignación <- tiene la menor prioridad y se evalúa de derecha a izquierda.
Notación funcional y notación infija
La notación funcional ya vista puede ser empleada en expresiones aritméticas. Esta notación tiene la ventaja de que el uso obligado de los paréntesis define claramente el orden de evaluación.
Para pseudocódigos se podrá usar la notación funcional, y podrá ser combinada también con la notación infija. Algunos lenguajes de programación soportan dicha estrategia.
Para pseudocódigos se podrá usar la notación funcional, y podrá ser combinada también con la notación infija. Algunos lenguajes de programación soportan dicha estrategia.
EJEMPLO.
Exprese la siguiente expresión en notación funcional y luego reduzca x <- ( 4 + 2 ) * 2 / 2 R/ x <- / (*(+(4,2),2) ,2) #en notación funcional / (*( 6 ,2) ,2) #la operación más interna / ( 12 ,2) #la operación más interna x <- 6 Por lo tanto, el valor de x es 6 EJEMPLO.
Para el conjunto de expresiones que se presenta, evalúe paso a paso el valor que van tomando las variables a medida que se reducen las siguientes expresiones. En cada caso, identifique en qué tipo de representación (infija o funcional) está escrita la expresión. x <- *(+(4,2),2) y <- *(x,2) y <- +(1,y) y <- y+y w <- +(2*x, 1) R/ x <- *(+(4,2),2) #notación funcional. x es 16 y <- *(x,2) #notación funcional. y es 32 y <- +(1,y) #notación funcional. y es 33 y <- y+y #notación infija. y es 66 w <- +(2*x, 1) #notación híbrida. y es 66 |
EXPRESIONES LÓGICAS
Como su nombre lo indica, el resultado de una expresión lógica es un valor lógico o booleano. Un valor booleano es aquel que es falso (.f.) o verdadero (.t.).
En nuestros pseudocódigos, los posibles valores serán .f. o .t., .false. o .true.
El uso de los puntos antes y después del valor booleano son recomendable es para indicar que se trata de un valor y no de una variable con ese nombre.
En el caso de los lenguajes de programación, encontrará que solo existen dos valores sintácticamente válidos, y por eso se recomienda que en los pseudocódigos adopte los dos con los que mejor se acomode.
Los valores lógicos son importantes para el control de ejecución de un algoritmo, ya que sin ellos no sería posible bifurcar un flujo algorítmico. Esto lo veremos más adelante cuando estudiemos las transferencias condicionales y las incondicionales.
Hay cuatro funciones que son altamente comunes en programación, y que son las que estaremos usando en nuestros algoritmos más adelante. Estas cuatro funciones son la conjunción, la disyunción inclusiva, la disyunción exclusiva, y la negación.
En nuestros pseudocódigos, los posibles valores serán .f. o .t., .false. o .true.
El uso de los puntos antes y después del valor booleano son recomendable es para indicar que se trata de un valor y no de una variable con ese nombre.
En el caso de los lenguajes de programación, encontrará que solo existen dos valores sintácticamente válidos, y por eso se recomienda que en los pseudocódigos adopte los dos con los que mejor se acomode.
Los valores lógicos son importantes para el control de ejecución de un algoritmo, ya que sin ellos no sería posible bifurcar un flujo algorítmico. Esto lo veremos más adelante cuando estudiemos las transferencias condicionales y las incondicionales.
Hay cuatro funciones que son altamente comunes en programación, y que son las que estaremos usando en nuestros algoritmos más adelante. Estas cuatro funciones son la conjunción, la disyunción inclusiva, la disyunción exclusiva, y la negación.
Conjunción AND
Una conjunción lógica es una función de aridad binaria. Esto es, requiere de dos valores lógicos para reducir su conclusión.
La función de conjunción lógica toma tradicionalmente el nombre de AND lógico, y podremos escribirlo en nuestros seudocódigos como ∧ , ・, &, &&, o simplemente AND.
La función de conjunción lógica toma tradicionalmente el nombre de AND lógico, y podremos escribirlo en nuestros seudocódigos como ∧ , ・, &, &&, o simplemente AND.
definiciónUn AND es .true. sí y solo si sus dos operandos son .true. En cualquier otro caso es .false. Valores posibles para la función AND .t. ∧ .t. = .t. .t. ∧ .f. = .f. .f. ∧ .f. = .f. .f. ∧ .t. = .f. |
Cortocircuito de la función AND
Dada la tabla anterior, se ve que si el valor de la izquierda de la función es falsa, no es necesario valorar el de la derecha, ya que si el primero es falso, de inmediato el resultado será falso; por otro lado, en el caso que el valor de la izquierda sea verdadero, necesariamente se deberá revisar el de la derecha para determinar el resultado de la expresión lógica.
El cortocircuito es precisamente saber hasta dónde es suficiente hacer la evaluación.
El cortocircuito es precisamente saber hasta dónde es suficiente hacer la evaluación.
Disyunción inclusiva OR
Una disyunción inclusiva lógica es una función de aridad binaria.
La función de disyunción lógica inclusiva toma tradicionalmente el nombre de OR lógico, y podremos escribirlo en nuestros seudocódigos como ∨, +, | , ||, o simplemente OR.
La función de disyunción lógica inclusiva toma tradicionalmente el nombre de OR lógico, y podremos escribirlo en nuestros seudocódigos como ∨, +, | , ||, o simplemente OR.
definiciónUn OR es .false. si sus dos operandos son .false. En cualquier otro caso, es .true. Valores posibles para la función OR .f. ∨ .f. = .f. .f. ∨ .t. = .t. .t. ∨ .f. = .t. .t. ∨ .t. = .t. |
Cortocircuito de la función OR
Al igual que el operador AND, se puede cortocircuitar la función OR.
Se ve que si el valor de la izquierda del operador es verdadero, no es necesario valorar el de la derecha, ya que, si el primero es verdadero, de inmediato el resultado será verdadero.
Por otro lado, en el caso que el valor de la izquierda sea falso, necesariamente se deberá valorar el de la derecha para determinar el resultado de la expresión lógica.
Se ve que si el valor de la izquierda del operador es verdadero, no es necesario valorar el de la derecha, ya que, si el primero es verdadero, de inmediato el resultado será verdadero.
Por otro lado, en el caso que el valor de la izquierda sea falso, necesariamente se deberá valorar el de la derecha para determinar el resultado de la expresión lógica.
Disyunción exclusiva XOR
Una disyunción lógica exclusiva también es una función de aridad binaria.
Al igual que el operador de disyunción inclusiva y el operador de conjunción, requiere de dos valores lógicos para extraer una conclusión. El operador de disyunción lógica exclusiva toma tradicionalmente el nombre de XOR, y se escribe ⊕, ⊻, ≢, o simplemente XOR.
Al igual que el operador de disyunción inclusiva y el operador de conjunción, requiere de dos valores lógicos para extraer una conclusión. El operador de disyunción lógica exclusiva toma tradicionalmente el nombre de XOR, y se escribe ⊕, ⊻, ≢, o simplemente XOR.
definiciónUn XOR es .t. si ambos operandos lógicos son diferentes. De lo contrario es true. Nota: un xor es un or que se auto excluye para valores iguales, y por lo tanto, sólo es verdadero si sus dos valores de verdad son diferentes. Por eso se usa la palabra exclusiva. Valores posibles para la función XOR .f. ⊕ .t. = .t. .t. ⊕ .f. = .t. .f ⊕ .f. = .f. .t. ⊕ .t. = .f. |
El operador XOR podemos imaginarlo como un operador lógico diferencia (≠).
No hay cortocircuito para el operador XOR. Dada las condiciones del operador de disyunción lógico exclusivo, no es posible cortocircuitarlo, y ambos operadores, el de la izquierda y el de la derecha, siempre son valorados.
No hay cortocircuito para el operador XOR. Dada las condiciones del operador de disyunción lógico exclusivo, no es posible cortocircuitarlo, y ambos operadores, el de la izquierda y el de la derecha, siempre son valorados.
Negador NOT
Una negación lógica es una operación de aridad unaria, lo que significa que solo hay un valor lógico involucrado. Este operador toma tradicionalmente el nombre de NOT, y que podremos escribir en nuestros seudocódigos como ¬, ~, not o !.
definición.Un NOT invierte un valor de verdad. Valores posibles para la función NOT ¬ .f. = .t. ¬ .t. = .f. |
Precedencia de las funciones lógicas
La siguiente prioridad diferirá un poco si se compara con algunos lenguajes de programación, pero, en general, esta es la prelación que se aplica en casi todos los lenguajes (cuando esté programando en un lenguaje específico, deberá revisar las prioridades para dicho lenguaje).
La función NOT tiene mayor prioridad que la función AND, que, a su vez, tiene más fuerza que las funciones OR y XOR. En cuanto a las dos últimas, tienen la misma prelación.
Lo anterior significa que, para el caso que OR y XOR aparezcan de forma consecutiva, se evaluarán de izquierda a derecha.
La función NOT tiene mayor prioridad que la función AND, que, a su vez, tiene más fuerza que las funciones OR y XOR. En cuanto a las dos últimas, tienen la misma prelación.
Lo anterior significa que, para el caso que OR y XOR aparezcan de forma consecutiva, se evaluarán de izquierda a derecha.
En general, expresamos la precedencia de las cuatro funciones lógicas como:
NOT > AND > OR = XOR
NOT > AND > OR = XOR
EJEMPLO.
Determinar el valor de las siguientes expresiones ( 1 ) .t. ∧ .f. ( 2 ) .f ∨ .t. ∧ .t. ( 3 ) .t. ⊕ .t. ( 4 ) .t. ⊕ .f ∧ .f. ∨ .t. R/ (1) .t. ∧ .f. = .f. (2) .f. ∨ .t. ∧ .t. = .f. ∨ .t. = .t. (3) .t. ⊕ .t. = .f. (4) .t. ⊕ .f. ∧ .f. ∨ .t. = .t. ⊕ .f. ∨ .t. = .t. ∨ .t. = .t. |
Cambio de orden de evaluación
Al igual que con las funciones aritméticas, los paréntesis pueden ser usados para cambiar el orden en el que se llevan a cabo las expresiones lógicas.
Sin embargo, se debe tener cuidado de no evaluar segmentos de expresiones debido a cortocircuitos.
Sin embargo, se debe tener cuidado de no evaluar segmentos de expresiones debido a cortocircuitos.
EJEMPLO.
Determine el valor final de la variable w para la expresión w <- .t. ⊕ ( .f. ∧ .f. ∨ .t.) R/ w <- .t. ⊕ ( .f. ∧ .f. ∨ .t.) .t. ⊕ ( .f. ∨ .t.) .t. ⊕ .t. .f. EJEMPLO.
Determine el valor de la variable x en la expresión x <- .t. ⊕ ( .f. ∧ .f. ∨ .t.) ∨ (.t. ⊕ ( .f. ∧ .f. ∨ .t.)) R/ x <- .t. ⊕ ( .f. ∧ .f. ∨ .t.) ∨ (.t.⊕ ( .f. ∧ .f. ∨ .t.)) .t. ⊕ ( .f. ∨ .t.) ∨ (.t.⊕ ( .f. ∨ .t.)) .t. ⊕ .t. ∨ (.t.⊕ .t.) .f. ∨ (.t.⊕ .t.) .f. ∨ (.t.⊕ .t.) ∨ (.f.) .f. EJEMPLO.
Determine el valor de la variable x en la expresión x <- .t. ∨ ( .f. ∧ .f. ∨ .t.) ∨ .t. ⊕ ( .f. ∧ .f. ∨ .t.) R/ la soluci{on es directa, siendo x igual a .t. en este caso, el solo hecho que a la izquierda del primer operador OR haya un valor de verdad .t., hace que toda la expresión sea .t. No es entonces necesario hacer ninguna otra reducción. |
FUNCIONES RELACIONALES
Las funciones relacionales son operaciones muy conocidas por nosotros, ya que son del día a día de nuestro lenguaje. Una función de relación nos permite relacionar dos datos, y siempre son de aridez binaria, ya que, como su nombre lo indica, relacionan dos cantidades.
Se tendrán en cuenta solo seis funciones relacionales básicas, las cuales podrán ser representadas en pseudocódigo como se muestra (con muy pocas excepciones, los lenguajes de programación definen una sola forma sintáctica para los operadores relacionales.
En pseudocódigo, podremos usar muchas a discreción de quien escribe el código, buscando claridad.)
Se tendrán en cuenta solo seis funciones relacionales básicas, las cuales podrán ser representadas en pseudocódigo como se muestra (con muy pocas excepciones, los lenguajes de programación definen una sola forma sintáctica para los operadores relacionales.
En pseudocódigo, podremos usar muchas a discreción de quien escribe el código, buscando claridad.)
Operación relacional Posibles representaciones Igual =, == , .EQ. , .EQUAL. Diferente <>, ≠ , != , .NE. , .DIFFERENT., .NOT EQUAL. Menor que < , .LT., .LESS THAN. Mayor que > , .GT., .GREATER THAN. Menor o igual que ≤ , <= , .LE., .LESS OR EQUAL TO. Mayor o igual que ≥ , .GE., .GREATER OR EQUAL TO.re to edit. |
Como ya es sabido por todos desde el lenguaje natural desde niños, preguntar si dos valores cumplen con alguna de estas comparaciones relacionales solo tiene dos posibles resultados: cierto o falso. En nuestros contextos de pseudocódigo, todas las funciones relacionales resultan en uno de dos posibles valores .t. o .f. y es por esto que estas funciones forman parte del dominio de las expresiones lógicas. Las expresiones que se muestran son todas expresiones booleanas basadas en funciones relacionales.
a <- 7 .EQ. 5 #Se lee ‘7 igual a 5’. a es .f.
b <- 7 ≠ 5 #Se lee ‘7 diferente a 5’. b es .t.
c <- 7 < 5 #Se lee 7 menor que 5. c es .f.
d <- 7 .greater than. 5 #Se lee 7 mayor que 5. d es .t.
Las funciones relacionales son muy simples: queremos verificar si una condición relacional se da cierta o falsa. Es por eso por lo que la aridad de una función relacional siempre es binaria, pues una cantidad debe ser estrictamente relacionada con otra.
a <- 7 .EQ. 5 #Se lee ‘7 igual a 5’. a es .f.
b <- 7 ≠ 5 #Se lee ‘7 diferente a 5’. b es .t.
c <- 7 < 5 #Se lee 7 menor que 5. c es .f.
d <- 7 .greater than. 5 #Se lee 7 mayor que 5. d es .t.
Las funciones relacionales son muy simples: queremos verificar si una condición relacional se da cierta o falsa. Es por eso por lo que la aridad de una función relacional siempre es binaria, pues una cantidad debe ser estrictamente relacionada con otra.
Precedencia de las funciones binarias relacionales
A veces necesitaremos resolver problemas de prioridad entre operadores aritméticos y relacionales, o entre los mismos operadores relacionales. En este caso, priman los operadores aritméticos sobre los relacionales.
Note la expresión booleana
2 > 6 + 3
¿Estamos relacionando 2 y 6 y al resultado lo estamos sumando a 3, o simplemente el 2 lo estamos relacionando con 9? En este caso se resuelven primero las expresiones aritméticas.
Por lo tanto, esta expresión equivale a la expresión
2 > (6 + 3)
que finalmente queda
2 > 9
Lo que nos lleva finalmente al valor .f.
Las funciones binarias igual y diferente, tiene menor precedencia que los demás funciones binarias relacionales, y así se resuelve cualquier ambigüedad.
La expresión
3 < 2 = 4 > 3
Se deberá reducir como
(3 < 2) = (4 > 3)
.f. = .t.
.f.
Note la expresión booleana
2 > 6 + 3
¿Estamos relacionando 2 y 6 y al resultado lo estamos sumando a 3, o simplemente el 2 lo estamos relacionando con 9? En este caso se resuelven primero las expresiones aritméticas.
Por lo tanto, esta expresión equivale a la expresión
2 > (6 + 3)
que finalmente queda
2 > 9
Lo que nos lleva finalmente al valor .f.
Las funciones binarias igual y diferente, tiene menor precedencia que los demás funciones binarias relacionales, y así se resuelve cualquier ambigüedad.
La expresión
3 < 2 = 4 > 3
Se deberá reducir como
(3 < 2) = (4 > 3)
.f. = .t.
.f.
Relaciones versus aritmética
También por definición, las funciones relacionales tienen menor precedencia que las funciones aritméticas. Esto significa que siempre se calculan primero las expresiones aritméticas, y finalmente se hacen las comparaciones relacionales.
EJEMPLO.
Determinar el valor final de la variable a en la expresión a <- 6 / 3 + 3 > 6 * 3 R/ a <- 6 / 3 + 3 > 6 * 3 2 + 3 > 18 5 > 18 .f. EJEMPLO.
Determinar el valor final de la variable x, luego de la expresión x <- 6/ (3*1) + 3 ≠ 50 / (3 + 2) R/ x <- 6 / (3*1) + 3 ≠ 50 / (3 + 2) 6 / 3 + 3 ≠ 50 / 5 2 + 3 ≠ 10 5 ≠ 10 .t. EJEMPLO.
Determinar el valor final de la expresión 3 / 4 < 2 = 3 + 4 > 3 R/ 3 / 4 < 2 = 3 + 4 > 3 0.75 < 2 = 7 > 3 .t. = .t. .t. EJEMPLO.
Determinar el valor final de la expresión .f. < .t. .EQ. .f. < .t. R/ .f. < .t. = .f. < .t. .t. = .t. .t. EJEMPLO.
Determinar el valor final de la expresión 4 * 2 + 5 < 14 ∧ 6 / 3 + 3 ≠ 10 / 2 R/ 4 * 2 + 5 < 14 ∧ 6 / 3 + 3 ≠ 10 / 2 8 + 5 < 14 ∧ 2 + 3 ≠ 5 .t. ∧ .f. .t. |
Resumen de prioridades acumulado
- = , ≠ tienen menor precedencia que las funciones lógicas.
- OR, XOR tienen igual prioridad entre ellas, pero menor prioridad que AND
- AND tiene menor prioridad que ¬ .
- Las funciones lógicas tienen menor prioridad que las relacionales y las aritméticas
- Las funciones binarias +, -, *, / ,÷ , ^ tienen menor prelación que funciones unarias -,+,√.
- Los paréntesis ( y ) tienen la mayor prioridad que todas las funciones.
- La función de asignación <- tiene la menor prioridad de todas las funciones.
EJEMPLO.
Use las prioridades de las funciones lógicas, relacionales y aritméticas para determinar el valor final de la expresión 4*2+5 < 14 ⊕ 6/3 + 3 .NE. 10/2 ∧ 8/2+5 < 10 ∧ ¬(-6/2+3 = 1* -.t.) R/ 4*2+5 < 14 ⊕ 6/3 + 3 .NE. 10/2 ∧ 8/2+5 < 10 ∧ ¬(-6/2+3 = 1* -.t.) 8 +5 < 14 ⊕ 2 + 3 .NE. 5 ∧ 4 +5 < 10 ∧ ¬(-3 +3 = -1) 13 < 14 ⊕ 5 .NE. 5 ∧ 9 < 10 ∧ ¬( 0 = -1) .t. ⊕ .f. ∧ .t. ∧ .t. .t. ⊕ .f. ∧ .t. .t. ∧ .t. .t. |
Notación infija, funcional, e híbrida
Al igual que en las funciones aritméticas, la notación infija podría ser reemplazada por la notación funcional, o la notación híbrida.
Las siguientes dos expresiones son equivalentes. La primera está escrita en notación infija. La segunda está escrita en notación funcional.
3 * x + y > z ^ 4 + 5
> ( + ( * ( 3 , x ) , y ) , + ( ^ ( z , 4 ) , 5 ) )
En la segunda, estarían resueltas las dudas sobre prioridades. Sin embargo, esta notación podría no ser intuitiva cuando se está acostumbrado a la notación infija.
Las siguientes dos expresiones son equivalentes. La primera está escrita en notación infija. La segunda está escrita en notación funcional.
3 * x + y > z ^ 4 + 5
> ( + ( * ( 3 , x ) , y ) , + ( ^ ( z , 4 ) , 5 ) )
En la segunda, estarían resueltas las dudas sobre prioridades. Sin embargo, esta notación podría no ser intuitiva cuando se está acostumbrado a la notación infija.
Operadores relacionales aplicados a valores booleanos
Dado que un operador relacional compara dos cantidades y los valores .f. y .t. no son cantidades, ¿qué pasa si se comparan? En cuanto a las operaciones binarias de igualdad y desigualdad, la comparación es directa e intuitiva, ya que puedo afirmar que
.f. == .f. , .t. == .t. y .f. ≠ .t.
Pero ¿qué pasa si se relacionamos valores booleanos con otras operaciones binarias relacionales?
.f. < .t. ó .f. > .t.
En muchos lenguajes de programación estos dos valores en realidad son enteros, y un valor booleano es convertido a algún valor. Normalmente, estas conversiones se dan como 0 en el caso de .f. y 1 en el caso de .t.
Podemos entonces afirmar que .f. < .t., o lo que es lo mismo, .t. > .f.
.f. == .f. , .t. == .t. y .f. ≠ .t.
Pero ¿qué pasa si se relacionamos valores booleanos con otras operaciones binarias relacionales?
.f. < .t. ó .f. > .t.
En muchos lenguajes de programación estos dos valores en realidad son enteros, y un valor booleano es convertido a algún valor. Normalmente, estas conversiones se dan como 0 en el caso de .f. y 1 en el caso de .t.
Podemos entonces afirmar que .f. < .t., o lo que es lo mismo, .t. > .f.
VALORES BOOLEANOS Y ARITMÉTICA
De lo ya visto, .f. representa el valor cero (0), y que .t. representa el valor uno (1). [1]
Un análisis similar al hecho en el aparte anterior se puede hacer para el caso en que operemos valores lógicos con operadores aritméticos.
Si compramos números con valores booleanos, podemos decir que 1 > .f. y que 0 < .t.
Esto es importante en aquellos casos en los que una expresión booleana interactúe con números dentro de alguna expresión en la que la operación sea algún operador aritmético, ya que los valores .t. y .f. deberán promoverse a valores enteros.
Debido a esto, operación numérica contra alguno de los valores .t. o .f., solo exige reemplazar por el respectivo valor, y operar normalmente. Esto implica que son los valores booleanos los que se promueven a enteros, y no a la inversa, cuando se trata de operaciones aritméticas.
En el caso de operadores lógicos AND y OR, el operando de la izquierda se opera tradicionalmente aplicando cortocircuito, y considerando que un valor 0 corresponde a .f. y un valor 1 corresponde a .t. para hacer el chequeo.
Si el cortocircuito se queda en la izquierda, el resultado de la expresión es del tipo del operando de la izquierda.
Si el cortocircuito se mueve a la derecha, el término de la derecha no se promueve a booleano, y se usa como resultado de la expresión.
[1] Algunos diseñadores de lenguajes de programación decidieron que el valor para .t. no es 1, sino -1. Otros lenguajes ni siquiera permiten convertir los posibles valores booleanos .t. y .f. a valores numéricos enteros, evitando así expresiones como las presentadas, ya que se consideran crípticas. Por otro lado, la diferencia entre los posibles valores numéricos asignados a .t. en distintos lenguajes (1 en unos, -1 en otros), hará que este tipo de expresiones no sea portable entre lenguajes, por lo que se debe tener cuidado con ellas.
Un análisis similar al hecho en el aparte anterior se puede hacer para el caso en que operemos valores lógicos con operadores aritméticos.
Si compramos números con valores booleanos, podemos decir que 1 > .f. y que 0 < .t.
Esto es importante en aquellos casos en los que una expresión booleana interactúe con números dentro de alguna expresión en la que la operación sea algún operador aritmético, ya que los valores .t. y .f. deberán promoverse a valores enteros.
Debido a esto, operación numérica contra alguno de los valores .t. o .f., solo exige reemplazar por el respectivo valor, y operar normalmente. Esto implica que son los valores booleanos los que se promueven a enteros, y no a la inversa, cuando se trata de operaciones aritméticas.
En el caso de operadores lógicos AND y OR, el operando de la izquierda se opera tradicionalmente aplicando cortocircuito, y considerando que un valor 0 corresponde a .f. y un valor 1 corresponde a .t. para hacer el chequeo.
Si el cortocircuito se queda en la izquierda, el resultado de la expresión es del tipo del operando de la izquierda.
Si el cortocircuito se mueve a la derecha, el término de la derecha no se promueve a booleano, y se usa como resultado de la expresión.
[1] Algunos diseñadores de lenguajes de programación decidieron que el valor para .t. no es 1, sino -1. Otros lenguajes ni siquiera permiten convertir los posibles valores booleanos .t. y .f. a valores numéricos enteros, evitando así expresiones como las presentadas, ya que se consideran crípticas. Por otro lado, la diferencia entre los posibles valores numéricos asignados a .t. en distintos lenguajes (1 en unos, -1 en otros), hará que este tipo de expresiones no sea portable entre lenguajes, por lo que se debe tener cuidado con ellas.
EJEMPLO.
Determine el valor final de cada una de las expresiones. Recuerde aplicar cortocircuitos. (1) 1 ∧ 0 (2) 0 ∧ .t. (3) 0 ∨ 1 (4) .f. ∨ 0 (5) .t. ∧ 8 (6) .f. ∨ 7.5 R/ (1) 0 (2) 0 (3) 1 (4) 0 (5) 8 (6) 7.5 |
En pseudocódigo se podría plantear operar con este tipo de transformaciones. Sin embargo, el concepto se introduce para comprender que en muchos lenguajes de programación esto es posible.
Pero, el comportamiento no es portable entre lenguajes de programación.
Pero, el comportamiento no es portable entre lenguajes de programación.
EJEMPLO.
Use las prioridades de las funciones lógicas, relacionales y aritméticas para determinar el valor de la expresión .f. ≥ .f. + .t. > .t. - .f. ∨ .f. ≥ .f. * .t. > .t. - .f. R/ .f. ≥ .f. + .t. > .t. - .f. ∨ .f. ≥ .f. * .t. > .t. - .f. .f. ≥ 1 > 1 ∨ .f. ≥ 0 > 1 .f. > 1 ≥ 0 > 1 .f. ≥ 0 > 1 .t. > 1 .f. EJEMPLO.
Dados dos valores a y b, determine su suma en el caso que a y b sean iguales. En cualquier otro caso, entregue el valor cero. R/ Una solución sería usar la relación a .EQ. b (a == b) como parte de la expresión, aprovechando que un valor .t. o .f. puede ser convertido a 1 o 0. Si la relación la multiplicamos por la suma, tendremos la expresión buscada. p::Num <- (a .EQ. b) * (a + b) EJEMPLO.Determine el valor final de las variables x, y, z luego de que sean evaluadas las expresiones en el orden de arriba a abajo.
x <- .f. + .t. y <- .f. + x + x z <- .t. - .t. *4 w <- x * y * z R/ x es 1, y es 3, z es -3 y w es -6 EJEMPLO.
Determine el valor de la expresión .f. ≥ .f. + .t. > .t. - .f. + .f. ≥ .f. * .t. > .t. - .f. R/ .f. ≥ .f. + .t. > .t. - .f. + .f. ≥ .f. * .t. > .t. - .f. .f. ≥ 1 > 1 ≥ 0 > 1 .f. > 1 ≥ 0 > 1 .f. ≥ 0 > 1 .t. > 1 .f. |
VALORES, VARIABLES Y CONSTANTES
Todo valor, sea de tipo real, entero, caracter, o string, puede ser asociado a un nombre de variable, tal cual lo hacemos en el álgebra, y tal como lo hemos venido haciendo de forma empírica en ejercicios de tipos de datos. Eso nos permitirá asociar valores que pueden ser usados en un futuro, e incluso pueden cambiar en el tiempo.
Ya vimos que para asignar valores de expresiones a variables usamos el operador <-.
A la izquierda ponemos la variable, y a la derecha la expresión.
Las variables pueden ser nombradas de cualquier forma, pero siempre se recomienda, para efectos de claridad, que no comiencen con números.
De resto, se dan muchas recomendaciones para nombrar variables, pero este tema se deja para las secciones futuras de programación.
En el capítulo de tipificación vimos que podemos manejar valores numéricos tipo reales positivos, ::R+, reales negativos o ::R-, reales, ::R, racionales, ::Q , enteros positivos (::Z+, ::Z+ , ::Z+ , ::Z+ o :: Z≥ o ::Z≠), y naturales (::N).
Estos conjuntos se incluyen entre ellos (::Z ⊂ ::Q ⊂ ::R). También hablamos del tipo ::C (un caracter), del tipo ::S (cadena de caracteres, o string), y del tipo lógico (booleano) ::Bool.
También definimos el tipo de dato abstracto ::Num. Todos estos son datos primitivos, que lado a lado con los compuestos, como las estructuras, tuplas y arreglos, forman el acervo de representación de datos en nuestros algoritmos, y, en particular, en nuestros pseudocódigos.
Se muestran a continuación tres líneas de pseudocódigo en las cuales se definen tres variables con su respectivo tipo, y se inicializan las variables con un valor.
espacio::R <- 8.0 * 2.0 + 5.0
tiempo::R <- 10.0
velocidad::R <- espacio / tiempo
Note que los valores van siendo utilizados a medida que se avanza de arriba a abajo.
Ya vimos que para asignar valores de expresiones a variables usamos el operador <-.
A la izquierda ponemos la variable, y a la derecha la expresión.
Las variables pueden ser nombradas de cualquier forma, pero siempre se recomienda, para efectos de claridad, que no comiencen con números.
De resto, se dan muchas recomendaciones para nombrar variables, pero este tema se deja para las secciones futuras de programación.
En el capítulo de tipificación vimos que podemos manejar valores numéricos tipo reales positivos, ::R+, reales negativos o ::R-, reales, ::R, racionales, ::Q , enteros positivos (::Z+, ::Z+ , ::Z+ , ::Z+ o :: Z≥ o ::Z≠), y naturales (::N).
Estos conjuntos se incluyen entre ellos (::Z ⊂ ::Q ⊂ ::R). También hablamos del tipo ::C (un caracter), del tipo ::S (cadena de caracteres, o string), y del tipo lógico (booleano) ::Bool.
También definimos el tipo de dato abstracto ::Num. Todos estos son datos primitivos, que lado a lado con los compuestos, como las estructuras, tuplas y arreglos, forman el acervo de representación de datos en nuestros algoritmos, y, en particular, en nuestros pseudocódigos.
Se muestran a continuación tres líneas de pseudocódigo en las cuales se definen tres variables con su respectivo tipo, y se inicializan las variables con un valor.
espacio::R <- 8.0 * 2.0 + 5.0
tiempo::R <- 10.0
velocidad::R <- espacio / tiempo
Note que los valores van siendo utilizados a medida que se avanza de arriba a abajo.
EJEMPLO.
Use los valores de expresiones asociados a variables, y determine el valor de la expresión final. R/ a::R <- 8.0 * 2.0 + 5.0 # a es 21.0 b::R <- 14.0 - a # b es -7.0 c::R <- 6.0/3.0 + b # c es -5.0 d::R <- 10.0 / c # d es 2.0 e::Bool <- a > b ∧ c ≠ d .t. ∧ .t. .t. #e es .t. |
EXPRESIONES QUE INVOLUCRAN CARACTERES Y CADENAS
Expresiones con caracteres
Una expresión con caracteres es aquella que involucra el tipo de dato caracter (::Char). Se debe tener en cuenta que un caracter tiene asociado un código UNICODE o ASCII.
EJEMPLO.
Determine el valor final de las variables según la expresión que las afecta. R/ x::Char <- 66 # x será 'B' y <- 66 # y será 66. No una letra (tipo ::Num) z <- 'B' # z será 'B' h <- Char('B') # h será 'B'. El casting es redundante. i <- Char(66) # i será 'B'. El contexto tipifica a i. j <- Int('B') # j será 66 (código ASCII) w::Char <- 32 + 90 # w será 'z' minúscula, código 122 q::Char <- 'A' + 32 # q será 'a' minúscula, código 97 o::Char <- 'A' + ' ' # o será 'a' minúscula, código 65+32=97 |
Es importante aclarar que los lenguajes de programación son estrictos en este tipo de expresiones de caracter, por lo que se deberá revisar su comportamiento particular al momento de operar con caracteres.
Expresiones con cadenas
Sea S una cadena cuyo primer caracter está en la posición 1, y el último caracter en la posición enésima según sea el tamaño de la cadena.
Sea c un caracter.
Para nuestros pseudocódigos, definiremos las siguientes notaciones y funciones para la manipulación de cadenas.
Sea c un caracter.
Para nuestros pseudocódigos, definiremos las siguientes notaciones y funciones para la manipulación de cadenas.
Longitud de cadena
Toda cadena S tiene longitud, y puede ser calculada en pseudocódigos como | S |
Esta función determina el número de caracteres que se encuentran dentro de la cadena. Si la cadena está vacía, la longitud es 0.
s <- "ABCDEFGHIJ"
l <- |s| #l contiene ya el valor 10
s <- ""
m <- |s| #m contiene ya el valor 0
Esta función determina el número de caracteres que se encuentran dentro de la cadena. Si la cadena está vacía, la longitud es 0.
s <- "ABCDEFGHIJ"
l <- |s| #l contiene ya el valor 10
s <- ""
m <- |s| #m contiene ya el valor 0
Concatenación de cadenas
La concatenación de cadenas implica unir o juntar dos cadenas.
El operador más adecuado para hacerlo es el operador +.
s <- "ABC"
t <- s + s #se unen dos cadenas. t es igual a "ABCABC"
El operador más adecuado para hacerlo es el operador +.
s <- "ABC"
t <- s + s #se unen dos cadenas. t es igual a "ABCABC"
Concatenación de una cadena y un caracter
Para adicionar un caracter adelante o atrás de una cadena, podrá usar el operador + como se hizo con la concatenación de cadenas.
Por ejemplo,
c <- "X"
s <- "ABC"
p <- s+c #p es "ABCX"
q <- c+s #q es "XABC"
Por ejemplo,
c <- "X"
s <- "ABC"
p <- s+c #p es "ABCX"
q <- c+s #q es "XABC"
Fragmento de una cadena entre dos posiciones (Slice)
Para extraer un fragmento de una cadena entre dos posiciones cualquiera de una cadena, indicaremos la posición inicial y la final.
s[ desde : hasta ]
Se usa el operador corchetes([ ]) para extraer un fragmento de la cadena, dado un rango de posiciones.
Si se desea que la posición final sea la última, en nuestros pseudocódigos usamos |S|.
s <- "ABCDEFGHIJ"
f <- s[4:6] # f es "DEF"
Nota para programadores Python: Si usted conoce Python y está revisando este texto, tenga en cuenta que ython tiene un comportamiento diferente, y el resultado sería "DE" y no "DEF"
s[ desde : hasta ]
Se usa el operador corchetes([ ]) para extraer un fragmento de la cadena, dado un rango de posiciones.
Si se desea que la posición final sea la última, en nuestros pseudocódigos usamos |S|.
s <- "ABCDEFGHIJ"
f <- s[4:6] # f es "DEF"
Nota para programadores Python: Si usted conoce Python y está revisando este texto, tenga en cuenta que ython tiene un comportamiento diferente, y el resultado sería "DE" y no "DEF"
Leer un caracter de una cadena
Para extraer un caracter específico de una cadena, use la posición única:
s[posición]
Note que, en este caso, el tipo de la expresión es ::Char.
s <- "ABCDEFGHIJ"
c <- s[7] # c es 'G'
s[posición]
Note que, en este caso, el tipo de la expresión es ::Char.
s <- "ABCDEFGHIJ"
c <- s[7] # c es 'G'
EJEMPLO.
Dado s::String <- "ABC" + "DEF" determine el valor final de las variables R/ a <- |s| # a será 6 c <- s[4] # c será caracter 'D'. El tipo es ::Char d <- s[4:5] # d será "DE" h <- s[1:4] # h será "ABCD" |
TALLER DE PSEUDOCÓDIGO: EXPRESIONES
- Determinar el valor de las siguientes expresiones:
8 / 2 – 5 / (3 + 3 * 2 – 8) / 2
8 / 2 – 5 / (3 + 3) * 2 – 8 / 2
8 / 2 – 5 / 3 + 3 * 2 – 8 / 2
2 * 3 / 3 +(2–8) / 2 * 16 /(4 – 4 + 8) / 8+1–12 /3+1+5*2
(2 * 3)/3+ 2-(8 / 2) *16/4 –4+(8 / 8) + 1-(12 / 3) +1 +(5 * 2)
2 * 3 / 3+2–8 / 2 * 16 / 4 – 4 + 8 / 8 + 1 – 12 / 3 + 1 + 5 * 2{
((8 + 2 * (7 – 4) / 2) + (12 – 2 / 1 * 2 * (3))) - Para las siguientes expresiones en formato infijo, determine el valor final de las variables. Asuma que hay continuidad entre los literales, de tal modo que los valores previos de variables afectan las operaciones posteriores:
x <- 2*3
w <- x*2
x <- x+2
y <- x+2 * 2+3
z <- y+w * x+2
z, k <- z+1, y+2 / 2
r, t <- k*1, (k+1) ÷ 2 - Determinar el valor de las siguientes expresiones:
¬.f. ⊕ ¬(¬.f. ∧¬.f. || .t.)
.t. ⊕ ¬.f. ∧¬¬.f.
.t. || .t. ⊕ .f. ∧¬(.f. || .t.)
.t. ⊕ ¬.f. ∧¬¬.f. || .t. || .t. ⊕ .f. ∧¬(.f. || .t.)
.f. ∧ (.f. ∧.f. || .t.) ∧.t. ∧¬(.f. ∧¬.f. || .t.)
.f. ∧ (.f. ∧¬(.f. ⊕ .t.))∧.t. ∧¬(.f. ∧¬ (¬.f. ⊕ .t.))
(.t. ∧.t. ∧¬.t.) ⊕ .t. ∧ (.t. ∧¬.f.) ∧¬¬.t. ⊕ .t. - Para las siguientes expresiones en formato infijo, determine el valor final de las variables. Asuma que hay continuidad entre los literales, de modo que los valores de variables afectan las operaciones posteriores:
x <- .t. ⊕ .f.
y <- .t. ⊕ ¬x ∧ ¬¬x
y <- ¬y
w <- ¬y ⊕ ¬x ⊕ ¬x
z <- (.t. ∨ y) ⊕ w ∧ ¬(w ∨ x)
r,k <- ¬y ∧ (.t. ⊕ ¬x) , ¬¬z ⊕ .t.
r,t <- ¬r , ¬(.f. ∨ k) ∧ (y ∨ ¬z ⊕ k)
r,t <- ¬r ∧ ¬(.f.OR k) , (¬z∨k)∧(.t.∨ ¬x ∧ ¬¬x) - Use las prioridades de las funciones lógicas, relacionales y aritméticas para reducir el valor final de las siguientes expresiones:
3 > 4 + 2 ≠ .t. ⊕ .f. .EQ. 8/9 - 3>4>10 < 5/2 .EQ. 0 .EQ. .t.
¬( 4 * 2 + 25 < 12/3^3 ≠ 10 / 2⊕8+5<10 ∧ -6/2+3 ≠1* -.t.)
8 * 2 + 5 > 14 ∧ 6 / 3 + 1 ≠ 90 / 30
3 / 2 ≥ 2 / 4 + 1 * 3 ∨ 12 / 4 - 3 ≥ 9 * 2 / 3 + 122
8 * 2 + 5 > 14 ∨ 15 / 3-3 ≥ 3 * 2 / 7 + 2 ∨ 4 * 2 + 5 < 14
3*(.f.≥.f. + .t. > .t. - .f. ∨ .t. ≥ .f.*.t.>.t. - .f.) + 10
2 + 5 < 6 / 3 + 1 ∨ .t. ≠ 9 > 30
8/2 > 4 ⊕ 7 / 6 > 2 .EQ. .t. ∨ 8 / 2 .EQ. 4 * 7 / 6 - Para las siguientes expresiones en formato infijo, determine el valor final de las variables. Asuma que hay continuidad entre los literales, de modo que los valores de variables afectan las operaciones posteriores:
x <- 8/2 > 4 ∨ 7 / 6 > 2 .EQ. .t.
y <- 8/2 ∨ 4 = 7 / 6 ∨ 2==3 > x
z <- .f. ≥ x .EQ. .t. > y
w <- .f. ≠ (.f. ∨ x) > y ∨ x ∧ z - ¿Por qué la aridad de funciones relacionales es binaria?
- Revise los valores de expresiones y variables en su orden, para determinar el valor final de G, H, y L. Tenga en cuenta los tipos de las variables, para determinar el valor final de las expresiones. Si un valor real va a ser asignado a una variable entera, trunque la parte fraccional.
X::Z <- 4
Y::Z <- X/2
Z::Z <- X + Y
M::Z <- X / Y - Z
Q::Z <- Z + Y
P::Z <- Q + 2
A::Z <- -1
B::Z <- Y
C::Z <- Z
G::R <- M * Q / -P + 2 / Z + 1 + Q
H::R <- (X+Y)+((X/Y+Z)+X /Y)*(X + Y)+ ((A+B) + ((C/A+B))+A / B) - Calcule el valor final de las variables L, BX, y BY, si se sabe que las variables son asociadas en el orden dado:
X::R <- 3.0, Y::R <- 6.0, Z::R <- 1
M::R <- 9.0, Q::R <- 6.0
P::R <- 4.0
A::R <- 1.0, B::R <- 2.0, C::R <- 0.0
L::R <- M * Q / P / -2 + Z*(1+M/Q) * Q / P / 2 / Z / ( 1 + Q)
BX ::Bool <- (4+B)/B + (2+B)*B + A*Y < A + Y/X + (Y + B)*3+A* 2
BY ::Bool <- (M*Q/P/(2 + Z)/1 + Q) < M * Q / (P + 2 - Z) / (1+Q) - Calcule el valor final de las variables BY, GG, HH, LL, si se sabe que las variables son asociadas en el orden dado:
X::R <- 8, Y::R <- 1, Z::R <- 8, M::R <- 2, Q::R <- 1, P::R <- 1
A::R <- 1, B::R <- 2, C::R <- 0
BY ::Bool <- (X + Y)/Z > A-B*C∧(X+Y/Z) > A-B * C ∧ C +2<1 + Y
GG ::Bool <- P ≠ Q / 2 ∧ Q = P / ( 2 - Y )
HH ::Bool <- M*Q/P<Z/1+Q∧(M*Q/P<(2+Z/1 +Q)&(( M * Q > 100 )))
LL ::Bool <- (.t.>.f.)&&.t.||.f.⊕.f.||( ¬.f.||.t.&&.t.≠(¬.f.)||.t.)⊕(¬.f. )<.f.&&(.t.||.f.) - Multiplicación Babilónica
Los babilonios tenían una forma interesante para multiplicar dos números. Si querían multiplicar dos números a y b, calculaban primero la suma de a y b, y luego calculaban la resta de a y b. Esas dos cantidades la elevaban al cuadrado usando unas tablas que ya tenían pre-calculadas (¡no multiplicaban como nosotros lo hacemos!). Luego restaban los dos cuadrados y dividían esa resta entre 4; el resultado es la multiplicación de a y b. para obtener la multiplicación. Elabore un conjunto de expresiones que le permita hallar la multiplicación babilónica de dos números a y b. (Posamentier, Lehmann, 2014, pag 76). - Divisible por 2
Sin usar el operador modular %, elabore una expresión que determine si un número x es divisible por 2. Un número es divisible por 2, si es par. Tip: considere el uso de la división real, y el ‘casting’ de tipos a entero. - Divisible por 10
Sin usar el operador %, elabore una expresión que determine si un número x es divisible por 10. Un número es divisible por 10, si su último dígito es cero. - Suma de dígitos en una string
Dado un número entero de exactamente 4 dígitos representado como string, escriba una expresión que sume sus dígitos. Por ejemplo, para "4053", la suma es 12. - Suma de dígitos del número 768
Dado el número entero 768, construya un conjunto de expresiones aritméticas que determinen la suma de elevar al cuadrado cada uno de sus dígitos. - Suma de dígitos de un número cualquiera n de 4 dígitos
Dado el número entero n que se sabe tiene exactamente 4 dígitos, construya un conjunto de expresiones algorítmicas que determinen la suma de sus dígitos. - Volumen de un cubo de lado x
Elabore una secuencia de expresiones que le permita calcular el volumen de un cubo, que se calcula como la potencia cúbica del lado. Asuma que la variable x ::R contiene el valor del lado. - Molécula
Elabore una secuencia de expresiones que, dado el número de carbonos de un alcano entre 1 y 10, determine el nombre de la cadena molecular entre “met”, “et”, “prop”, “but”, “pent”, “hex”, “hept”, “oct”, “non” y “dec”. Adicione al final el sufijo “ano” y devuelva el nombre. Por ejemplo, si el número de carbonos es 7, el resultado de la expresión es “heptano”. Tip: almacene los prefijos en un arreglo de strings. - Sus vecinos no lo dejan dormir
Todos los días usted recoge con su celular y una aplicación, el nivel de ruido que hacen los vecinos con reguetón, y cuando la app indica que el ruido r excede 70 decibeles, usted llama a la policía para hacer cumplir el código de policía de respeto al vecino. Escriba una expresión que le permita determinar si llama o no a la policía. - Raíz de expresión negativa
Usted tiene una expresión en un radical para calcular una raíz, pero se sabe que, si esa expresión es negativa, no puede extraer el radical. El dato final de la expresión está asociado a la variable expr::R. Elabore una expresión relacional que permita determinar si es posible sacar la raíz cuadrada a dicha expresión. - Divisible por 4 o por 5
Sin usar el operador %, elabore una secuencia de expresiones que determinen si un número x es divisible por 4 o por 5. Un número es divisible por 4, si la suma de los dos últimos dígitos es divisible por 4. Un número es divisible por 5, si su última cifra es 0 o es 5, excepto el 0 que no es divisible. - Volumen de un cilindro
Elabore una secuencia de expresiones que le permita conocer el volumen de un cilindro, que se calcula como el área de la base por la altura. Para el área de la base, puede multiplicar la constante π por el radio elevado al cuadrado. Asuma que ya tiene una variable h ::R que tiene el valor de la altura del cilindro, y una variable r ::R que tiene el valor del radio. - Conos para piñata.
Una máquina de conos para piñata fabrica conos cambiando la altura h y el radio r de cada cono, de forma tal que los conos varían en forma, pero siempre conservan el mismo volumen.
Para garantizar la calidad del proceso, varias veces al día se toman las medidas de volumen de 3 conos seleccionados al azar desde la banda de producción, y las medidas se llevan a 3 tuplas (h,r). Determine si el volumen es el mismo para los 3 conos, si sabe que el volumen de un cono regular se calcula como la tercera parte de multiplicar la altura por la constante π por el radio al cuadrado. - El perro calculador
Su perro siempre lo acompaña al mercado a comprar la fruta y la verdura. El perro es muy curioso e inteligente, y aprendió a calcular si el total del mercado está o no dentro de su presupuesto, que es el rango [inf,sup]. Siempre debe gastar un mínimo inf, sin superar el máximo sup. Usted sabe que el total lo tiene el perro.
Cada que usted le pregunta al perro ‘cómo va el asunto’, le responde ladrando si están o no dentro del presupuesto (aún el perro no sabe modular bien el español).
Escriba un conjunto de expresiones algorítmicas que expresen cómo piensa su perro a partir de los datos inf, sup y total, para saber si ladra o no. - De regreso a casa desde el mercado
Usted sabe que la salida del mercado puede ser por dos puertas, la salida A, ubicada en el punto (ax,ay), y la salida B ubicada en el punto (bx,by). Usted quiere ahorrarse algo de tiempo en volver a casa, y le pregunta a su perro, que siempre lo acompaña y está a su lado, cuál es la salida más cercana. El perro siempre mantiene en su cabeza las coordenadas actuales (actx,acty). Escriba un conjunto de expresiones en pseudocódigo que expresen cómo calcula el perro cuál es la salida más próxima. Todo lugar del mercado se comporta como un punto un plano cartesiano. - El preparador de jugo
Usted sabe que exprimir 3 naranjas siempre llenan alguno de sus vasos cuadrados, aunque algunas veces el exprimidor derrama un poco. También sabe que las naranjas son de la misma calidad y especie, por lo que, si se conoce el diámetro de las naranjas y, además, se conoce el lado de su vaso que usará, se podría controlar el proceso. Usted construye un preparador de naranjas que coge de la despensa alguno de sus vasos cuadrados de lado lv::R, luego recoge de la frutera 3 naranjas de radios rn1::R, rn2::R y rn3::R, y le prepara su jugo con el exprimidor, de tal modo que nunca se derrama el jugo. Construya una función algorítmica que le permita al preparador de naranjas saber si la suma de los volúmenes del jugo de 3 naranjas no excede el volumen del vaso. - El número que representa rectas
Suponga que un número entero q es exactamente de dos dígitos en la parte entera, y dos dígitos en la parte fraccionaria. Los dos dígitos de la parte entera representan un punto (dig_izq1, dig_der1) que define una recta al origen (0,0). Los dos dígitos de la parte fraccionaria representan otro punto (dig_izq2, dig_der2) que define otra recta al origen (0,0). Elabore expresiones algorítmicas para determinar si la recta 1 es mayor a la recta 2. Por ejemplo,
para 78.94, el primer punto es (7,8) y el segundo (9,4).
La distancia al origen para (7,8) es √(7*7 + 8*8) = 10.63
La distancia al origen para (9,4) es √(9*9 + 4*4) = 9.85
Se pide determinar si la recta representado por la parte entera es mayor a la recta representada por la parte fraccionaria, y en este caso el algoritmo devolverá .true. - La clave digital de la puerta.
La clave digital de su puerta se basa en algoritmos predefinidos que usted inserta. Uno de ellos es el siguiente: Sacarle la raíz cuadrada a la hora, y sacar la raiz cuadrada a los minutos. Se toman 2 dígitos de la parte fraccionaria, se unen, y se obtiene un número entero. A ese número entero se le suman los dígitos, y con esa suma se divide el número. La parte fraccionaria hasta 4 cifras es la clave que ingresa en la puerta.
Por ejemplo,
para ingresar a las 13:42:
√13 + √42 = 3.60555127546 + 3.73766961828 //sacar raíz y logfaritmno
60, 73 //extraer 2 dígitos fracc
6073 //unir
16 //sumar
6073 / 16 = 379.5625 //dividir el número por la suma
de dígitos
5625 es la clave!
Elabore un grupo de expresiones que generen la clave. - Distanciamiento social equilateral.
Siempre que se reúne con dos amigos a conversar en la universidad, y por aquello del distanciamiento social debido una pandemias, su desorden obsesivo compulsivo lo lleva a pensar si la distancia entre ustedes es la misma para formar un triángulo equilátero (tres lados iguales), y si la distancia entre cada uno sí es de al menos dos metros, por lo que siempre mantiene un medidor laser de alta precisión que usa en todos sus encuentros con el que obtiene las distancias a,b,c. Escriba una expresión algorítmica para comprobar si el están en triángulo y si la distancia es de al menos 2 metros. - Distanciamiento social equilátero o isósceles.
Su desorden obsesivo compulsivo ha incrementado, y sus citas donde el psicólogo de la U no ha sido de mucha ayuda en este aspecto. Ahora usa el rayo laser también para medir si mientras conversa con sus 2 amigos, se cumple el distanciamiento social de mínimo dos metros, formando, además, un triángulo equilátero o isósceles (dos lados igual y un desigual), ¡pero nunca escaleno! Escriba una expresión algorítmica para comprobar que se cumple la situación deseada. - Distanciamiento social escaleno.
Para intentar contrarrestar los efectos de su desorden obsesivo compulsivo, su psicólogo le dijo que probara cambiar la estrategia para que la medida con rayos laser hacia sus dos amigos mientras conversan le sirviera para determinar no sólo si están cumpliendo con el distanciamiento social de 2 metros como mínimo, sino también si el triángulo que forman es escaleno (lados desiguales). Esto es, las distancias son desiguales. Escriba una expresión algorítmica para comprobar que se cumple la situación deseada. - Invertido.
Indique cómo generar un valor .t. usando exactamente dos valores .f. y solo un operador de negación lógico (¬). Pero puede usar operadores lógicos, relacionales, o aritméticos. - Invertido.
Dado que usted ya no sabe cómo decirle si o no a la novia porque siempre lo malinterpreta, usted decide darle una lección y hablarle siempre de la siguiente manera:
Cada que le va a decir ‘cierto’ (.t.), decide hacerlo con dos ‘falso’ (.f.) y solo un operador de negación lógico ‘no’(¬). Pero puede usar operadores lógicos, relacionales, o aritméticos. ¿Cuál sería la expresión lógica para decirle ‘cierto’? - Psicopatología de cuadrado inscrito.
Cada que usted va a una reunión con los amigos de su pareja, usted siente que NECESITA SER un cuadrado inscrito. Para sentirse cómodo, decide asumir un radio r::R de una circunferencia (el lugar) y un lado l::R de un cuadrado (usted). Luego usted siempre determina si el cuadrado puede ser inscrito en la circunferencia. Un cuadrado puede ser inscrito en una circunferencia, si las cuatro aristas (esquinas) del cuadrado pueden tocar la circunferencia en solo cuatro puntos. Si efectivamente se siente inscrito, se queda. Si no, se va.
Elabore expresiones para determinar si se queda o se va, dados los datos l y r. - Psicopatología de circunferencia inscrita.
Como el que entre la miel anda algo se le pega, cada que su pareja va a una reunión con los amigos de usted, su pareja siente que NO PUEDE ser una circunferencia inscrita. Para sentirse bien, decide asumir un radio r::R de una circunferencia (su pareja) y un lado l::R de un cuadrado (el lugar). Luego su pareja siempre determina si la circunferencia puede ser inscrita en el cuadrado. Una circunferencia puede inscribirse en un cuadrado, si los cuatro lados del cuadrado pueden ser tangentes simultaneas de la circunferencia.
Elabore expresiones para determinar si su pareja se queda o se va, dados l y r. - Abandono en pareja de la reunión.
Con los precedentes de las reuniones previas, cada que se juntan con amigos de ambas parejas, ustedes acuerdan de algún modo un radio r::R de una circunferencia y un lado l::R de un cuadrado. Elabore expresiones para determinar si se ambos se quedan o se van, dados los datos de entrada l y r. - Seleccione algunas de las siguientes expresiones. Elabore una expresión en formato de pseudocódigo considerando las prioridades en los operadores. Use expresiones con la menor cantidad de paréntesis posible.