Unidad I: Arreglos ESTRUCTURA DE DATOS. Una estructura de datos es una colección de datos que pueden ser caracterizados por su organización y las operaciones que se definen en ella. Los datos que una computadora procesa se pueden dividir en : Simples y Estructurados. DATOS SIMPLES. Ocupan sólo una localidad de memoria, es decir se hace referencia a un valor único a la vez. Ejemplo: Enteros, Reales ,Caracteres,Booleanos, etc. DATOS ESTRUCTURADOS. Son aquellos que hacen referencia a un grupo de localidades de memoria a través de un nombre (Identificador), es decir, un dato estructurado es aquél que tiene varios componentes. Cada uno de los componentes puede ser a su vez un dato simple o estructurado. Ejemplo: Arreglos, Registros, Estructuras, etc. TIPOS DE DATOS. Los tipos de datos estructurados se pueden organizar en Estructuras e Datos Estáticas y Dinámicas. Las E.D. ESTATICAS. Son aquéllas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa. Las E.D. DINAMICAS. no tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas. Las estructuras de datos dinámicas son construídas a través de un tipo de dato denominado puntero, las cuales son soportadas en la mayoría de los lenguajes. Una característica importante que diferencia a los tipos de datos es la siguiente: Los tipos de Datos Simples tienen como característica común que cada variable representa a un elemento; los tipos de Datos Estructurados tienen múltiples datos individuales, pudiendo cada uno de éstos ser referenciado independientemente. ARREGLOS.(Array,Vector,Tabla) Es una conjunto finito y ordenado de elementos homogéneos. Finito. todo arreglo tiene un límite; es decir debe determinarse cuál será el número máximo de elementos que podrán formar parte del arreglo. Homogéneo. Todos los elementos de un arreglo son del mismo tipo (todos enteros, booleanos, etc.pero nunca una combinación de distintos tipos). Ordenado. se puede determinar cuál es el primer elemento , el segundo, el tercero,.... y el enésimo elemento. Figura. Representación de Arreglos. Si un arreglo tiene la característica de que puede almacenar a N elementos del mismo tipo, deberá tener la facilidad de permitir el acceso a cada uno de ellos. Así , se distinguen dos partes en los arreglos: *Los Componentes *Los Subíndices Los componentes hacen referencia a los elementos que forman el arreglo. Es decir a los valores que se almacenan en cada una de las casillas del mismo. Los índices permiten hacer referencia a los componentes del arreglo en forma individual. Es decir, distinguir entre los elementos del mismo. Por lo tanto para hacer referencia a un elemento de un arreglo se utiliza: * El nombre del arreglo * El índice del elemento. Definición de Arreglos. iden_arreglo = ARREGLO [líminf...límsuP]DE Tipo Con los valores líminf y límsup se declara el tipo de los índices así como el número de elementos que tendrá el arreglo. El número total de componentes (NTC) que tendrá el arreglo puede calcularse con la fórmula: NTC = Límsup - Líminf +1 Con tipo se declara el tipo de datos para todos los componentes del arreglo. El tipo de los componentes no tiene que ser necesariamente el mismo que el tipo de los índices. (Pueden ser los índices: caracter,entero,enumerado) El valor mínimo permitido de un vector se denomina límite inferior y el valor máximo permitido se denomina superior. Ejemplo: Sea V un arreglo de 50 elementos con índices enteros. vease figura. NTC = ( 50 - 1 + 1 ) = 50 Cada componente del arreglo V será un número entero, y podrá accesarse por medio de un índice que será un valor comprendido entre 1 y 50. asi V[1] hace referencia al elemento de la posición 1. Los índices de tipo entero no necesariamente deben tener un límite inferior igual a cero o a uno. Podrían usarse valores negativos [-10...10] o valores mayores a uno [100...200]. OPERACIONES CON ARREGLOS. *Lectura *Escritura *Asignación *Actualización -Inserción -Eliminación -Modificación *Ordenación *Búsqueda OPERACIÓN DE LECTURA CON ARREGLOS. El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de sus componentes. Ejemplo: Supóngase que desea leer todos los elementos del arreglo V en forma consecutiva. Leer V[1],.... leer V[50] usando el ciclo... Repetir con I desde 1 hasta 50 Leer V[I] Figura. Lectura de Arreglos Puede suceder que no se necesite leer todos los componentes, sino solamente algunos de ellos. Ejemplo: Supóngase que se desea leer los elementos con índices comprendidos entre el 1 y el 30 inclusive. El ciclo necesario es el siguiente: Repetir con I desde 1 hasta 30 Leer V[I] El arreglo queda como se muestra en la Figura. Figura. Lectura de arreglos. OPERACIÓN DE ESCRITURA CON ARREGLOS. El proceso de Escritura de un arreglo es similar a la lectura. Se debe escribir el valor de cada uno de los componentes. Ejemplo: Supóngase que se desea escribir los primeros N componentes del arreglo V en forma consecutiva. Los pasos a seguir son los siguientes: Repetir con I desde 1 hasta N Escribir V[I] OPERACIÓN DE ASIGNACIÓN CON ARREGLOS. En general no es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado a cada componente. ejemplo. En los dos primeros casos se asigna un valor a una determinada casilla del arreglo (en el primero a la señalada por el índice ene, en el segundo a la indicada por el índice mar). CICLO[ene] <- 123.89 CICLO[mar] <- CICLO[ene]/2 En el tercer caso se asigna el 0 a todas las casillas del arreglo, con el que éste queda de la siguiente manera: Repetir con MES desde ene hasta dic Hacer CICLO [MES] <- 0 Figura. Asignación de arreglos En algunos lenguajes es posible asignar una variable tipo arreglo a otra exactamente del mismo tipo. V1 <-- V La expresión anterior es equivalente a: Repetir con I desde 1 hasta 50 Hacer V1[I] <-- V[I] OPERACIÓN DE ACTUALIZACIÓN CON ARREGLOS. En el arreglo pueden insertarse nuevos elementos ,eliminar y/o modificar algunos de los ya existentes. para llevar a cabo estas operaciones eficientemente se debe tener en cuenta si el arreglo está o no ordenado. Es decir, si sus componentes respetan algun orden (Creciente o decreciente). ***INSERCIÓN. ARREGLO DESORDENADO. Para insertar un elemento X en un arreglo V desordenado debe verificarse que exista espacio. Si cumple esta condición, entonces se asignará a la posición N + 1 el nuevo elemento. ARREGLO ORDENADO. Cuando se trabaja con arreglos ordenados debe evitarse alterar el orden al insertar nuevos elementos o al modificar los existentes. Para insertar un elemento X en un arreglo V ordenado debe verificarse que exista espacio. Luego tendrá que encontrarse la posición en la que debería estar el nuevo valor para no alterar el orden del arreglo. Una vez detectada la posición, se procederá a recorrer todos los elementos desde la misma hasta la N-ésima posición, un lugar a la derecha. Finalmente se asignará el valor de X en la posición encontrada. ***ELIMINACIÓN. ARREGLO DESORDENADO. Para eliminar un elemento X de un arreglo V desordenado debe verificarse que el arreglo no este vacío y que X se encuentre en el arreglo. Si se cumples estas condiciones entonces se procederá a recorrer todos los elementos que están a su derecha a una posición a la izquierda, decrementando finalmente el número de componentes del arreglo. ARREGLO ORDENADO. Para eliminar un elemento X de un arreglo ordenado V debe verificarse que el arreglo no este vacío. Si se cumple esta condición, entonces tendrá que buscarse la posición del elemento a eliminar. Si el resultado de la función es un valor positivo, quiere decir que el elemento se encuentra en el arreglo y por lo tanto puede ser eliminado; en otro caso no se puede ejecutar la eliminación. ***MODIFICACION. ARREGLO DESORDENADO. Debe verificarse que el arreglo no esté vacío y que X se encuentre en el arreglo. Si se cumplen estas condiciones entonces se procederá a su actualización. ARREGLOS ORDENADOS. Se debe proceder de manera similar a la eliminación de un elemento en un arreglo ordenado. La variante se presenta en que al modificar el valor X por un valor Y, debe verificarse que el orden del arreglo no se altere. Si esto llegara a suceder, entonces podría rechazarse la operación o reordenar el arreglo. ARREGLOS UNIDIMENSIONALES. (Lineales)Hacen referencia a cada elemento por medio de un solo indice. ARREGLOS BIDIMENSIONALES. Se hace referencia a cada elemento por medio de dos índices. El primero se utiliza generalmente para indicar el renglón y el segundo para indicar la columna. El arreglo A(MxN) tiene M renglones y N columnas. Internamente en memoria se reservan M x N posiciones consecutivas para almacenar todos los elementos del arreglo. Declaración del arreglo: id_arreglo = ARREGLO [líminfr..límsupr, líminfc..límsupc)DE tipo Ejemplo: Sea COSTOS un arreglo bidimensional de números reales con índices de tipo escalar. meses=(ene,feb,mar,abr,may,jun,jul,ago,set,oct,nov,dic) departamentos=(dulces,conservas,bebidas) COSTOS=ARREGLO[meses,departamento)DE reales Meses/Dptos. Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre Dulces 100 400 350 280 300 250 200 180 500 350 400 600 Conservas 300 200 250 300 320 300 280 300 400 420 450 550 Bebidas 120 200 210 200 300 350 300 400 450 220 360 531 NTC= (ord(dic)-ord(ene)+1)*(ord(bebidas)-ord(dulces)+1) = (11-0+1) * (2-0+1) = 12*3 = 36 Cada componente de COSTOS será un real. Para hacer referencia a cada uno de ellos usaremos dos índices y el nombre de la variable tipo arreglo COSTOS[i,j] Donde ene<= i<=dic dulces<=j<=bebidas