Está en la página 1de 5

Modelo B: Cada pregunta vale dos puntos.

Pregunta 1.
a. Dadas las siguientes instrucciones en SQL, escribe las reglas EBNF para cada una.
select VAL from TABLE_NAME where LIMIT
insert into TABLE_NAME (VARS) values VALS
delete from TABLE_NAME where VAR = VAL

expr_select= select VAL from TABLE_NAME where LIMIT


expr_insert= insert into TABLE_NAME (VARS) values VALS
expr_delete= delete from TABLE_NAME where VAR=VAL

CHAR=A|...|Z | a|...|z
NUM=0|1|2|3|4|5|6|7|8|9
ALPHANUM=CHAR | NUM
TABLE_NAME=CHAR{ALPHANUM}
VAL=ALPHANUM{ALPHANUM}
VALS=VAL {, VAL}
VAR=CHAR{ALPHANUM}
VARS=VAR {, VAR}
LIMIT=NUM{NUM}

b. Desarrolla el árbol sintáctico abstracto utilizando las reglas EBNF para cada instrucción.
Primero pasamos las reglas EBNF a BNF, quedando como sigue:

CHAR → A|...|Z | a|...|z


NUM → 0|1|2|3|4|5|6|7|8|9
ALPHANUM → CHAR | NUM
STRING → STRING ALPHANUM | ALPHANUM
TABLE_NAME → CHAR STRING | CHAR
VAL → VAL ALPHANUM | ALPHANUM
VALS → VALS , VAL | VAL
VAR → CHAR STRING | CHAR
VARS → VARS , VAR | VAR
LIMIT → LIMIT NUM | NUM
expr_select

expr_insert

expr_delete
Pregunta 2.
a.¿Qué es la programación orientada a objetos (POO)? ¿Cómo se piensa en objetos? y ¿Qué son
clases, propiedades, métodos y objetos?

La POO es una metodología de diseño de programas que considera a un programa como una
colección de objetos independientes que interactúan entre sí.
¿Cómo se piensa en objetos?, haciendo un símil con el mundo real en el que los objetos se
relacionan entre sí para formar objetos más complejos capaces de resolver problemas.
Clase: patrón para el estado y los métodos locales. Esencialmente es un tipo de datos
Propiedades: también denominados atributos, definen el estado local de un objeto
Métodos: funciones y procedimientos para acceder y modificar el estado local de un objeto.
Objetos: espacios de memoria creados a partir del patrón clase, con un estado local definido por
sus atributos y métodos que permiten cambiar dicho estado.

b. Desarrolla la jerarquía de clases en Java con los métodos necesarios para demostrar cuatro
características de la POO para un sistema de gestión de bibliotecas. Indica cuáles son esas cuatro
características.

En este diagrama se puede observar:

Herencia: Entre la clase abstracta Elemento_Prestable y sus especializaciones:Libro,Revista,DVD


Polimorfismo: El método getId() de la clase ElementoPrestable se redefine en sus hijos,
devolviendo en cada caso:
• Libro:ISBN
• Revista:ISSN
• DVD:Referencia
Encapsulación: Definición de propiedades como privadas de forma que su modificación sólo está
permitida a partir de los métodos creados para tal efecto.
Reutilización: Reutilización del método prestar por parte de los hijos de la clase
Elemento_Prestable. Posible extensión de la clase Usuario a un conjunto de perfiles más definidos
como: Profesor, Alumno, Investigador, etc...
Pregunta 3.
a. ¿Cuales son los tres tipos de conversión automática o implícita?

Las conversiones implícitas son conocidas como coacciones, y pueden ser de dos tipos:
Extensión: en la cual el tipo de datos objetivo puede contener toda la información del tipo fuente sin
pérdida de datos. Ejemplo: de entero a real.
Restricción:en la cual el tipo de datos objetivo no puede contener toda la información del tipo
fuente y por tanto puede involucrar pérdida de datos. Ejemplo: de real a entero.

b. Suponga que usamos el siguiente código de C++, que intenta evitar el uso de un static_cast para
imprimir el valor interna de true:
union
{ int i;
bool b;
} x;
...
x.b = true;
cout << x.i << endl
¿Por qué esto es incorrecto?

