Análisis Comparativo de Lenguajes - Año 2016 Práctico Nro. 5 Tipos de Datos Estructurados Corresponde a Cap. IV Tipos de Datos págs. 142-181(Pratt en Español) Ejercicio 1. Dada la siguiente declaración de un tipo enumerado y de una variable arreglo en lenguaje C: typedef enum Conector {DVI, Firewire, HDMI, USB}; Conector E[9]; a. Muestre la representación (incluyendo el descriptor) que serı́a apropiada para la variable E y dar la fórmula de acceso para calcular la ubicación de una componente arbitraria E[i]. b. Calcular la dirección de la componente E[5], sabiendo que la estructura comienza en α = 1500 y el tamaño del tipo enumerado es 2 bytes. c. Calcular el origen virtual (OV) de la estructura E y luego dar la fórmula de acceso para una componente arbitraria E[i] utilizando el OV. Ejercicio 2. Sea la siguiente declaración de una variable de tipo arreglo de dos dimensiones, en un lenguaje con sintaxis similar a la de Pascal: var M: array[-3..-1 , -2..1] of integer; Considerando que el tamaño del tipo entero es 2 bytes y que la estructura comienza en α = 2000, se pide: a. Muestre la representación del almacenamiento de la variable M si la matriz está almacenada por filas. b. Provea la fórmula de acceso (general) y luego calcule la dirección de la componente M[-2,1] si la matriz está almacenada por filas. c. Muestre la representación del almacenamiento de la variable M si la matriz está almacenada por columnas. d. Provea la fórmula de acceso (general) y luego calcule la dirección de la componente M[-2,1], si la matriz está almacenada por columnas. Ejercicio 3. Dadas las siguientes definiciones de tipos y declaración en el lenguaje C: enum Cat{Mujer, Hombre, Infante}; typedef struct Tcalzado{ int codigo; Cat cat_calzado; char marca[30]; }; Tcalzado calzado; Tcalzado stock[70]; a. Dé la representación del almacenamiento para la variable calzado. b. Muestre la representación del almacenamiento para la variable stock. ¿Qué conclusiones puede obtener sobre el almacenamiento de los descriptores de los arreglos en forma contigua a las componentes? c. Dé la fórmula de acceso para la componente stock[i].marca[j] y calcule la ubicación del objeto de datos stock[25].marca[12]. Asuma que el tipo enumerado Cat y el char ocupan 1 byte, el entero 2 bytes y que α = 1000 (dirección base de stock). d. Suponga que el acceso a una componente del arreglo stock se realiza mediante la utilización de una variable i, la cual es solicitada al usuario. ¿En qué momento se determinará el desplazamiento de la componente stock[i]? Ejercicio 4. A partir del siguiente trozo de código en C: union { int i; float j; } x; x.i = 4; printf("El valor es %f\n",x.j); a. Dé la representación del almacenamiento para la variable x, asuma que el tipo entero ocupa 2 bytes y el float 4 bytes. b. ¿Existe algún error en el código? En caso afirmativo, ¿es posible chequearlo? Justifique su respuesta. Ejercicio 5. Dado el siguiente código en un lenguaje hipotético, que soporta el tipo String y el subrango: struct TFecha{ 1..31 dia; 1..12 mes; 1900..2014 anio; }; enum estado {Casado, Viudo, Divorciado, Soltero}; struct TPersona{ int codigo; TFecha fec_nac; String(30) domicilio; estado e_civil; }; TPersona persona; a. Muestre la representación del almacenamiento para la variable persona, el campo domicilio se implementa como un string de longitud fija declarada. b. Muestre la fórmula de acceso y calcule la dirección para persona.domicilio(15), sabiendo que la dirección base del registro es α = 1500, el tipo entero ocupa 2 bytes y los tipos subrango, enumerado y char ocupan 1 byte. c. ¿En qué tiempo se conoce el desplazamiento de la componente persona.e civil? Ejercicio 6. Considere que en un lenguaje particular se implementa el tipo String con longitud variable, utilice como representación una lista encadenada de caracteres con bloques de 5 caracteres. Realice el pseudo-código de cada una de las siguientes operaciones: a. Una función elimina que recibe como parámetros un string y una posición, y cuyo propósito es eliminar el caracter que se encuentra en la posición especı́ficada y retorna el string modificado. b. Una función Substring que retorna el substring desde la posición pasada por parámetro hasta el final del string. Ejercicio 7. Considerando la siguiente lista en el lenguaje Prolog: Lista =[tenis, 58.4, 5] Muestre de forma gráfica como Prolog la representa internamente, consulte en el apunte El lenguaje de Programación Prolog. Ejercicio 8. Sea el siguiente código en un lenguaje hipotético que utiliza una variable conjunto, asuma que el tipo conjunto se implementa como una cadena de bits: enum marca = (Ford, Chevrolet, Fiat, Renault, Nissan, Chery); s: set of marca; s := [Ford, Chery, Nissan]; s := s - [Chery, Fiat]; // Diferencia de conjuntos s := ~s; // Complemento de conjuntos Muestre paso a paso cómo cambia la estructura del almacenamiento de la variable s. Ejercicio 9. Se tienen dos variables punteros p y q, p apunta a la variable x y q a la y. Las variables x e y se encuentran en un bloque de almacenamiento que comienza en la dirección 1000, x se encuentra en la dirección 1500 y la y en la 2000. En la siguiente figura se muestran los punteros y el bloque de almacenamiento con las variables x e y. Dé la representación en memoria y las direcciones absolutas y relativas, para los punteros p y q. ¿Qué sucederı́a con los punteros si el bloque de almacenamiento se mueve a la dirección 3000? Ejercicios Complementarios Ejercicio 1. Sea la siguiente una declaración en un lenguaje con sintaxis similar a la de Pascal: type dato=array[-2..2] of 2000..2016; var Cad: array[-5..-3,2..4] of dato; a. Muestre la representación del almacenamiento para la variable Cad, asumiendo que la matriz es almacenada por columnas y que el tamaño del subrango es de 2 byte. b. Calcule la dirección de la componente Cad[-4,3][1] asumiendo que la estructura comienza en la dirección α = 2500. Ejercicio 2. Sean las siguientes declaraciones en un lenguaje tipo Pascal: type Dias = (Lun,Mar,Mie,Jue,Vie,Sab,Dom); reg = record d: Dias; t: String[30]; x: array[-3..2] of 1900..2013; end; var a: array[Mie..Dom] of reg; Se pide: a. Dé la representación de almacenamiento para la variable a. Tenga en cuenta que el primer elemento de la enumeración tiene asociado el valor 0. b. Dé la fórmula de acceso y calcule la dirección de la componente a[Vie].x[-2]. Considere que la dirección base del arreglo es α = 1500 y los siguientes tamaños para subrango: 2 bytes, para el enumerado: 2 bytes y para el string: 30 bytes. Ejercicio 3. Realice una comparación entre los tipos arreglo y registro(struct) en el lenguaje C. Describa los aspectos positivos y negativos de cada tipo de datos cuando se considera: a. Tipo de componente que pueden almacenar (homogéneas vs heterogéneas). b. Número de componentes que pueden almacenar. c. Chequeo de tipos de la fórmula de acceso a una componente (en tiempo de traducción vs en tiempo de ejecución). d. Factibilidad de errores en la selección de una componente. e. Uso del almacenamiento (los elementos de la estructura deben ser almacenados en forma contigua vs en forma separada).