1 4. TIPOS DE DATOS. 2 Conceptos Básicos Un tipo de dato es: un conjunto de objetos una colección...

Post on 24-Jan-2016

219 views 0 download

Transcript of 1 4. TIPOS DE DATOS. 2 Conceptos Básicos Un tipo de dato es: un conjunto de objetos una colección...

1

4. TIPOS DE DATOS

2

Conceptos Básicos

Un tipo de dato es:

un conjunto de objetos

una colección de operaciones

con

Tipo elemental. Valores constantes

Tipo estructurado. Compuestos

3

Estructura de Tipos

La estructura de los tipos de datos en un lenguaje la determinan dos componentes

Equivalencia

Conversión

4

Equivalencia

Criterio con el cual se decide que dos objetos son del mismo tipo

Equivalencia

Nominal

Estructural

Los tipos de los dos objetos tienen el mismo nombre

Los dos objetos tienen la misma estructura

C++, Pascal, Ada

C

5

Ejemplo

Type E = integer; A = array[1..10] of

integer;Var x1 : integer; x2 : integer; x3 : E; v1 : array [1..10] of

integer; v2 : A; v3 : A;

Equivalencia nominal

x1 eqN x2

v2 eqN v3Equivalencia estructural

x1 eqE x2 eqE x3

v1 eqE v2 eqE v3

NOTA:

El tipo de v1 es anónimo

6

Ejemplo Program Ejemplo; Type Vector1= Array[1..10] of Real; Vector2= array[1..10] of Real;Var X,Z : Vector1; Y : Vector2; Procedure Rutina(A: Vector1); : End;Begin X:= Y; Rutina(Y);End.

Error!! en eq. nominal Permitido en eq.

estructural

7

Conversión

Transformar la representación interna de un r-valor

representación| interna del respectivo l-valor.

según

La conversiónCoerción (Implícita)

Casting (Explícita)

8

Coerción

Conversión de dato IMPLÍCITA, que depende del contexto

Al efectuar una asignación

Al evaluar una expresiónPASCAL

Var Z,X: Real;

Y: Integer;

X:= Y;

Z:= X+3;

FORTRAN

R=I

9

Coerción

PL/1 provee una conversión implícita entre TODOS los tipos elementales

• Caracter

• Real

• bit

Real

Integer

Caracter

En general, los LP proveen conversión de tipos entre tipos escalares y no entre tipos estructurados o definidos por el usuario.

10

Casting

Conversión de tipo de dato EXPLÍCITA, utilizando operadores.

En C:

• (int)x

• (float)y

11

Ejemplo

float p, q;int s, n;s = 5;n = 2;p = s/n; /* coerción */q = (float)s/n; /* casting */printf(%f %f \n, p, q); p: 2.0

q: 2.5

12

Ejemplo

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óny=5/2.0 = 5.0/2.0 y=2.5 casting coerción

z=5.0/4 = 5.0/4.0 z=1.25 castingcoerción

13

Comprobación de Tipos

Acción de verificar la consistencia entre: un l-valor y un r-valor.

en cada operación a ejecutarse.

La representación de datos NO incluye información sobre el tipo de dato.

Recepción de: Cantidad apropiada de

parámetros. y del tipo apropiado.

14

Comprobación de Tipos

EstáticaLP fuertemente tipados

DinámicaLP débilmente tipados

Comprobación

15

Comprobación estática

Tiempo de compilación

Generación de la tabla de símbolos

Gran % de comprobación antes de la ejecución.

Ejecución más segura y eficiente.

16

Comprobación dinámica

Tiempo de ejecución

No se requiere declaración ni se asume tipo.

El tipo de dato de un objeto puede variar durante la ejecución.

Su implementación sugiere utilizar una "marca" que indique su tipo. Mayor espacio de almacenamiento.

Programas más flexibles.

Mayor tiempo de ejecución. Comprobar el tipo antes de ejecutar. Código generado por el compilador.

17

Comprobación dinámica

El compilador generará código para: ALMACENAR información del tipo de dato

del objeto

CONSULTAR la información alamcenada sobre los objeto durante la ejecución

COMPROBAR los valores que se van obteniendo durante la ejecución.

18

Comprobación dinámica

Casi NO existen lenguajes de programación en los que TODAS las comprobaciones de tipo se realicen durante la compilación

19

Ejemplo

