Vous êtes sur la page 1sur 3

Diseño y Paradigmas de Lenguajes

Segunda Instancia de Recuperación del Parcial

Nombre y Apellido: Cant. Hojas:


Escriba de forma clara

Ejercicio 1.
Considere el siguiente código en el lenguaje C:

int a = 4;
int j = 7;
int F1(int y){
float w = 0.0;
w = 5.8 + a; (*)
if !(w > y) return (int)w;
else return y;
}
void F2(int x, int y){
static int z = 0;
y += x;
j = y - x;
z += 2;
}

a. Determine cuales son los tiempos de ligadura para:


1. Nombre y valor de las variables a y j.
2. La elección del sı́mbolo ! para representar la operación lógica negación.
3. El operador suma (especificando el tipo de operación que se puede ligar) para el caso
de la sentencia (*).
b. Para cada una de las funciones del código verifique si existen problemas en la especifica-
ción de la signature. En caso afirmativo diga cuáles son, justificando porqué se producen.

Ejercicio 2.
Dadas las siguientes declaraciones de tipos y la declaración de una variable arreglo, en el len-
guaje C:

typedef enum educativo{PRIMARIO, SECUNDARIO, TERCEARIO, UNIVERSITARIO};


typedef struct Treg{
float s;
educativo n;
float t[9];
}
Treg A[15];

a. Dé la representación del almacenamiento para la variable A. Asuma que el tipo enumerado
ocupa 1 byte, el tipo flotante 4 bytes y que α = 1000 (dirección base de A).
b. Dé la fórmula de acceso para la componente A[i].t[j] y calcule la ubicación del
objeto de datos A[7].t[5].
Ejercicio 3.
Para el siguiente código en C:

#define TAM1 3
#define TAM2 4
int i;
int j;
int matriz[TAM1][TAM1] = {{1,2,3},{4,5,6},{7,8,9}};
float pro(int x, int y, int z){
for(; x < TAM1 ; x++){
y++;
z++;
}
}
int main(int argc, const char * argv[]) {
int * p;
int * matriz1[TAM2];
for(int k = 0; k < TAM2; k++) matriz1[k] = (int *)malloc(TAM1 * sizeof(int));
for(int k = 0; k < TAM2; k++)
if(k % 2 == 0) //posiciones pares
matriz1[k] = (int*)&matriz[k][k];
p = matriz1[1];
matriz1[1] = matriz1[3];
i = 1;
j = 0;
pro(i,j,matriz[i][j]);
return 0;
}

a. Suponga que luego de ejecutar la última sentencia el espacio libre del heap se termina,
considerando que el heap es de tamaño fijo, y se ejecuta el algoritmo de Recolección de
basura. Se pide mostrar paso a paso, cada una de las etapas involucradas en la ejecución
del algoritmo, graficando cómo cambian las estructuras de almacenamiento.
b. Ejecute el subprograma pro mostrando paso a paso la ejecución. Considere que x está
pasado por valor-resultado, y pasado por referencia y z por nombre.
Ejercicio 4.
Considere el siguiente código en un lenguaje hipotético que admite anidamientos:

Program Main;
float h = 9.1, j = 2.4;
int e = 4;
procedure sub2(int i, int g)
procedure sub3(int i)
begin
i = e + g;
end; // fin de sub3
begin
g = i * 2;
sub3(g);
end; // fin de sub2
procedure sub1(float h, int e, char i)
char j = ’a’;
int function sub4()
int g = 5, e = 10;
begin
sub2(g,g);
return e - g;
end; // fin de sub4
begin
sub2(e,5);
end; // fin de sub1
begin
sub1(e + 2.3,(int)h, ’d’);
end. // fin de Main

a. Especifique los ambientes de referenciación de los subprogramas: sub3 y sub1 .


b. Muestre gráficamente paso a paso como van cambiando las estructuras de la activación del
programa hasta la invocación del subprograma sub3 inclusive. Considere para ello que
se utiliza la regla de alcance estático implementada con el visualizador. Tenga en cuenta
que deben ser mostrados: los segmentos de código, los registros de activación completos
y los punteros CIP y CEP deben ser actualizados cuando corresponda.
c. En el subprograma sub3 se accede a la variable e. Si se utilizara una regla de alcance
dinámico, ¿en dónde está definida esa variable?

Vous aimerez peut-être aussi