Está en la página 1de 4

UNIVERSIDAD TECNOLÓGICA METROPOLITANA

FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INFORMÁTICA Y COMPUTACIÓN Profesor: Héctor Pincheira
Conejeros

PRUEBA Nº 1 * LENGUAJES de PROGRAMACIÓN * SEMESTRE 1-2005

Nombre:

Preguntas 1-12 (marcar la opción correcta) : 3*BUENAS  MALAS


Preguntas 13-14 : (12 + 12) puntos cada una

1. La regla BNF < s > ::= 0 < s > | 1 < s > | 0 | 1 representa cualquier número binario:
a) Que comience con un 1 o con un 0
b) Con una cantidad de 1’s igual a la cantidad de 0’s
c) Que comience con un 0 y termine con un 1
d) Ninguna de las anteriores

2. En un código generado para una máquina de 32 bits, la sexta instrucción en RAM se


sitúa en la dirección:
a) 20
b) 24
c) 160
d) Ninguna de las anteriores

3. Para la expresión ( (a + b ) – c ) * ( d / ( e + f ) ) su equivalente en notación polaca es:


a) * – a b + / c d + e f
b) * – + / a b c d + e f
c) * – + a b c / d + e f
d) Ninguna de las anteriores

4. Si en la expresión 4 * 3 + 8 / 2 + 5 – 3 todos los operadores tienen la misma


prioridad y se asocia por la derecha, entonces el resultado de su evaluación es:
a) 20
b) 18
c) 12
d) Ninguna de las anteriores

5. La evaluación incompleta de (a  b && b  a) ocurre sólo si antes se ha ejecutado:


a) a = –5; b = ––a;
b) a = 5; b = a++;
c) a = 7; b = ––a;
d) Ninguna de las anteriores

6. Si p = &x; entonces, para representar los datos usados en la sentencia x = 2*x + *p;
se requieren:
a) Dos referencias
b) Tres referencias
c) Cuatro referencias
d) Ninguna de las anteriores
UNIVERSIDAD TECNOLÓGICA METROPOLITANA
FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INFORMÁTICA Y COMPUTACIÓN Profesor: Héctor Pincheira
Conejeros
7. Si en C se tiene n = 5; v[++n] = n++; entonces:
a) En v[5] se almacena 6
b) En v[6] se almacena 6
c) En v[6] se almacena 7
d) Ninguna de las anteriores

8. Si en C se declara float x, y; entonces en la expresión (int)(x/y)*(x/y) existe:


a) Sólo casting
b) Casting y coerción
c) Sólo coerción
d) Ninguna de las anteriores

9. Si en C se declara int x; la expresión 30000*x produce un resultado correcto:


a) Aunque se omita la comprobación de tipos
b) Realizando sólo la comprobación estática de tipos
c) Realizando sólo la comprobación dinámica de tipos
d) Ninguna de las anteriores

10. Los registros de activación incluyen enlace dinámico sólo cuando el respectivo stack:
a) Se representa en almacenamiento contiguo
b) Resulta de una sucesión de invocaciones recursivas
c) Se comporta dinámicamente
d) Ninguna de las anteriores

11. Para la función en C, int f(int n) { if(n1) return f(n–1) + f(n–2); else return n; }
la cantidad total de registros de activación que se genera con la invocación f(5) es:
a) 5
b) 10
c) 15
d) Ninguna de las anteriores

12. Sean las variables int k=3, *p=&k; y la función void h(int *s, int **t){ *s = *s +
**t; }
Si se invoca h(p, &p); entonces la variable k queda finalmente con el valor:
a) 3
b) 4
c) 5
d) Ninguna de las anteriores

13. C es una versión de C que no dispone de sentencias de repetición (while, do-while,
for) y que, además, provee los delimitadores {{ ... }} para agrupar aquellas
sentencias potencialmente ejecutables en paralelo sobre una máquina con P
procesadores. Considerar typedef int arreglo[2][100]; para escribir en C una
función que permita inicializar, eficientemente, con ceros una variable arreglo b,
cuando P = 4.
UNIVERSIDAD TECNOLÓGICA METROPOLITANA
FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INFORMÁTICA Y COMPUTACIÓN Profesor: Héctor Pincheira
Conejeros

14. Considérese la función int f(int a, int b)


{ return (a<b)*a + (a>=b)*f(a-b, b); }
Determinar la cantidad M de memoria (en bytes) necesaria para representar el stack
de registros de activación (en almacenamiento contiguo) cuando se invoca f(17,3).
UNIVERSIDAD TECNOLÓGICA METROPOLITANA
FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INFORMÁTICA Y COMPUTACIÓN Profesor: Héctor Pincheira
Conejeros

SOLUCIÓN PRUEBA 1 * LENGUAJES DE PROGRAMACIÓN * SEM. 1-2005

1. – a) 7. – b)
2. – d) 8. – b)
3. – c) 9. – d)
4. – a) 10. – d)
5. – b) 11. – c)
6. – a) 12. – d)

13. void inicia(arreglo b)


{ int i = 0;
L: if (i < 50)
{ {{ b0][i = 0;
b0][i+50 = 0;
b1][i = 0;
b1][i+50 = 0;
}}
i++;
go to L;
}
}
void inicia(arreglo b, int i)
{ if (i > -1)
{ {{ b0][i = 0;
b0][i+50 = 0;
b1][i = 0;
b1][i+50 = 0;
}}
inicia(b, i--);
}
}
Invocación: inicia(b, 49);

14. La cantidad de memoria requerida para la ejecución de f(a,b) es M = I*R, donde I es la cantidad
de invocaciones (activaciones) y R el tamaño del registro de activación (obtenido sumando los
tamaños de los elementos). Las activaciones generadas son
f(17, 3)  f(14, 3)  f(11, 3)  f(8, 3)  f(5, 3)  f(2, 3), es decir, I = 6 y, consecuentemente, M
= 6*R. Luego,
R = T(a) + T(b) + T(valor de retorno) + T(dirección de retorno) = (2 + 2 + 2 + 4) bytes = 10 bytes.
Por lo tanto, M = (6*10) bytes = 60 bytes.

También podría gustarte