Type rango = 1..100;Var k, n : rango; ··· n := 2*k + 1;

El valor a asignar sólo se puede comprobar en tiempo de ejecución

20

Ejemplo

x:= F(x) + Z;

El compilador comprobará que:

X sea del tipo de dato del parámetro formal de F

El tipo de dato de F y de Z deben coincidir o ser compatibles

El tipo de dato de la operación coincida o sea compatible con el de X

21

Tipos Estructurados de Datos

Modelos de Definición

22

Producto Cartesiano

El producto cartesiano de n conjuntos C1, C2, C3... Cn, denotado en la forma

C1 x C2 x ... x Cn

es un conjunto cuyos elementos son n-túplas

(c1, c2, ... cn) con ci Ci.

23

Producto Cartesiano

productos cartesianos

registros o estructuras

struct persona

{ char nombre[15];

int edad;

}

24

Ejemplos

Los polígonos regulares se pueden caracterizar por:

Un número entero que representa el numero de lados, y

Un número real que representa la longitud de un lado.

25

Ejemplos

Todo polígono regular así expresado (3,12.5) es un elemento del producto cartesiano

Z x R

Typepol_reg = record

num_lados: integer; longitud: real

end;

26

Aplicación Finita

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 : D I

27

Aplicación Finita

Aplicación del subrango de enteros 1...5 sobre los números reales.

A[k] k : 1..5

A: array [1..5] of real;

aplicaciones finitas

arreglos

un objeto del conjunto imagen

28

Estrategias de los lenguajes para ligar el dominio de la función a un subconjunto específico de valores: Estática Semidinámica Dinámica

Aplicación Finita

29

El subconjunto se determina en tiempo de compilación.

Pascal :

Lista = array [1..5] of real;

Estrategia estática

C :

typedef float Lista[5];

30

El subconjunto se determina en tiempo de creación del objeto.

En Algol :

[m : n] int A;

declara un arreglo semidinámico cuyo espacio en memoria se asigna de acuerdo a los valores actuales de m y n y permanece mientras A exista en el ambiente en el que fue definido.

Estrategia semidinámica

31

El subconjunto puede cambiar en cualquier instante de la existencia del objeto.

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]

Estrategia dinámica

32

Unión Discriminada

Extensión del producto cartesiano.

Permite, en cualquier instante de la ejecución del código al que pertenece, la elección de una entre diferentes estructuras alternativas :

Variante : estructura alternativa

Discriminante: Campo selector

33

Unión Discriminada

Parte Variante

Parte Fija

34

Ejemplo

Pascal :type

reg_var = recordCampo1 : integer;case atomo : boolean of

true : info1 : real;

false : info2 : char end;

35

Conjunto Potencia

Permite definir variables cuyo valor puede ser cualquier subconjunto de un conjunto de elementos de un determinado tipo T.

El tipo de las variables, tipo base, es:

El conjunto de todos los subconjuntos de elementos de tipo T

Si T = {a, b, c}

P (T) = {, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} #(P (T)) = 2#(T) = 23 = 8

36

Modelos de Construcción

Criterios a considerar en la elección de representaciones de almacenamiento :

Selección eficiente de componentes de una estructura de datos.

Gestión global eficiente del almacenamiento para la implementación del lenguaje.

37

Constituyen una técnica de representación interna de objetos de dato.

Formado por un par consistente en : Descriptor (Conjunto de atributos de la

estructura) Objeto (almacenamiento para los componentes)

Modelos de Construcción

38

Tipos Elementales

Enteros

Constituyen una abstracción de una implementación Hw.

No tienen otros atributos, además de su tipo. Su implementación más común, es usar una

representación definida por el Hw, y un conjunto de aritmética de Hw y operaciones primitivas relacionales sobre enteros.

Normalmente, esta representación usa una palabra de memoria (o serie de bytes) completa para guardar un entero.

39

Representación

1. Sin descriptor. (C – FORTRAN)

110111

Entero binario

Bit de signo

Sólo se guarda el valor Representación posible si el lenguaje

provee declaraciones y verificación estática de tipos.

40

2. Descriptor guardado en una palabra independiente. ( Lisp)

Lo guarda en una localidad de memoria separada, con un puntero al valor entero de la “palabra completa”.

Desventaja: puede duplicar el almacenamiento requerido para un objeto de datos entero individual.

Ventaja: el valor se guarda usando la representación dada por el Hw; esto permite usar operaciones aritméticas de Hw.

