Tipos de Datos

download Tipos de Datos

of 7

description

tipos de datos para programacion

Transcript of Tipos de Datos

  • 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.