2.3.2 Tipos de Datos Estructurados Arreglos, Registros, Strings y Uniones Tipo Arreglo l l l Es un tipo estructurado consistente en un conjunto ordenado de elementos que se identifican por su posición relativa mediante un índice. Existe un tipo asociado a los elementos y al índice. Índice se escribe entre: l l l Arreglos Multidimensionales l Pascal permite sólo dos dimensiones C y C++ Verificación de rango del índice mejora fiabilidad (Pascal y Java lo hacen). Inicialización de Arreglos l ANSI C y C++ char *mensaje = “Hola mundo\n”; char *dias[] = {“lu”, ”ma”, “mi”, “ju”, “vi”, “sa”, “do”}; TYPE matriz = ARRAY [subindice, subindice] OF real; l paréntesis redondo (Basic) o cuadrado (Pascal, C, C++ y Java). l Java real matriz [DIM1][DIM2]; int[] edades = { 7, 12, 18, 21, 25 }; l Operadores con Arreglo l l l Pascal y C y no tienen soporte especial (sólo selector con subíndice []) C++ permite definir una clase arreglo por el usuario y operadores tales como subíndice, asignación, inicialización, etc. Java define los arreglos como tipos especiales de objetos. Permite uso de subíndice, cálculo del largo y otros métodos. Pascal no lo permite Operadores con Arreglo l l l C/C++ no tiene chequeo de rango para los índices. Tampoco permite averiguar el largo de un arreglo. Pascal provee chequeo de rango Java provee chequeo de rango y permite conocer el largo del arreglo. int[] arr = {1,2,3,4,6,7,2,3}; for(int i=0;i<arr.length ;i++) { ... } 1 Implementación de Arreglos l La memoria es un arreglo unidimensional de celdas: l l l Un arreglo es una abstracción del lenguaje Un arreglo debe ser mapeado a la memoria l C++ provee mapas y multimapas a travé de la STL (Standard Template Library) l l Arreglo no ordenado de elementos que son accedidos por una clave Cada elementos corresponde a un par ordenado (clave, dato) PERL provee esta estructura con el nombre de hash: %dias = ( 1 => “Enero”, … 12 => “Diciembre” ); print $ dias{7}; Puede influir en la forma más eficiente de recorrido. Arreglos Asociativos l l Arreglos bidimensionales se almacenan como fila de columnas, o viceversa l l l Ejemplo: dirección de lista[k] dir(lista[0]) + (k)*tamaño dir(lista[bajo]) + (k-bajo)*tamaño l Arreglos Asociativos Mapas: una clave, un valor. Multimapas: un clave, múltiples valores. Java provee interfaces para diccionarios e implementaciones de tablas hash. Arreglos Asociativos l Hashing l l l Ubicación de un elemento dentro del arreglo por una función matemática sobre la clave. Los arreglos son casos especiales, donde la clave es el índice y la función matemática es la identidad. Permite que las claves sean estructuras más complejas. clave f(clave ) posición Tipo Registro l Permite composición heterogénea de elementos de datos Cada elemento se identifica por un nombre (campo o miembro) l l l Introducido por COBOL (data division) En C equivale a struct Concepto de clase en O-O soporta registros (e.g. C++ y Java) Ejemplo: Registros en C y C++ (struct) struct empleado_t { struct { char primer[10]; char paterno[10]; char materno[10]; } nombre; int sueldo; } empleado_t pelao, guaton; guaton.sueldo = 550000; strcpy( pelao.nombre.primer, “Juan”); 2 Ejemplo: Registros en Pascal Cadena de Caracteres (String) TYPE empleado_t = RECORD nombre : RECORD primer: PACKED ARRAY [1.10] OF char; paterno: PACKED ARRAY [1.10] OF char; materno: PACKED ARRAY [1.10] OF char; END {nombre}; sueldo : integer END; VAR pelao, guaton : empleado_t; l l l l l l l l l Perl hace uso de expresiones regulares l l l Ejemplo: /[A-Za-z][A-Za-z\d]+/ permite calzar un identificador /^(\s+)\ s+(s+)\ s+(\s+)$/ permite calzar tres palabras Algunos lenguajes lo proveen como tipo (Java y Perl ) Otros sólo como arreglo de carácteres (C, C++ y Pascal) ¿Puede el largo variar dinámicamente? Ejemplo de String en C Asignación Comparación Concatenación Largo Transformación (e.g. de string a entero) Strings: Calce de Patrones (Pattern matching) l l Mejora la facilidad de escritura ¿Es una cadena un tipo primitivo? l BEGIN … pelao.sueldo := 550000; Strings: Operaciones Básicas Principalmente para la comunicación máquinausuario y para manipulación de textos char str[20]; … if (strcmp(str ,”Hola”){ … else { … } Diseño de String l Diseño de string considera: l l l l Largo estático (Pascal y Java) Largo dinámico limitado (e.g. C y C++) Largo dinámico (Perl ) Último es el más flexible, pero es más costoso de implementar y ejecutar. 3 Tipo Union l l l l l Permite almacenar diferentes tipos de datos en diferentes tiempos en una misma variable. Reserva espacio de memoria igual al mayor miembro definido. Todos los miembros comparten la memoria y comienzan desde la misma dirección. Su uso es en general poco seguro. Java no provee este tipo de estructura Ejemplo: C y C++ union direccion { char dominio[20]; int IP[4]; }; IP Dominio 4