Representación

41

Gráficamente:

I

Descriptor

Bit de signo

Entero binario

:

Objeto

Representación

42

3. Descriptor guardado en la misma palabra.

Guarda el descriptor y el valor en una localidad de memoria.

Acorta el tamaño del entero para dar espacio para el descriptor.

Se conserva el almacenamiento, pero las operaciones aritméticas del Hw no se pueden usar, sin antes:

despejar el descriptor del objeto de datos entero,

ejecutar la aritmética y reinsertar luego el descriptor.

Representación

43

Gráficamente:Descript

or de tipo

Bit de signo

Entero binario

I

Ejecutar una serie de instrucciones de Hw para una operación aritmética ==> aritmética ineficiente.

Forma práctica sólo para descriptores de tipo implementados por el Hw, no son comunes actualmente.

Representación

44

Representación

Cantidad de direcciones de memoria que requiere un objeto para su almacenamiento.

Word = 4 byte

T=1

Objeto

Word = 2 byte

T=1

Objeto

Objeto

:

Word = 1 byte

T=2

wordladeTamañoTipoTamaño

ObjetoTamaño)(

)(

45

Signo Magnitud

0 15

Posibles representaciones para un entero

Ejemplo: Entero (2 bytes) int a;

Objeto

Descriptor

Dir. Base

enteroTipo

aNombre

Representación

46

Este modelo emula la notación científica: cualquier número se puede expresar como

N = m * 2k; 0 < m < 1; k Z

Tamaño: 4 Byte; norma 754 IEEE

Para reales de doble precisión en punto flotante, se usa una palabra adicional de memoria para guardar una mantisa extendida.

Tipos Elementales

Reales (punto flotante)

47

Signo exponente mantisa

0 1 8 31

Dígitos significativos del

número

S E M

Representación

Gráficamente:

48

Los números se componen de 3 campos :

S un campo de signo de un bit ( 0 es positivo)

E un exponente en notación de exceso. Los valores (8 bits) varían entre 0 y 255, correspondientes a exponentes de 2 que van de –127 a 128.

M una mantisa de 23 bits. Con esto se obtiene un intervalo de 10-38 a 1038.

En formato de 64 bits, el exponente se amplía a 11 bits, para dar un intervalo de –1022 a +1023, lo que da números en el intervalo de 10-308 a 10308.

Representación

49

Bit de signo de exponente Exponente

Bit de signo Mantisa

Punto raíz implícito

000001 110000000 0

Representación del real 1.5 :

Representación

50

Parámetros Valor

E = 255 y M 0

Número no válido.

E = 255 y M = 0

0 < E < 255 2E-127 (1.M)

E = 0 y M 0

2-126.M

E = 0 y M = 0

0

Dados E y M, el valor de representación es :

Representación

51

Ejemplos

+1 = 20 x 1 = 2127-127 x (1).0 (binario) 0 01111111 000000...

+1.5 = 20 x 1.5 = 2127-127 x (1).1 (binario)

0 01111111 100000...

-5 = -22 x 1.25 = 2129-127 x (1).01 (binario)

1 10000001 010000...

32 bits

52

Ejemplo: Real (4 Byte; norma 754 IEEE)

float x;

Objeto

:

DescriptorNombre: x

Tipo RealDir Base

Representación

53

Objeto

:

Word = 4B

T=1

Objeto

:

Word = 2B

T=2

Word = 1B

T=4

:

Objeto

wordladeTamañoTipoTamaño

ObjetoTamaño)(

)(

Representación

Cantidad de direcciones de memoria que requiere un objeto para su almacenamiento.

54

Secuencial. La estructura de datos se guarda en un bloque contiguo de almacenamiento, que incluye el descriptor y los componentes.

Un apuntador del bloque A al bloque B, “vínculo”, se representa guardando la dirección de la primera localidad del bloque B en una localidad reservada para ese fin en el bloque A.

Vinculado. La estructura de datos se guarda en varios bloques no contiguos, con los bloques vinculados entre sí a través de apuntadores.

Tipos Estructurados

55

Componente

Componente

Componente

Componente

Componente

.

.

.

Descriptor

Componente

Componente

Componente

......

Secuencial Vinculada

vínculo

Tipos Estructurados

56

Secuencial:

• Se usan para estructuras de tamaño fijo.

• Ocasionalmente en estructuras homogéneas de tamaño variable.

Ejemplo : registros, vectores, strings, etc.

Ejemplo : listas enlazadas.

Tipos Estructurados

Vinculada:

• Se usan para estructuras de tamaño variable.

57

• Las memorias se estructuran como una serie de bytes.

• Ausencia de operaciones de hardware para acceso a componentes.

Simular a través de software las estructuras de datos y las operaciones que trabajan con estructuras de datos.

• Tipos elementales de datos, representación de almacenamiento y operaciones son manejadas por hardware.

Tipos Estructurados

58

Cantidad de direcciones de memoria que requiere un objeto para su almacenamiento.

El tamaño de un Objeto de Dato dependerá de:

Tipo de dato del objeto

Tamaño de la palabra

wordladeTamañoTipoTamaño

ObjetoTamaño)(

)(

Representación

59

Los modelos de representación deben considerar fórmulas de acceso para alcanzar las componentes de tipos agregados de datos.

referencias lógicasdirecciones

relativasdirecciones absolutas

referencias físicas

Una fórmula de acceso es una función que transforma, a partir de los atributos contenidos en el descriptor:

Representación

60

Tipos Estructurados de Datos

Modelos de Representación

61

Producto Cartesiano

Var reg : record

a : integer; b : real

end;

Modalidad Pascal

62

Producto Cartesiano

Descriptor

Objeto : a

b

Nombre reg

Constructor record

Selector 1 a

Tipo Selector 1 integer

Tamaño Selector 1 t1

Dirección relativa Selector 1 K1 = 0

Selector 2 b

Tipo Selector 2 real

Tamaño Selector 2 t2

Dirección relativa Selector 2 K2

Dirección Base

63

1

1

).(i

kki tSRDir

Fórmula de acceso Dirección absoluta de memoria donde se encuentra el i-ésimo selector del registro R.

donde

es la dirección base de R, resuelta en tiempo de carga, y

tk el tamaño del k-ésimo selector.

:

Objeto

Producto Cartesiano

64

Sin embargo, la expresión

se resuelve en tiempo de traducción. Luego,

con

i - 1

tkk = 1

i - 1

tkk = 1

= y = 0, constantes

Producto Cartesiano

ii kSRDir ).(

ik 1k

65

Ejercicio

a) Defina las declarativas en Pascal y en C.

