3 TIPOS DE DATOS 1 Conceptos bsicos n
3. TIPOS DE DATOS 1
Conceptos básicos n n Un tipo de dato es: n Un conjunto de objetos n Con una colección de operaciones Tipos de datos: n Elementales o primitivos, por ejemplo, float n Estructurados o agregados, por ejemplo, struct n Abstractos n Modelo de definición de datos, por ejemplo, typedef n Modelo de definición de objetos, por ejemplo, class 2
Estructura de tipos La estructura de tipos en un lenguaje se establece mediante dos conceptos: n Equivalencia (criterio para decidir que dos objetos son del mismo tipo) n Nominal, si los tipos tienen el mismo nombre n Estructural, si los tipos tienen la misma estructura n Conversión (transformación de la representación interna de un r-valor según la representación interna del respectivo lvalor) n Implícita o coerción n Explícita o casting 3
Equivalencia Ejemplo en Pascal Program Ejemplo; Type Vector 1 = Array[1. . 10] of Real; Vector 2 = Array[1. . 10] of Real; Var X, Z : Vector 1; Y : Vector 2; Procedure Rutina(A : Vector 1); Begin … End; Begin X : = Y; Error!! según equivalencia nominal Rutina(Y); Correcto según equivalencia estructural End. 4
Conversión Ejemplo en C float x, y, z; int i=5, j=2, k=4; x = i/k; y = i/(float)j; z = (float)i/k; printf("%f %f n", x, y, z); x = 5/4 = 1 x=1. 0 coerción y = 5/2. 0 = 5. 0/2. 0 y = 2. 5 casting coerción z = 5. 0/4. 0 z = 1. 25 casting coerción 5
Comprobación de tipos es la acción de verificar la consistencia entre un l-valor y un r-valor La comprobación puede ser: n Estática (lenguajes fuertemente tipados) n Dinámica (lenguajes débilmente tipados) NO existen lenguajes de programación que realicen TODA la comprobación de tipos durante compilación 6
Comprobación estática n n Ocurre casi totalmente durante compilación Requiere declarar datos Participa de la tabla de símbolos Dota a los códigos ejecutables de: n Escasa flexibilidad n Gran eficiencia n Alta seguridad 7
Comprobación dinámica n n n Ocurre durante ejecución Excluye la declaración de datos Acepta modificar tipos de datos durante ejecución Demanda espacio de almacenamiento adicional Dota a los códigos ejecutables de: n Gran flexibilidad n Escasa eficiencia n Insuficiente seguridad 8
Comprobación de tipos Para la sentencia en C x = f(x) + z; El compilador comprobará la compatibilidad de los tipos de: n x y el parámetro formal de f n f y z n x y la operación + En Pascal Type Rango = 1. . 100; Var k, n : Rango; Begin n = 2*k + 1; End; El r-valor de n sólo se podrá comprobar en tiempo de ejecución 9
Modelos de Definición de Tipos Estructurados de Datos 10
Producto Cartesiano El producto cartesiano de n conjuntos C 1, C 2, C 3, . . . Cn, denotado en la forma C 1 x C 2 x. . . x Cn, es un conjunto cuyos elementos son n-tuplas (c 1, c 2, . . . cn) con ci Î Ci Los lenguajes de programación proveen el modelo de producto cartesiano a través de los conceptos de estructura o registro Los polígonos regulares se pueden caracterizar por: n Un número entero que representa el numero de lados, y n Un número real que representa la longitud de un lado Todo polígono regular así expresado es un elemento del producto cartesiano Z X R 11
Aplicación Indexada Una aplicación indexada es una función de un conjunto de valores pertenecientes a un dominio D, sobre un conjunto de valores pertenecientes a una imagen I f: Los lenguajes de D I programación proveen el modelo aplicación indexada a través del concepto de arreglo de La declaración en C, float v[5]; constituye una aplicación del subrango de enteros [0, 4] sobre los números reales 12
Aplicación Indexada Para ligar el dominio D a un subconjunto específico de valores, los lenguajes optan por una de tres estrategias: n Estática, para la cual el subconjunto se determina en tiempo de compilación n Semidinámica, para la cual el subconjunto se determina en tiempo de creación n Dinámica, para la cual el subconjunto se determina en tiempo de ejecución 13
Aplicación Indexada Estrategia Estática En C, int v[5]; declara un arreglo de tamaño 5 Estrategia Semidinámica En Algol, [m : n] int a; declara un arreglo de tamaño conforme a los valores actuales de m y n Estrategia Dinámica En Algol, flex [1: 0] int b; declara un arreglo vacío, de modo que b : = (2, 3, 8) cambia sus límites a [1: 3] 14
Unión Discriminada Modo Pascal Es una extensión del producto cartesiano, la cual consta de: n Una parte fija, cuyo último campo es un discriminante n Una parte variable, definida como un conjunto de variantes En este modelo: n La parte fija precede a la parte variable n El discriminante permite seleccionar una de las variantes pertenecientes al conjunto definido n Cada variante es, a su vez, un producto cartesiano Técnicamente se conoce como registro con variantes 15
Unión Discriminada Ejemplo Type Reg. Var = Record f 1 : Integer; f 2 : Real; case variable : Boolean of True : (v 1 : Real); False : (v 2 : Char); End; Var rv : Reg. Var; 16
Unión Modo C Una union se caracteriza por n Ser, sintácticamente, un producto cartesiano n Declararse como un conjunto de campos variantes n Ser, semánticamente, una estructura variable n Disponer, durante ejecución, de tan sólo uno de los campos variantes En C, un registro con variantes se simula mediante una struct: n Cuyo último campo es una union n Cuyo penúltimo campo se utiliza como discriminante 17
Unión Ejemplo typedef struct { int f 1; float f 2; int variable; union { float v 1; char v 2; } var; } regvar; regvar rv; 18
Conjunto Potencia Modo Pascal Un conjunto potencia es el conjunto de todos los subconjuntos que se pueden formar con los elementos de cierto conjunto base T; se denota P(T) Permite declarar variables cuyos valores son elementos de P(T) Si T = {a, b, c} entonces P(T) = { , {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} #(P(T)) = 2#(T) = 23 = 8 19
Modelos de Construcción de Tipos Estructurados de Datos 20
Modelos de Construcción Un tipo estructurado de datos se obtiene a partir de tipos elementales mediante un constructor de tipo Un constructor de tipo impone la necesidad de contar con un modelo de construcción para la futura creación de objetos en memoria Los traductores de lenguajes operan con tales modelos con el propósito de satisfacer abstracciones de alto nivel Un modelo de construcción está formado por un descriptor y un modelo de representación 21
Modelos de Construcción El descriptor es un conjunto de atributos del objeto El modelo de representación corresponde a la forma física que adoptará el objeto en RAM Como la RAM es lineal, todo objeto adopta la forma física unidimensional Luego, se debe proveer una funcionalidad que convierta acciones de alto nivel en acciones sobre la representación Una fórmula de acceso es una función que transforma referencias lógicas en referencias físicas, a partir de los atributos contenidos en el descriptor 22
Tipos Estructurados Representación Secuencial: La estructura de datos se guarda en un bloque contiguo de almacenamiento Representación Enlazada: La estructura de datos se guarda en varios bloques no contiguos enlazados entre sí a través de punteros Un puntero del bloque A al bloque B (enlace) se representa guardando la dirección de la primera localidad del bloque B en una localidad reservada para ese fin en el bloque A 23
Tipos Estructurados Componente Descriptor enlace Componente. . . Componente Representación Secuencial . . . Componente Representación Enlazada 24
Tipos Estructurados Representación Secuencial: • • Se usa para estructuras de tamaño fijo Ocasionalmente en estructuras homogéneas de tamaño variable Ejemplo : registros, vectores, strings, etc. Representación Enlazada: • Se usa para estructuras de tamaño variable Ejemplo : listas enlazadas 25
Modelos de Representación de Tipos Estructurados de Datos 26
Producto Cartesiano Pascal Var R : Record a : integer; b : real; End; C struct { int a; float b; }R ; 27
Producto Cartesiano Descriptor Nombre Constructor Selector 1 R record a Tipo Selector 1 int Tamaño Selector 1 t 1 Dirección relativa Selector 1 Selector 2 Tipo Selector 2 K 1 = 0 b float Tamaño Selector 2 t 2 Dirección relativa Selector 2 K 2 Dirección Base Objeto a b 28
Producto Cartesiano Fórmula de acceso Dirección absoluta de memoria donde se encuentra el i-ésimo selector del registro R Objeto donde § es la dirección base de R, resuelta en tiempo de creación, y § tk el tamaño del k-ésimo selector 29
Producto Cartesiano i-1 å tk Sin embargo, la expresión k=1 se resuelve en tiempo de traducción. Luego, con i-1 = å tk y = 0, constantes k=1 30
Producto Cartesiano Ejercicio: a b Dada la estructura c d e f g h j R: int char float a) b) c) int boolea n float int puntero Declararla en C++ Establecer una fómula de acceso a una componente del registro R Aplicar la fórmula para determinar la dirección absoluta del campo g del registro R, si la dirección base es 1000 31
Producto Cartesiano a) Declaración en C++ typedef float *puntero; struct Registro { int a, d, j; float b, f, g; char c ; bool e ; puntero h; }; Registro R; 32
Producto Cartesiano b) Fórmula de acceso: i-1 Dir(R. Si) = + tk k=1 Dir(R. Si) = + (t 1 + … + ti-1) 33
Producto Cartesiano a b c d e f g h j c) Aplicación de la fórmula de acceso: Dir(R. g) = Dir(R. S 7) Dir(R. g) = + t 1 + t 2 + t 3 + t 4 + t 5 + t 6 Dir(R. g) = + t(a) + t(b) + t(c) + t(d) + t(e) + t(f) Como = 1000, se tiene Dir(R. g) = 1000 + 2 + 4 + 1 + 2 + 1 + 4 = 1000 + 14 Por lo tanto, Dir(R. g) = 1014 34
Aplicación Indexada Caso unidimesional Como resultado de la declaración Var A : array[0. . 4] of integer; los elementos del arreglo A ocupan localidades consecutivas de memoria A[0] A[1] A[2] A[3] A[4] 35
Aplicación Indexada Dada una representación secuencial, en la selección directa de un elemento intervienen: la dirección base + el desplazamiento a través de una fórmula de acceso Localidad inicial del bloque completo Localidad relativa del elemento seleccionado dentro del bloque secuencial 36
Aplicación Indexada Ejemplo : Considérese el arreglo en C, char s[10]; • Este arreglo se dispone, secuencialmente en memoria, como s[0], s[1], . . . , s[9] • La dirección de s[1] es la dirección base de s más 1 • Para arreglos de char en C, la dirección del i-ésimo elemento es Dir(s[i]) = l-value(s[0]) + i 37
Aplicación Indexada 158: s[0] s[1] s[2] s[3] s[4] 159: s[5] 160: s[6] s[7] s[8] s[9] 154: 155: 156: 157: 161: 162: 163: Dirección base = localidad de s[0] Desplazamiento = i * tamaño del elemento = 5*1 = 5 Dirección base + desplazamiento = l-valor( s[0] ) + 5 = l-valor( s[5] ) 38
Aplicación Indexada Vectores (modalidad Pascal) Var V = Array [1. . 10] of Real; Descriptor Objeto V[1] V[2] V[3] V[10] 39
Aplicación Indexada Fórmula de acceso La ubicación en RAM del i-ésimo elemento de ejecución, se determina mediante V, durante Dir(V[i]) = + (i – li)*T Aquí, ü ü li y T se determinan en tiempo de traducción , la dirección base, se determina en tiempo de creación 40
Aplicación Indexada Ejercicio: -2 -1 Con respecto al vector 0 1 2 3 4 5 6 7 8 V: Real a) Declararlo en Pascal b) Proponer una fórmula para acceder al i-ésimo elemento de V c) Determinar la dirección absoluta de V[4], si la dirección base es 1000 41
Aplicación Indexada a) Type Var Vector = Array[-2. . 8] of Real; V : Vector; b) Dir(V[i]) = + (i – li)*T c) Dir(V[4]) = = 1000 + ( 4 – -2 )*4 1000 + (4 + 2)*4 1000 + 6*4 1024 42
Aplicación Indexada Caso bidimesional (modalidad Pascal) Var 1 A: A : Array [1. . 10, 1. . 5] of Real; 2 3 4 5 Linealización 1 2 3 4 Por filas: 1, 1 1, 2 1, 3 1, 4 1, 5 2, 1 2, 2 5 6 7 8 9 10 10, 5 . . . Por columnas: 1, 1 2, 1 3, 1 4, 1 . . . 10, 1 1, 2 2, 2 3, 2 . . 10, 5 43
Aplicación Indexada Vectores (modalidad Pascal) Var A = Array [1. . 10, 1. . 5] of Real; Descriptor Objeto A[1, 1] A[1, 2] A[1, 3] A[1, 4] A[1, 5] A[2, 1] A[2, 2] A[2, 3] : A[10, 5] 44
Aplicación Indexada Fórmula de acceso La ubicación en RAM del elemento de se determina mediante A[i, j] durante ejecución, Dir(A[i, j]) = + (i – if)*S + (j – ic)*T con S = (sc – ic + 1)*T Aquí, ü ü if, S y T se determinan en tiempo de traducción , la dirección base, se determina en tiempo de creación 45
Aplicación Indexada Ejercicio: Con respecto a la matriz 1 2 3 4 5 1 2 3 B: 4 5 6 7 8 9 10 a) Declararlo en Pascal, asumiendo elementos reales b) Determinar la dirección absoluta del elemento situado en la tercera columna de la cuarta fila 46
Aplicación Indexada a) Var B = Array[1. . 10, 1. . 5] of Real; b) Dir(B[i, j]) = S = Dir(B[4, 3])= = + (i – if )*S + (j – ic)*T (sc – ic + 1)*T (5 – 1 + 1)*4 = 20 + ( 4 – 1)*20 + (3 – 1)*4 + 3*20 + 2*4 + 60 + 8 + 68 47
Aplicación Indexada Caso tridimesional (modalidad Pascal) Var C : Array [1. . 4, 1. . 10, 1. . 5] of Real; i 4 1 1 Acceso a un elemento C[i, j, k] en un vector de matrices j 10 1 k 5 48
Aplicación Indexada i Linealización Var Por planos 1 1 j j Por columnas 4 i k C : Array [1. . 4, 1. . 10, 1. . 5] of Real; Por filas i j 1 i 4 1 1 k 5 j 10 1 k 5 10 k 49
Aplicación Indexada Fórmula de acceso Dir(C[i, j, k]) = + (i – ip)*R+ (j – if)*S + (k – ic)*T donde ü S = (sc – ic + 1)*T ü R = (sf – if + 1)*S = (sf – if + 1)* (sc – ic + 1)*T ü ip, R, S y T se determinan en tiempo de traducción ü , la dirección base, se determina en tiempo de creación 50
Unión Discriminada Registro con variantes (modalidad Pascal) Var Z = Record a : integer; case b : boolean of True: (c : integer); False: (d : integer; e : real); End; Consta de: ü Un descriptor y ü Espacio en RAM calculado según el tamaño de la mayor variante definida a b T c a b F d Variante 1: Variante 2: e 51
Unión Discriminada Descriptor : Tabla de selección de variantes d: g: Objeto 52
Unión Discriminada Fórmula de acceso La ubicación en RAM al i-ésimo selector, durante ejecución, se determina mediante Ord(False) = 0 Ord(True) = 1 Selector discriminante 53
Unión Discriminada Ejercicio: Con respecto a la multilista a) Declararla en Pascal y C b) Determinar la dirección absoluta del tercer selector 54
Unión Discriminada a) Type Base = Integer; Enlace = ^Nodo; Nodo = Record link : Enlace; case atomo : Boolean of True : (info : Base; ) False : (next : Enlace; ) End; Var L : Enlace; 55
Unión Discriminada typedef int base; typedef struct Nodo { Nodo *link; int atomo; union { base info; Nodo *next; } X; } *Enlace; Enlace L; Selector 1 Selector 2 link atomo X Selector 3 56
Unión Discriminada b) Dir(L S 3) = + + j=2 Ord(3 2)* Ti Ord(3 >2)*(T 1 + T 2) Ord(Z. S 2 = True)*(T 3) Ord(Z. S 2 = False)*(T 3) = + Ord(True)*(T 1 + T 2) + Ord(True)*(T 3) = + 1*(T 1 + T 2) + 1*T 3 = + T 1 + T 2 + T 3 57
Conjunto Potencia La representación interna de un conjunto potencia está restringida a los conjuntos definidos por extensión y se sustenta en la estructura conocida como string de bits Si T es el tipo base, P es el conjunto potencia sobre T y C es una variable de tipo P, entonces C se representa mediante un string de n bits, con n = #(T) En C, el i-ésimo bit en ü 1 indica presencia ü 0 indica ausencia del i-ésimo valor de tipo T en C 58
Conjunto Potencia Ejemplo Si T = {a, b, c}, entonces la representación de las variables P = {a, c}, Q = {b, c} y R = P Q = {c} es 1 0 1 P 0 1 1 Q 0 0 1 R 59
- Slides: 59