Documento 89537

Anuncio
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
Descargar