b) Describa una fómula de acceso a una componente del registro r

c) Determine la dirección absoluta del campo g del registro r, si la dirección base es 1000 y la word =1

int

float

char

int

boolean float

float

puntero

int

a b c d e f g h j

r:

Dada la siguiente estructura:

66

a) Pascal :

type

puntero = ^real;

estructura = recorda, d, j : integer;b, f, g : real; c : char ; e :

boolean ; h :

puntero end;

a) C :

typedef real * puntero;

typedef struct

{ int a, d, j;float b, f, g;char c ;int e ;puntero h;

} estructura ;

Ejercicio

Solución

67

Solución

en que,

tsel_k = techo(tamaño del tipo(sel_k) / tamaño de la palabra)

Con : a k < x

Dir(r.x)= + (tsel_1+ …+tsel_k)

b) Aplicando la fórmula, se tiene :

Dir(r.x)= + tsel_i sel_i =a

x-1

68

Solución

c) Aplicando la fórmula, se tiene :

Dir(r.g) = + ta+tb+tc+td +te +tf

a b c d e f g h j

Dado que el tamaño de la palabra es 1, word=1 se tiene que :

ta= techo(2/1)=2; tb= techo(4/1)=4; tc= techo(1/1)=1;

td= techo(2/1)=2; te= techo(1/1)=1; tf= techo(4/1)=4

Luego,

Dir(r.g) = + 2 + 4 + 1 + 2 + 1 + 4 = + 14;

pero: = 1000,

Dir(r.g) = 1014

69

Ejercicio

Realice implementaciones para :

1) Números complejos (a+bi)

2) Números racionales (a/b)

3) Enumeraciones

4) Booleanos

5) Caracteres

70

Después de una declaración de variable

Var A : array[0 .. 4] of integer;

Los elementos del arreglo A aparecen en localidades consecutivas de memoria:

Aplicación Finita

A[0] A[1] A[2] A[3] A[4]

71

Dada una representación secuencial, en la selección directa de un componente, intervienen el cálculo de :

