Ejercicio04

Anuncio
EJERCICIOS:
6.1- En la sección 6.1.1 vimos que la mayoría de los operadores aritméticos binarios son
asociativos por la izquierda (left-to-right) en la mayoría de los lenguajes de
programación. Al mismo tiempo, vimos en la sección 6.1.3 que la mayoría de los
compiladores son libres de evaluar los operandos de un operador binario en cualquier
orden. Son estas sentencias contradictorias?? Porqué??
A mi parecer estas sentencias son contradictorias, ya que si en un lenguaje existe la
asociatividad por la izquierda (resuelve de izquierda a derecha en una expresión
aritmética los operadores de igual precedencia), no me parece coherente que el
compilador pueda evaluar libremente la expresión en el orden que mejor le parezca.
Por lo que recomiendo al programador hacer uso adecuado de los paréntesis a la hora
de programar, ya que la mayoría de los compiladores no violan el ordenamiento
impuesto por los parentesis en una expresión.
6.2 - Trasladar la siguiente expresión a notación postfija y a notación prefija:
[- b + sqrt (4*a*c)]/(2*a)
Se necesita un simbolo especial para la negación unaria?
Notación Prefija:
(/ (+ (- 0 b) (sqrt (* (* a c) 4))) (* 2 a))
Notación Postfija:
(((0 b -) ((4 (a c *) *) sqrt) +) (2 a *) /)
Particularmente, no se necesitó un simbolo especial para la negación unaria (aunque
podría ser necesario en los lenguajes que poseen este tipo de notaciones). Se usó el
simbolo de negación binaria trasladando la expresión - b, en 0 - b = - b.
6.3 - En Lisp, la mayoría de los operadores aritmeticos estan definidos para tomar dos o
más argumentos. De esta forma (* 2 3 4 5) da como resultado 120, y (- 16 9 4) da como
resultado 3. Muestre que los parentesis son necesarios para quitar la ambiguedad en las
expresiones aritmeticas de Lisp (en otras palabras, dar un ejemplo de una expresión cuyo
significado no es claro cuando los parentesis son removidos).
En la sección 6.1.1 vimos que la precedencia y la asociatividad no influyen en la
notación prefija ni en postfija. Exprese con otras palabras este hecho para hacer
explícita esta suposición.
Expresión: a + b + c - d
Expresión en Lisp: (- (+ a b c) d)
Expresión sin paréntesis: - + a b c d = ?? Completamente ambigua
Expresión escrita correctamente en Lisp: (- (+ (+ a b) c) d)
Expresión correcta sin paréntesis: - + + a b c d = a + b + c – d
Las expresiones escritas tanto en notación prefija como en postfija no utilizan ni las
reglas de precedencia ni las reglas de asociatividad ya que:
1) Precedencia:
Ejemplo: a+ b * c
El operador de multiplicación (*) tiene mayor precedencia en todos los lenguajes de
programación que el operador de suma (+) por lo tanto la sub-expresión b*c en un
lenguaje con notación infija se resuelve primero; mientras que en un lenguaje con
notación prefija o postfija no existe la precedencia ya que los paréntesis aclaran de que
forma se quiere evaluar la expresión
(+ a (* b c)) = a + (b*c)
ó
(* (+ a b) c) = (a+b) * c
2) Asociatividad:
Ejemplo: a + b – c
En la mayoría de los lenguajes de programación con notación infija los operadores (+)
y (-) tienen igual precedencia, por lo que la evaluación de la expresión va a depender si
se resuelve por la derecha o por la izquierda. En cambio en lenguajes con notación
prefija o postfija la asociatividad por la derecha o por la izquierda tambien viene dada
por como se coloquen los paréntesis en la expresión
(- (+ a b) c) Asociativa por la izquierda
(+ a (- b c)) Asociativa por la derecha
6.6 - Lenguajes que usan el modelo de variables por referencia támbien tienden a emplear
recolección de basura automatica. Es este hecho más que una coincidencia? Explique
El hecho de que un lenguaje use el modelo de variables por referencia
implica la utilización de una mayor cantidad de apuntadores que se crean a cada
momento con la creación de un objeto, por lo que al programador se le hace muy
engorroso estar pendiente de todas las posibles referencias colgadas que se pueden ir
creando a lo largo del programa. Por lo que los diseñadores de los lenguajes bajo el
modelo de variables por referencia decidieron implementar la recolección de basura
automática, que aunque es más dificil de implementar es un alivio para los
programadores ya que no tienen que estar tan pendientes de el comportamiento de los
apuntadores, por lo que no parece ser una coincidencia.
Descargar