Anda di halaman 1dari 7

Tipos de datos primitivos

Son tipos no definidos en trminos de otros tipos. Con estos tipos de datos primitivos y con los
constructores de tipos se pueden definir tipos estructurados. Los tipos de datos primitivos que aparecen en
la mayora de los lenguajes de programacin son:
Entero
Real o Flotante
Booleano
Carcter
Entero: Ada, C: short, long ( para cambiar el rango )
C: unsignal (enteros sin signo )
Real o Flotante: real o float
double ( precisin )
Booleano: True, False -> Rango de este tipo
(excepcin -> C ) => 0 : Falso
!= 0 : Verdadero
Carcter: se almacena el cdigo asociado al carcter.
Tipos ordinales definidos por el usuario
Un tipo ordinal es aquel cuyo rango de posibles valores puede asociarse fcilmente con el conjunto de los
enteros positivos. Podemos establecer un orden dentro del tipo.
En Pascal son ordinales: Entero, Booleano y Carcter.
Muchos lenguajes le permiten al usuario definir nuevos tipos ordinales. Formas:
Mediante Enumerados
Subrango
ENUMERACION.
En un tipo enumeracin el programador enumera en la definicin del tipo los posibles valores
(constantes simblicas).
Ej: ( Pascal )
type
dia = {Lunes, Martes, Miercoles, Jueves, Viernes, Sbado, Domingo }
A la hora de disear el lenguaje, en un mismo entorno de referencia, puedo definir un tipo ?. Un
mismo literal puede pertenecer a dos grupos diferentes ?.
type
fin_de_semana = { Sbado, Domingo }
Pascal y C no permiten que un mismo literal pertenezca a dos tipos distintos en un mismo entorno de
referencia.
Ada si lo permite. A este problema se le llama Sobrecarga de Literales: estn sobrecargando los literales
sbado y domingo. Ada lo resuelve analizando el contexto en el que aparezca el literal sobrecargado. Y si
lo puede resolver lo resuelve, si no da un error de ambigedad. Si no el programador dispone de una
herramienta para resolver el problema ( lo soluciona de forma explcita ).
dia ` Sabado
fin_de_semana ` Sbado caso de que el compilador no pueda resolverlo. Implementacin del tipo
enumeracin. Asignar un entero no negativo diferente a cada uno de los literales. La mayora de los

lenguajes prohibe realizar operaciones ( sumar, multiplicar, ... ) entre los literales. C es una excepcin.
Entre literales solo pueden hacerse operaciones de comparacin ( = , < , <= , >= , > ,... ). Los literales ni
pueden leerse ni imprimirse.
SUBRANGO.
Un subrango es una subsecuencia contigua de un tipo ordinal.
Ej: ( Pascal )
type
maysculas = `A' ... `Z';
indice = 1 ... 100;
laborable = Lunes ... Viernes;
Para realizar la conexin entre el tipo de que proviene y el tipo subrango se asocia el tipo carcter a
maysculas, mirando de cual proviene.
Adems en tiempo de ejecucin tendr que comprobar que esa asignacin ( el valor ) est dentro del
rango lo que supone un sobrecarga.

Tipos Compuestos
Un tipo compuesto es un tipo estructurado o formado por valores simples. Los lenguajes de
programacin aportan gran cantidad de tipos estructurados: uniones, registros, conjuntos, arrays, lista,
rboles, archivos, ...
Se pueden estudiar de una manera formal y reducirse a:
Producto Cartesiano: tuplas, registros.
Uniones Disjuntas: registros variantes, uniones.
Aplicaciones: arrays.
Conjuntos Potencia: conjunto.
Tipos recursivos: estructuras dinmicas.
PRODUCTO CARTESIANO.
El producto cartesiano de dos tipos S y T: S x T es el conjunto de todos los pares ordenados de valores tal
que el primer valor pertenece al conjunto S y el segundo valor pertenece al conjunto T.
S x T = { (x, y) / x S, y T}
La cardinalidad ( nmero de elementos ) del conjunto producto cartesiano:
|| S x T || = || S || || T || || S ||: cardinalidad de S.
Para n conjuntos:
S1 x S2 x ... x Sn --> n tuplas (S1, S2, ... , Sn)
S x S = S2
S x S x S = S3
... Si n=0
S x ... x S = Sn S0 = ( ) 0-tupla Unit
( n veces ) tupla vaca
PASCAL y ADA: implementan el producto cartesiano con registro.
C: estructuras.