La dirección base + El desplazamiento

A través de una fórmula de acceso.

Aplicación Finita

Localidad relativa del componente seleccionado dentro del bloque secuencial.

Localidad inicial del bloque completo.

72

La fórmula de acceso, dado el nombre o subíndice del componente deseado, especifica cómo calcular el desplazamiento del componente.

Este desplazamiento se suma a la dirección base para obtener la localidad real del componente seleccionado en la memoria.

Aplicación Finita

73

Observación:

Este cálculo será muy eficiente, si se usan subíndices constantes, ya que el traductor puede calcular la fórmula de acceso durante el tiempo de compilación y generar código para tener acceso directo al componente.

Aplicación Finita

74

Ejemplo : Sea el arreglo en C : char A[10];

Aplicación Finita

• El almacenamiento para A, se dispone en forma secuencial como A[0], A[1], ..., A[9].

• La dirección de A[1] será la dirección base del arreglo A más 1

• En general, para arreglos de char en C, la dirección de A[I] será Dir(A[i]) = l-value(A[0])

+ I

75

Aplicación Finita

Dirección base = localidad de A[0]

Desplazamiento = i * tamaño del componente

= 5 * 1 = 5Dirección base + desplazamiento

= l-valor( A[0] ) + 5

= l-valor( A[5] )

154:

155:

156:

157:

158:

159:

160:

161:

162:

163:

A[5]

A[0]

A[1]

A[2]

A[3]

A[4]

A[6]

A[7]

A[8]

A[9]

76

Aplicación Finita

Dirección base = localidad de A[0]

Desplazamiento = i * tamaño del componente

= 5 * 1 = 5Dirección base + desplazamiento

= l-valor( A[0] ) + 5

= l-valor( A[5] )

154:

155:

156:

157:

158:

159:

160:

161:

162:

163:

A[5]

A[0]

A[1]

A[2]

A[3]

A[4]

A[6]

A[7]

A[8]

A[9]

77

Acceso a los componentes de una estructura homogénea:

Aplicación Finita

2. Para avanzar a la próxima componente: A[i+1]

• Sumar el tamaño de la componente actual a la localidad (dirección) del mismo.

1. Para seleccionar la primera componente de la serie: A[i]

• Usar el cálculo de dirección base más el desplazamiento.

78

Aplicación Finita

Dirección base

Descriptor (vector de arreglos)

LI

Representación de almacenamiento para componentes

Tipo de datos

Límite Inferior de subíndicesLímite Superior de subíndicesTipo de Datos Componentes

Tamaño del componenteA[LI]

A[LI] + 1

A[LS]

Vector

Entero

E

LS

79

Aplicación Finita

Vectores : Pascal type vector = array [1..10] of real;Var V : vector;

: V[1]V[2]V[3]

V[10]

ObjetoDescriptor

Nombre VConstructor ArrayTipo Elemento RealTamaño Elem TDimensiones 1Tipo índice IntegerLímite inf (li) 1Límite sup (ls) 10Dir Base

80

Fórmula de acceso El acceso al i-ésimo elemento de V, durante ejecución:

Aplicación Finita

Dir(V[i]) = + ( i – li ) * T

donde: li y T se determinan en tiempo de

traducción.

,la dirección base, en tiempo de carga

81

Ejercicio

a) Declarativas en Pascal

b) Fómula de acceso a una componente i del vector V

-2 -1 0 1 2 3 4 5 6 7 8

V:

Real

c) Dirección absoluta de la componente 4 del vector V, si la dirección base es 1000 y la word =2

82

Solución

a) Type vector = array[-2..8] of real;

Var V : vector;

b) Dir(V[i]) = + ( i – -2 ) * T

Dir(V[i]) = + ( i +2 ) * T

T=4/word

c) Dir(V[4]) = + ( 4 +2 ) * 2

= 1000 + 6 * 2

= 1012

T=4/2=2

83

Aplicación Finita

Matrices Modalidad PascalVar

A : array [1..10,1..5] of real;A:

1 2 3 4 5 1

2

3

4

5

6

7

8

9

10

Linealizar!!

1,1 2,1 3,1 4,1 10,1 1,2 2,2 3,2 .. 10,5 ...

Por columnas:

...1,1 1,2 1,3 1,4 1,5 2,1 2,2 10,5

Por filas:

84

Aplicación Finita

Matrices Modalidad Pascal Var