El problema es que un valor booleano normalmente ocupa 1 byte de memoria y un entero 4. Cuando
se realiza la operación x.b = true se escribe 1 byte del tipo unión, pero al no estar inicializado el
tipo entero el resto de bytes (hasta 4) pueden contener cualquier valor. Por tanto al imprimir x.i lo
que se obtiene es un número entero formado por los tres primeros bytes que pueden contener
cualquier valor, mientras que el último byte contendrá 1. Por tanto no se sabe el valor que imprimirá
el código propuesto, aunque pudiera parecer que debiera imprimir 1.

Pregunta 4.
a. ¿Qué es un procedimiento?¿Qué estructura tiene?¿Cómo se comunica con el resto del programa?
Un procedimiento es un mecanismo que puede incorporar un lenguaje de programación para
abstraer un grupo de acciones o cálculos.
Su estructura consta de especificación o interfaz y cuerpo.
Se comunica con el resto del programa a través de sus parámetros.

b. Dado el siguiente procedimiento:


void inc (int* x)
{ (*x)++;
return;
}

¿Pudiera ocurrir un “fracaso” de no estar return presente? En caso afirmativo, ¿sería posible
diseñar un mecanismo que permitiera que no hubiera un “fracaso” sin return? ¿Tendría dicho
mecanismo algún sentido?

Para que ocurriera un fracaso el traductor del lenguaje debería no incluir un return implícito al leer
la llave de cierre de un procedimiento o función. Esto provocaría que sin return el control del
programa se retomara en la siguiente línea (de forma secuencial) del programa, además de dejar en
un estado inestable la pila de ejecución, ya que no eliminaría el registro de activación
correspondiente a la llamada de la función. Además el flujo de ejecución del programa sería
dependiente del orden en el cuál aparezcan las funciones en el código fuente. Un mecanismo de este
tipo no tiene ningún sentido, ya que semánticamente el final de una función, debe devolver el
control del programa al punto donde se invocó.

Pregunta 5.
Se puede listar cinco principios de diseño:
− Diseñe, no improvise.
− Estudie otros diseños.
− Diseñe de arriba hacia abajo.
− Conozca el área de aplicación
− Haga iteraciones
a. Explique qué significa cada uno de estos términos en función del diseño de un lenguaje de
programación.

Diseñe, no improvise
Básicamente significa, tener claro los objetivos que se pretenden con la creación del nuevo lenguaje
así como una detallada planificación para la consecución de estos.
Estudie otros diseños
Conocer en profundidad las ventajas y desventajas de otros lenguajes y elegir la combinación de
características de estos que más se adecúen a nuestros objetivos.
Diseñe de arriba hacia abajo
Empezar con los objetivos más genéricos que se desee cumpla nuestro lenguaje de programación, a
partir de aquí establecer un conjunto de características con las cuales se puedan cumplir los
objetivos propuestos, finalmente redefinir este conjunto de características en el lenguaje propuesto.
Conozca el área de aplicación
Es importante basar el diseño de nuestro lenguaje específicamente para el área de aplicación al que
sea destinado. No será igual un lenguaje orientado a la programación en tiempo real, que otro
destinado a la resolución de problemas lógicos.
Haga iteraciones
Básicamente significa intentar no tomar todas las decisiones de diseño de nuestro lenguaje a la vez,
sino ir refinando las características en iteraciones consecutivas para simplificar dichas decisiones de
diseño.

b. Describa hasta qué grado el esfuerzo de diseño de C++ parecería cumplir con cada uno de estos
principios.

Diseñe, no improvise
Claramente el conjunto de características que debía poseer C++, estuvo bastante claro desde el
inicio, ya que su diseño se basó en la experiencia obtenida a partir de la construcción y posterior uso
de C.
Estudie otros diseños
Una gran parte de características de C++, fueron tomadas de C, aunque también incluía algunas de
otros lenguajes como Ada y Algol68.
Diseñe de arriba hacia abajo
Es difícil decir que C++ se diseñó de arriba hacia abajo, más teniendo en cuenta que su punto de
partida fue C. Esto se acerca más a un diseño de abajo hacia arriba.
Conozca el área de aplicación
Los creadores de C++ tuvieron muy claro desde el principio el tipo de problemas y más
específicamente que tipo de aplicaciones deseaban resolver con el lenguaje C++.
Haga iteraciones
El desarrollo de C++ fue claramente iterativo, empezado con una base e introduciendo nuevas
características a lo largo del tiempo para ver como iban siendo aceptadas.

También podría gustarte