Ej: (Pascal)
Type
Fecha = record
Mes:mes;
Da:1..31;
End;
Estamos definiendo: { enero, ... , diciembre } x { 1 ... 31 }
Para un conjunto cartesiano de n conjuntos existen n Operaciones de Proyeccin. Permiten extraer el
valor que ocupa la posicin i-sima. En el ejemplo de Pascal:
f.mes
f.dia Ambas son operaciones de proyeccin.
En el momento de la ejecucin del programa, las celdas de memoria que se asocian para cada campo,
ocupan posiciones contiguas. En general, cada uno de estos campos puede ser de un tipo distinto, lo que
implica que cada campo tendr un tamao diferente. Por ello hay que guardar:
Tipo correspondiente a cada campo.
Desplazamiento correspondiente a cada campo a partir de la direccin base ( para poder hacer una
operacin de proyeccin ).
La estructura:
DESCRIPTOR TIPO DE LA ESTRUCTURA REGISTRO EN TIEMPO DE COMPILACIN.
( en tiempo de ejecucin no se necesita ningn descriptor ).
Nombre Registro
N Componentes
Nombre1
Tipo1
Desplazamiento1
Nombre2
Tipo2
Desplazamiento2
.......
NombreN
TipoN
DesplazamientoN
Direccin
Direccin base en la que comienza el registro.
UNIONES DISJUNTAS O SUMA.
La unin disjunta o suma de valores pertenecientes a dos tipos S y T (se denota S+T) es el conjunto de
valores en el que cada valor se elige de cada uno de los conjuntos S T y se etiqueta para indicar el
conjunto del que ha sido elegido.
S y T, S + T etiqueta
S + T = { ( true, x ) | x S } { ( false , y ) | y T }
true y false son etiquetas
Cardinalidad: || S + T || = || S || + || T ||
Sobre los valores del conjunto S + T se pueden realizar dos operaciones bsicas:
Comprobar el valor de la etiqueta para conocer el conjunto del que proviene el segundo elemento.
Proyeccin del valor original en S T.

Las uniones se pueden extender: S1 + S2 + ... + Sn ( necesitamos una etiqueta que tome n valores
diferentes ).
Como se ven reflejadas las uniones disjuntas en los lenguajes de programacin ?
Registros Variantes: Ada, Pascal.
Uniones: C.
Cuando un lenguaje de programacin decide adoptar la unin disjunta se debe plantear 2 questiones:
Problema de la comprobacin de tipos.
Forma concreta que adopta la union.
La mayoria de los lenguajes de programacin incluyen la unin disjunta relacionada con la estructura
registro ( es el caso de Ada o Pascal ). Sin embargo en C, la estructura unin es una estructura diferente
de la estructura registro. En C, no se definen etiquetas para las uniones.
Ej de registro variante en Pascal:
Type
Forma = ( punto, circulo, rectangulo );
Figura = record
x,y: real;
case forma_figura: forma of
punto: ( ); tupla vacia ( Unit )
circulo: ( radio: real );
rectangulo: ( lado1, lado2: real );
end;
Figura = real x real x ( Unit + real + ( real x real ) )
Producto cartesiano: real x real
Unin Disjunta: Unit + real + ( real x real )
El conjunto de valores que yo estoy definiendo para el tipo figura es ms que un producto cartesiano, es
un producto cartesiano por una unin disjunta.
Implementacin:
Se utiliza la misma direccin base para cada uno de los elementos variantes, y se reserva espacio para el
elemento variante de mayor tamao. Tendremos que guardar en el descriptor que empleamos en tiempo
de compilacin: la etiqueta, el tipo de la etiqueta y la asociacin entre el tipo de la etiqueta y la tabla de
casos.
Descriptor:
Si el lenguaje no hace una comprobacin de tipos en tiempo de ejecucin entonces en tiempo de
ejecucin no se almacena nada. ( C y Pascal ).
APLICACIONES.
Consideremos una aplicacin m que aplica cada valor x del conjunto S a un valor en el conjunto T. Ese
valor en el conjunto T se llama imagen de x bajo m, m(x).
m: S T
entonces
S T = conjunto de todas las posibles aplicaciones posibles de S en T.
S T = { m / x S m(x) T }
Cardinalidad: || S T || = || T || || S ||
En qu estructura de datos se ve reflejada la aplicacin ?. En los arrays (vector, matriz o tabla).
El array es lo que se llama una aplicacin finita por que es una aplicacin que va desde un conjunto finito
que se denomina conjunto ndice a otro conjunto finito que se llama conjunto componente.