A : array [1..10,1..5] of real;

A[1,1]A[1,2]A[1,3]

A[10,5]

:

Objeto

A[1,4]A[1,5]A[2,1]A[2,2]A[2,3] :

Nombre AConstructor ArrayTipo Elemento RealTamaño Elem TDimensiones 2Tipo índice IntegerLímite inf . fila (if) 1Límite sup. fila (sf) 10Límite inf. col (ic) 1Límite sup. col (sc) 5Dir Base

Descriptor

85

se determinan en tiempo de traducción

El acceso al elemento A[i, j], durante ejecución, se expresa mediante la fórmula:

Aplicación Finita

Dir( A[i,j] ) = + ( i – if ) * TF + ( j – ic ) * T

la dirección base, en tiempo de carga

Tamaño de la fila

(sc-ic+1)*T

Tamaño de la componente

Límite inferior de

la fila

Límite inferior de la columna

Límite superior de la

columna

Límite inferior de la columna

86

Ejercicio

Para el arreglo :

A:

1 2 3 4 5 1

2

3

4

5

6

7

8

9

10

a) Realizar la declarativa en Pascal y en C. Asuma como tipo de las componentes los reales.

b) Determinar la dirección del elemento A[4,3].

87

Solución

Pascal :Type

matriz = array[1 .. 5,1..10] of float;Var

A : matriz;

C :typedef float matriz[5][10];

Matriz A;

88

El acceso al elemento A[i, j], durante ejecución, se expresa mediante la fórmula:

Fórmula de acceso

Dir(A[i,j]) = + ( i – if ) * TF + (j – ic) * T

Para el ejemplo anterior, se tiene :

Dir(A[4,3] )= F + (3 – 1) * T

Dir(A[4,3] )= +34

F = (sc-ic+1)*T

T = 4 / 2 2; word = 2 byte

F = (5 – 1 + 1) * 2 10

Dir(A[4,3] )= F + (3 – 1) * T

+ (3 – 1) * 2

+ 2 * 2

Tamaño de la fila

Tamaño de los elementos

89

Cubo:

Fórmula de acceso

Var A : array [1..4,1..10,1..5] of real;

41

1

10

1 5

i

j

kC[k,i,j]

... Vector de matrices

Linealizar!!

90

Fórmula de acceso

Por planos

1 5

j

1

10

i

k

Por filas

i

41k

1 5

j

Por columnas

1

10

i

41k

j

Var A : array [1..4,1..10,1..5] of Real;

k i j

Formas posibles de linealizar :

91

Fórmula de acceso

donde: TP Tamaño del plano (sf-if+1)*(sc-ic+1)*T

TF Tamaño de la fila (sc-ic+1)*T

if, ic, T, TF y TP se determinan en tiempo de traducción.

,la dirección base, en tiempo de carga

Var A : array [1..4,1..10,1..5] of Real;

T*ic)(jT*if)(iT*ip)(kαj])i,Dir(C[k, Fp

92

Ejemplo

Se tiene una estructura de datos que consiste en un arreglo, cuyos componentes son registros.

1) Realizar las declarativas correspondientes en C y Pascal.

2) Representarlos gráficamente.

3) Determinar la fórmula de acceso para una componente cualquiera.

93

Unión Discriminada

Si los objetos de un conjunto A pueden ser clasificados en subconjuntos disjuntos B1, B2, ..., Bk, con k > 1

Tales objetos pueden representarse por medio de un registro variante, con la información común almacenada en campos fijos y la información de cada objeto en partes variantes opcionales.

94

Unión Discriminada

Ejemplos :

a) Todos los aviones tienen un fabricante y un precio; sin embargo, una avioneta tiene un motor y algunos aviones tienen 4 motores.

b) Sea el siguiente árbol de expresión :and

not

x 0 p

Todos los nodos tienen un tipo; sin embargo, pueden tener un número diferente de hijos.

Estos nodos pueden clasificarse en nodos para variables, constantes, operadores binarios y unarioos, con 0, 2 o 1 hijo respectivamente.

95

Unión Discriminada

Se representa el árbol anterior :

Type

clase = (unario, binario);

nodo = record

c1 :T1;

c2 : T2;

case k : clase of

unario : (hijo : T3);

binario : (hijoizq, hijoder : T4);

end

end;

Parte variant

e

Campo discriminante

96

Unión Discriminada

