Universidad de Costa Rica
|
|
|
|
|
1) [25 pts] Gramáticas y autómatas.
1.a) [5 pts] Defina dos gramáticas libres de
contexto que generen el lenguaje
L = {abc, aabbcc}.
1.b) [5 pts] Pruebe o refute matemáticamente
solo dos de las siguientes identidades para
expresiones regulares:
a. (r+s)* = r*+s*
b. (ss+r)* = s*(s+r)*
c. (r*)* = r*
1.c) [15 pts] Haga el diagrama de un autómata que reconozca hileras en que aparece algún cero antes de algún uno. Luego transforme ese autómata en una expresión regular.
2) [25 pts] Sistema para dar formato a programs Pascal.
2.a) [10 pts] Exponga, en pocas palabras, dos maneras diferentes en que se puede construir un programa que tome programas fuentes Turbo Pascal, y les de formato de acuerdo a las Convenciones de Programación. Escoga un lenguaje diferente para cada una de las dos opciones.
| [DiM88] | Di Mare, Adolfo:
Convenciones de Programación para
Pascal,
Reporte Técnico ECCI0188, Proyecto
32686053,
Escuela de Ciencias de la Computación e
Informática
(ECCI),
Universidad de Costa Rica
(UCR),
1988.
http://www.di-mare.com/adolfo/p/convpas.htm
|
2.b) [10 pts] Compare las opciones que expuso en el punto anterior.
2.c) [5 pts] Defina dos situaciones en que resulta mejor usar un lenguaje de propósito específico, como Lotus 123 o Microsoft Excel, en lugar de uno de propósito general, como Pascal o C++. Haga referencia a su exposición en el punto anterior.
3) [25 pts] Examine la siguiente declaración Pascal:
VAR
M: ARRAY[1..5] OF
ARRAY[6..10] OF
ARRAY[11..15] OF REAL;
|
3.a) [10 pts]
De acuerdo a las reglas de Pascal, haga un diagrama de cómo
queda almacenada en memoria esta matriz tridimensional. Luego
escriba tres ciclo anidados para que en la posición
M[i,j,k] quede almacenado el valor
sin(i)+cos(j*j)+tan(k*k*k).
3.b) [5 pts]
Reordene el acceso a la matriz M[] de manera que el
acceso a la memoria se haga en forma secuencial, y no salteada.
Recuerde los consejos de
[Man96a] y
[Man96b].
3.c) [5 pts] Explique por qué y cómo se
puede lograr mejorar el rendimiento de esta sección de
código, sustituyendo la siguiente instrucción de
asignación:
M[i,j,k] = sin(i)+cos(j*j)+tan(k*k*k).
3.d) [5 pts] Implemente las ideas que expuso en el punto anterior.
4) [25 pts]
Escriba la función recursiva Suma(a,b:INT),
que calcula la suma de dos números no negativos
"a" y "b", invocando a las funciones de
biblioteca Pred() y Succ(), que calculan
el predecesor y el sucesor de un número entero.
Muestre los registros de activación que componen la pila de
ejecución del programa cuando hay pendientes de retornar
tres llamados de la rutina Suma(), incluyendo dos
llamados recursivos. Explique el efecto que tiene el pasar por
copia y por referencia a los parámetros "a" y
"b".
Adolfo Di Mare <adolfo@di-mare.com>.
|
|
|