Ej Pascal:
array [ S ] of T;
S T ( estamos definiendo esta aplicacin ).
Muchos lenguajes de programacin permiten definir arrays multidimensionales ( matrices ).
Ej: (Pascal) (array n-dimensional)
Type
a = array[ i1 .. s1, i2 .. s2, ... , in .. sn ] of T
( aplicacin que va desde un solo ndice al conjunto T ).
a = { i1 .. s1} x { i2 .. s2 } x ... x { in .. sn } T
( aplicacin entre una n-tupla y el conjunto T ).
Problemas con los que nos encontramos a la hora de adoptar una aplicacin:
Tipo de los ndices ( de qu tipo puede ser S ) y limite inferior de los ndices.
En C: el tipo de los indices es un subrango de los enteros.
En Pascal o Ada: el tipo de los indices es cualquier tipo ordinal.
Algunos lenguajes fijan ellos el lmite inferior ( 0 1 ). C lo fija a 0 y en otros lenguajes lo decide el
programador.
Vinculacin de ndices y categorias de arrays. La vinculacin del tipo del ndice a un array normal se hace
de manera esttica. Sin embargo, el rango de valores que puede adoptar ese ndice a veces no se vincula de
manera esttica al array, sino de manera dinmica. Hay cuatro tipos de arrays:
Array esttico: Vinculacin de valores de los ndices y asignacin de espacio al array esttica.
Ej:
Pascal: array global array esttico.
C: static array esttico.
Array dinmico de pila fijo: Vinculacin de rango de valores de los ndices esttica y asignacin de espacio
dinmica ( en la pila de ejecucin ).
Ej:
Pascal, C, Ada: arrays definidos en un subprograma ( arrays locales ).
Array dinmico de Pila: Vinculacin de rango de ndices y asignacin de espacio dinmicas. Pero una vez
se fija no puede cambiarse.
Ej: (Ada)
get (long _ lista); leemos un dato entero.

declare se crea un nuevo bloque en la pila de ejecucin.


lista: array ( 1 ..long_lista ) of integer;
begin
{ cuerpo de la ejecucin }
end;
Array dinmico de heap: Vinculacin del rango de ndices y asignacin de espacio dinmicas ( en tiempo
de ejecucin). Pero ahora puede cambiar el tamao o la direccin en tiempo de ejecucin.
Implementacin del tipo array: Los elementos del array se almacenan en celdas contiguas de memoria. El
cdigo para acceder al elemento del array se genera en tiempo de compilacin y es en tiempo de
ejecucin cuando se produce el direccionamiento a ese cdigo.
Arrays unimensionales; Para calcular la direccin de un elemento del array:
@v[ k] = @v[ li ] + ( k - li ) * e @v[ li ]: direccion base del array.
@v[ k] = ( @v[ li ] - li*e ) + k * e ( @v[ li ] - li*e ): es cte y puede calcularse en t de comp
li: limite inferior.
e:tamao de un elemento del array.
Descriptor de la estructura en t. de compilacin:
Nombre del Array
Tipo del elemento
Tipo del ndice
Lmite Inferior
Lmite Superior
Direccin base del array
Si alguna de estas estructuras se vincula en tiempo de ejecucin, tendriamos que mantener esta parte del
descriptor en tiempo de ejecucin.
Arrays Multidimensionales:
Ej: una matriz; Hay dos posibilidades:
Almacenamiento por Filas.

Almacenamiento por Columnas.


El programador no debera obviar esto del lenguaje de programacin. Un uso ineficiente del lenguaje
podra provocar un fallo de pgina ( por la paginacin ).La mayoria de los lenguajes de programacin
hacen un almacenamiento por filas.
La direccin del elemento ij:
@m[ i, j ] = @m [ fi, ci ] + ( (i - fi ) n + ( j - ci ) ) * e
m: nombre de la matriz
@m [ fi, ci ]: direccin base del primer elemento de la matriz.
e: tamao del elemento de la matriz.
@m[ i, j] = @m[ fi, ci ] - ( fi*n + ci )*e + (i*n + j) *e
(i*n + j) *e: parte variable
@m[ fi, ci ] - ( fi*n + ci )*e: parte constante. Se puede calcular en tiempo de compilacin ( si la asignacin
de espacio se realiza de manera esttica).
Descriptor en tiempo de compilacin:
Nombre Array
Tipo Elemento
Numero Dimensiones
Tipo ndice 1
Lim_Inf Indice 1
Lim_Sup Indice 1
.................
Tipo Indice N
Lim_Inf Indice N
Lim_Sup Indice N
Direccin
Si alguna de las partes del descriptor no se conociera hasta el tiempo de ejecucin, deber mantenerse el
descriptor hasta el tiempo de ejecucin.

Anda mungkin juga menyukai