Localización en memoria:

hijoder

c1 c2 k hijo

c1 c2 k hijoizq

Parte fija

Campo

marcador

Parte variant

e

hijoder

97

Var

Z : recorda : integer;case b : boolean of

True: (c : integer); False: (d : integer; e : real);

end;

Unión Discriminada

Consta de:

Un descriptor y

Del espacio necesario para sus componentes, considerando el tamaño de la mayor variante definida.

Variante 1:

a b c

T

Variante 2:

a b d eF

98

Unión Discriminada

True False

Tabla de selección de variantes

Descriptor

Selector 3 cTipo S3 IntegerTamaño S3 T3Dir relativa S3 K3

Selector 3 dTipo S3 IntegerTamaño S3 T3Dir relativa S3 K3Selector 4 eTipo S4 IntegerTamaño S4 T4Dir relativa S4 K4

Nombre ZConstructor Unión

Selector 1 aTipo S1 IntegerTamaño S1 T1Dir relativa S1 K1=0Selector 2 bTipo S2 IntegerTamaño S2 T2Dir relativa S2 K2Dir tabla de selección

Dir Base

Objeto

99

Fórmula de accesoEl acceso al i-ésimo selector, durante la ejecución, se expresa mediante la fórmula:

donde Sj es el selector discriminante (tag

field)

1i

1kki T entonces j)(i Si)Dir(Z.S

1-i

1jkkj

j

1kk TTrue)(Z.S SiT no Si

1-i

1jkkT no Si

100

Fórmula de accesoO bien :

1i

1kki Tj)Ord(i)Dir(Z.S

1-i

1jkkj

j

1kk T*True)Ord(Z.ST *j)Ord(i

1-i

1jkkj T*False)Ord(Z.S

Ord(false) = 0

Ord(true) = 1

selector discriminante

101

Ejercicio

Sea la siguiente multilista:

1) Realizar las declarativas correspondientes en Pascal y C.

2) Representar gráficamente.

3) Definir descriptor y objeto correspondiente.

4) Determinar la dirección real del selector 3.

L

1 4

32

átomo next

link

info

102

Solución

Type base = integer;Enlace=^Nodo;Nodo = Record

link :Enlace;case atomo : boolean of

true : (info : base;)false : (next : Enlace;)

end;Var L : Enlace;

103

Solución

typedef int base;

typedef struct Nodo

{ Nodo *link;

int atomo;

union

{base info;

Nodo *next;

}X;

} *Enlace;

Enlace L;

Selector 1

Selector2

Selector 3

link atomo X

104

Solución

Gráficamente, se tiene un arreglo de nodos :

No ocupado

105

Solución

DescriptorNombre L

Constructor Union

Selector 1 link

Tamaño 1 T1

Dirección relativa 1 K1 = 0

Selector 2 atomo

Tamaño 2 T2

Dirección relativa 2 K2

Dir.Tabla de selección

Dirección Base

Tabla de selección

ObjetoTrue False

infoSelector 3

T2Tamaño 3

K2Dirección relativa 3

Selector 3 next

Tamaño 3 T3

Dirección relativa 3

K3

106

Solución

Fórmula de Acceso al campo X.info: Selector ( Si ) = 3

Discriminante ( Sj ) = 2

i = 3; j = 2Dir(Z.x) = + Ord( 3 2 )* ti

+ Ord( 3 > 2)* (T1 + T2 )

+ Ord(Z.S2 = true) * (T3 )

+ Ord(Z.S2 = false) * (T3 )

Dir(Z.S3) = + Ord( true)* (T1 + T2) + Ord( true)* (T3 )

= + 1* (T1 + T2) + 1* T3

107

Conjunto Potencia

La representación interna de un conjunto potencia está restringida a los conjuntos definidos por extensión.Se sustenta en la estructura conocida como:

string de bits

108

Conjunto Potencia

donde:

Los n bits en cero

presencia del i-ésimo valor del tipo T en C,

el i-ésimo bit en 1

C =

C es una variable de tipo conjunto potencia#(T) = n,

Si:

un string de n bits

C se representa

109

Un string de bits coincide conceptualmente con la estructura

Conjunto Potencia

packed array of boolean

Ejemplo: Sea T = {a, b, c}

y las variables:

P = {a, c}

Q = {b, c}

R = PQ = {c}

0 1 1

0 0 1

1 0 1

Representación