Departamento de Informática Departamento de Informática Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Lenguajes de Programación Lenguajes de Programación Tipo Arreglo • Es un tipo estructurado consistente en un conjunto ordenado de elementos que se identifican por su posición relativa mediante un índice. 2.4 Tipos de Datos Estructurados • Existe un tipo asociado a los elementos y al índice. • Índice se escribe entre paréntesis redondo (Fortran y ADA ) o cuadrado (Pascal, C, C++, Modula-2 y Java). • Verificación de rango del índice mejora fiablidad (Pascal, Ada y Java lo hacen). Arreglo, Registro, Unión y Conjunto 1 RMA/2000 Departamento de Informática Universidad Técnica Federico Santa María RMA/2000 II- 2 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Arreglos: Categorías de Ligado ... Categorías de Ligado • 1) Arreglo Estático: rango de índice y memoria ligado antes de la ejecución (ejecución eficiente) • 3) Arreglo Dinámico de Stack: Rango de índice y memoria asignada dinámicamente; permanece fijo durante tiempo de vida de la variable (más flexible). – e.g. Único tipo en Fortran77. • 2) Arreglo Dinámico Fijo de Stack : rango de índice ligado estáticamente, pero memoria se asigna dinámicamente (uso más eficiente de la memoria) – e.g. ADA y algunas implementaciones de C y C++ • 4) Arreglo Dinámico de Heap: Tamaño puede variar durante tiempo de vida (la mayor flexibilidad) – e.g. Arreglos definidos dentro de un procedimiento o función en Pascal y C (sin static). RMA/2000 – e.g. C y C++ con malloc (con restricciones) y PERL II- 3 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación RMA/2000 II- 4 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: Arreglos Dinámicos de Stack Lenguajes de Programación Ejemplo: Arreglos Dinámicos de Heap • C y C++ char *str, *s, *t; void foo(int n) { int a[n]; … str = malloc( strlen(s) + strlen(t)+1); strcat(strcpy(str, s), t); for (int i=0; i<n; i++) { ... } ... • Perl } @a = split (“ “, $text); RMA/2000 II- 5 RMA/2000 II- 6 Departamento de Informática Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Arreglos Multidimensionales Lenguajes de Programación Inicialización de Arreglos • A partir de Fortran IV se permite declarar hasta 7 dimensiones • Pascal permite sólo dos dimensiones • Fortran INTEGER MES(12); DATA MES /31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/ TYPE matriz = ARRAY [subindice, subindice] OF real; • ANSI C y C++ char *mensaje = “Hola mundo\n”; char * dias[] = {“lu”, ”ma”, “mi”, “ju”, “vi”, “ sa”, “do”}; • C y C++ real matriz [DIM1][DIM2]; • Pascal y Modula-2 no lo permiten RMA/2000 II- 7 Departamento de Informática RMA/2000 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Operadores con Arreglo • La memoria es un arreglo unidimensional de celdas: – Un arreglo es una abstracción del lenguaje – Un arreglo debe ser mapeado a la memoria • Ejemplo: dirección de lista[k] • C++ permite definir una clase arreglo por el usuario y operadores tales como subíndice, asignación, inicialización, etc. RMA/2000 Lenguajes de Programación Implementación de Arreglos • APL y Fortran 90 proveen varios operadores • ADA permite la asignación • Pascal y C y no tienen soporte especial (sólo selector con subíndice []) II- 9 Departamento de Informática dir(lista[0]) + (k)*tamaño dir(lista[bajo]) + (k-bajo)*tamaño • Arreglos bidimensionales se almacenan como fila de columnas, o viceversa RMA/2000 II- 10 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Arreglos Asociativos Lenguajes de Programación Tipo Registro • Permite composición heterogénea de elementos de datos Cada elemento se identifica por un nombre (campo o miembro) • 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 = ( – Introducido por COBOL (data division) – En C equivale a struct – Concepto de clase en O-O soporta registros (e.g. C++ y Java) 1 => “Enero”, … 12 => “Diciembre” ); print $dias{7}; RMA/2000 II- 8 II- 11 RMA/2000 II- 12 Departamento de Informática Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Ejemplo: Registros en C y C++ (struct) Ejemplo: Registros en Pascal 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; struct empleado_t { struct { char primer[10]; char paterno[10]; char materno[10]; } nombre; int sueldo; } empleado_t pelao, guaton; BEGIN … pelao.sueldo := 550000; guaton.sueldo = 550000; strcpy( pelao.nombre.primer, “Juan”); RMA/2000 II- 13 Departamento de Informática RMA/2000 II- 14 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María • Algunos lenguajes sólo permiten referencias de calificación completa (C y C++) • Otros permiten referencias elípticas, una forma más conveniente de programar (Pascal, Cobol y PL/I) • Ejemplo: Pascal pelao.nombre.primer := ´Juan pelao.nombre.paterno := ´Perez pelao.nombre.materno := ´Machuca WITH pelao.nombre DO BEGIN primer := ´Juan paterno := ´Perez materno := ´Machuca END Lenguajes de Programación Tipo Union Referencias Elípticas • Permite almacenar diferentes tipos de datos en diferentes tiempos en una misma variable. • Alternativas de diseño: ´; ´; ´; – ¿Se permite prueba (dinámica) de tipo? • Requiere uso de un discriminador o marca de tipo – ¿Se les puede incrustar en un registro? ´; ´; ´; RMA/2000 II- 15 Departamento de Informática RMA/2000 II- 16 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Ejemplo: C y C++ Lenguajes de Programación Comentarios sobre Uniones • Reserva espacio de memoria igual al mayor miembro definido. union direccion { char dominio[20]; int IP[4]; }; IP • Todos los miembros comparten la memoria y comienzan desde la misma dirección. • Su uso es en general poco seguro (e.g. Pascal, C, C++, Fortran y Modula-2), lo que hace que muchos lenguajes no sean de tipificación fuerte. • Java no provee este tipo de estructura Dominio RMA/2000 Lenguajes de Programación II- 17 RMA/2000 II- 18 Departamento de Informática Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: Uniones en Pascal Lenguajes de Programación Aplicación del Discriminador • Sin discriminador: TYPE coordenada_t = (cartesiana, polar); complejo_t = RECORD CASE coordinada_t OF Cartesiana: (x, y : real); polar: (r, o : real); END; VAR v.coord := polar; CASE (u.coord) OF polar: BEGIN v.r := u.r; v.o := u.o END; cartesiana : BEGIN v.r := sqrt(sqr(u.x)+sqr(u.y ); v.o := arctan(u.y/ u.x) END END; • Con discriminador: RMA/2000 u, v : complejo_t; BEGIN … { copiar u a v en coordenadas polares } TYPE coordenada_t = (cartesiana, polar); complejo_t = RECORD CASE coord : coordinada_t OF Cartesiana: (x, y : real); polar: (r, o : real); END; II- 19 Departamento de Informática RMA/2000 II- 20 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Ejemplo: Uniones en C y C++ Tipo Conjunto typedef enum {CARTESIANO, POLAR} coordenada_t; struct complejo_t { coordenada_t tipo_coord; union { struct{real rad,ang;} p; struct{real x,y;} c; } tag; } u,v; • Permite almacenar un conjunto no ordenado de elementos de un tipo ordinal: tipo base. • Sólo disponible en Pascal y Modula-2 • El tamaño del tipo base es dependiente de la implementación #define polar tag.p #define cartesiano tag.c if (u.tipo_coord == POLAR) { u.tag.p.ang = PI/2; // mas engorroso u.polar.rad = 34.7; // mejor lectura } – La razón es que su implementación se realiza mediante un arreglo de bits. – Limita su uso a pequeños conjuntos ( < 100) RMA/2000 II- 21 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Ejemplo: Pascal • Operadores: […], +, *, >=, <=, IN, [] TYPE caracter = SET OF char; VAR vocal, letras, no_vocal: caracter; c : char; BEGIN vocal := [´A´,´E´,´I´,´O´,´U´] + [´a´,´e´,´i´,´o´,´u´]; letras := [´A´..´Z´] + [´a´..´z´]; no_vocal := letras – vocal; … IF (c IN vocal) THEN BEGIN { procesar vocal} … END; ELSE … RMA/2000 II- 23 RMA/2000 II- 22