CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS Capítulo 3 Estructuras de datos estáticas 1/37
1. INTRODUCCIÓN Las estructuras de datos se utilizan, generalmente, para procesar una colección de valores que están relacionados entre sí por algún método. Por ejemplo: una lista de notas, una serie de puntajes de un concurso o una lista de temperaturas medidas a lo largo de un período de tiempo. Las estructuras de datos básicas que soportan la mayoría de los lenguajes de programación son las estructuras estáticas. Una estructura de datos estática es aquella en la 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. Entre las estructuras de datos estáticas se encuentran los arreglos (arreglos unidimensionales - vectores y arreglos bidimensionales - matrices). 2. ARREGLOS UNIDIMENSIONALES - VECTORES ARRAYS Un vector es un conjunto finito y ordenado de elementos homogéneos finito: el tamaño del vector es finito, es decir tiene un fin, un límite. ordenado: los elementos del vector tienen un orden, cada elemento puede ser identificado. homogéneos: los elementos del vector son del mismo tipo de datos. Un vector es el tipo de arreglo más simple, gráficamente puede ser visualizado de la siguiente manera: posición notas 0 1 2 3.. n-1 notas[0] notas[1] notas[2] notas[3].. notas[n-1] Nombre del vector Subíndice que designa la posición del elemento en el vector 2.1. CARACTERÍSTICAS DE LOS ARREGLOS UNIDIMENSIONALES Los arreglos unidimensionales tienen las siguientes características: Todo arreglo unidimensional o vector tiene un nombre, este nombre debe cumplir las características de identificador. Un vector tiene un tamaño finito que viene definido por la variable n. Las posiciones del vector empiezan en 0, y terminan en n-1. Para acceder a un elemento del vector se debe utilizar el nombre y posición. Ejemplo notas[3]. El acceso a un vector puede ser directo o aleatorio. Las operaciones que se pueden realizar con vectores son: declaración, asignación, lectura, escritura, recorrido, actualización (adición, inserción, eliminación), ordenación, y búsqueda. Capítulo 3 Estructuras de datos estáticas 2/37
2.2. DECLARACIÓN EN JAVA Se utilizaran tres formas para declarar un vector: double[ ] vec1 = { 10, 23.5, 15, 7, 8.9 }; int[ ] vec2; vec2 = new int [3]; int j = 10; int[ ] vec = new int[j]; 2.3. RECORRIDO E IMPRESION Recorrido: Es el proceso por el cual se visita todas las posiciones del vector. Para realizar este proceso se utiliza una estructura repetitiva for. Impresión: Es el proceso por el cual se imprime las posiciones del vector. De acuerdo al problema se puede imprimir algunas posiciones específicas del vector o todas las posiciones. Ejercicio 1. Declarar un vector con datos y luego imprimir el vector por pantalla. (Utilizar la propiedad length para saber el tamaño del vector). Ejercicio 2. Declarar un vector con datos y luego imprimir las posiciones 0, 3 y 6. Capítulo 3 Estructuras de datos estáticas 3/37
2.4. ASIGNACIÓN Para realizar la asignación de un valor en una posición de un vector, utilizaremos la siguiente sintaxis: <nombre del array> [subíndice] = <valor> Ejemplos int[ ] vec = new int[10]; vec[3] = 5; vec[9] = 23; int[] a = new int[5] for (i=0; i<5; i++) { a[i]=8; } Ejercicio 3. Declarar un vector de tipo entero vacio de tamaño 10 y asignar valores en las posiciones individuales 0, 5 y 9; finalmente imprimir el vector (las posiciones no asignadas tienen el valor cero) Capítulo 3 Estructuras de datos estáticas 4/37
Ejercicio 4. Declarar un vector de tipo entero vacio de tamaño 8, luego llenar todas las posiciones con el número 5; Ejercicio 5. Declarar un vector vecpar de tipo entero vacio de tamaño 15 y llenarlo con número naturales pares. Capítulo 3 Estructuras de datos estáticas 5/37
Ejercicio 6. Llenar el vector datos de tamaño 7 con números enteros leídos desde teclado. Ejercicio 7. Llenar el vector vec de tamaño n con números enteros impares positivos. Capítulo 3 Estructuras de datos estáticas 6/37
Ejercicio 8. Declarar el vector nombres de tipo String con los nombres de 5 personas, luego imprimir el vector. Ejercicio 9. (Utilizar módulos) Llenar un vector de tamaño n con números múltiplos de 3 y luego mostrar el vector. Capítulo 3 Estructuras de datos estáticas 7/37
Ejercicio 10. (Utilizar módulos) Llenar un vector de tamaño n con números múltiplos de un número entero ingresado por teclado y luego mostrar el vector. Capítulo 3 Estructuras de datos estáticas 8/37
Ejercicio 11. Aplicación de vectores: En un colegio de la ciudad una profesora desea almacenar algunos datos de sus alumnos. La siguiente tabla muestra los datos a almacenar: Nombre Edad Estatura Sexo Luis 13 1,50 M Gloria 12 1,20 F Sergio 12 1,25 M Edwin 14 1,45 M Alejandra 11 1,05 F Desarrollar un programa en java que permita almacenar esta información utilizando vectores. Capítulo 3 Estructuras de datos estáticas 9/37
Capítulo 3 Estructuras de datos estáticas 10/37
Capítulo 3 Estructuras de datos estáticas 11/37
2.5. ADICIONAR Para realizar los procesos de adición e inserción de un elemento en un vector vamos a declarar nuestro vector de un tamaño amplio y haremos uso de una variable n que indicara las posiciones que vamos a usar del vector. Ejercicio 12. Realizar un programa que utilice un modulo para adicionar un elemento a un vector. (La adición debe ser realizada por el final de vector) Capítulo 3 Estructuras de datos estáticas 12/37
Capítulo 3 Estructuras de datos estáticas 13/37
2.6. ELIMINACIÓN Ejercicio 13. Realizar un programa que utilice un modulo para eliminar un elemento de un vector. (La eliminación debe ser realizada por el final de vector) Capítulo 3 Estructuras de datos estáticas 14/37
Ejercicio 14. Realizar un programa que utilice un modulo para eliminar un elemento de un vector de una posición específica. Capítulo 3 Estructuras de datos estáticas 15/37
Capítulo 3 Estructuras de datos estáticas 16/37
2.7. INSERCIÓN El proceso de insertar un elemento a un vector, implica insertar el elemento en una de las posiciones entre el inicio y final del vector. Ejercicio 15. Realizar un programa que utilice un modulo para insertar un elemento en una posición específica del vector. Capítulo 3 Estructuras de datos estáticas 17/37
Capítulo 3 Estructuras de datos estáticas 18/37
2.8. ORDENACIÓN El proceso de ordenación de un vector consiste en ordenar los elementos bajo un criterio, puede ser ordenación ascendente u ordenación descendente. Ejercicio 16. Realizar un programa que utilice un modulo para ordenar los elementos de un vector de forma ascendente. Capítulo 3 Estructuras de datos estáticas 19/37
Capítulo 3 Estructuras de datos estáticas 20/37
2.9. BÚSQUEDA SECUENCIAL Es el proceso por el cual se busca de manera secuencial un dato en un vector. Se utiliza cuando el vector no está ordenado o no puede ser ordenado previamente. Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del vector hasta encontrarlo, o hasta que se llegue al final. La existencia se puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del vector. Ejercicio 17. Programar la búsqueda secuencial en un vector, para indicar si un dato se encuentra o no en el vector. Capítulo 3 Estructuras de datos estáticas 21/37
Ejercicio 18. Programar la búsqueda secuencial en un vector, utilizando el algoritmo de búsqueda centinela. Capítulo 3 Estructuras de datos estáticas 22/37
Capítulo 3 Estructuras de datos estáticas 23/37
2.10. BÚSQUEDA BINARIA Se utiliza cuando el vector en el que queremos determinar la existencia de un elemento está previamente ordenado. Este algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente el número de iteraciones necesarias. La idea consiste en ir dividiendo el arreglo en mitades. Para implementar este algoritmo se compara el elemento a buscar con el elemento en el centro del vector: Si coinciden, hemos encontrado el dato buscado. Si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del vector que va desde el inicio de éste hasta el elemento tomado, Si el valor de éste es menor que el del elemento buscado se repite el procedimiento en la parte del vector que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en todo el vector. Ejercicio 19. Programar la búsqueda binaria en un vector. Capítulo 3 Estructuras de datos estáticas 24/37
Capítulo 3 Estructuras de datos estáticas 25/37
3. ARREGLOS BIDIMENSIONALES MATRICES Un arreglo bidimensional se puede considerar como un vector de vectores, es denominado también como matriz. Un arreglo bidimensional es un conjunto finito y ordenado de elementos homogéneos finito: el tamaño de la matriz es finito, es decir tiene un fin, un límite. ordenado: los elementos de la matriz tienen un orden, cada elemento puede ser identificado. homogéneos: los elementos de la matriz son del mismo tipo de datos. Para localizar o almacenar un valor en la matriz, se deben especificar dos posiciones (dos subíndices), uno para la fila y otro para la columna. Los elementos se referencias con el formato: M[3][4] elemento de la fila 3 y columna 4 Las matrices se usan para representar datos que pueden verse como una tabla con filas y columnas. Gráficamente una matriz puede ser visualizada de la siguiente manera: Fila 0 Fila 1 Fila i Fila n-1 n x m Columna 0 Columna 1 Columna j Columna m-1 Capítulo 3 Estructuras de datos estáticas 26/37
3.1. CARACTERÍSTICAS DE LOS ARREGLOS BIDIMENSIONALES Los arreglos bidimensionales tienen las siguientes características: Todo arreglo bidimensional o matriz tiene un nombre, este nombre debe cumplir las características de identificador. Una matriz tiene un tamaño finito que viene definido por el número de filas y columnas asignadas a las variables n (filas) y m (columnas). Las posiciones de la matriz empiezan en (0,0) y terminan en (n-1, m-1). Para acceder a un elemento de la matriz se debe utilizar el nombre y subíndices para la fila y columna. Ejemplo notas[3][5]. El acceso a una matriz puede ser directo o aleatorio. Las operaciones que se pueden realizar con matrices son: declaración, asignación, lectura, escritura, recorrido. 3.2. DECLARACIÓN EN JAVA Se utilizaran dos formas para declarar una matriz: int a[ ][ ] = {{1,2,3}, {4,5,6}, {7,8,9}}; double b[ ][ ] = new double [3][3]; 3.3. RECORRIDO E IMPRESION Recorrido: Es el proceso por el cual se visita todas las posiciones de la matriz. Para realizar este proceso se utiliza dos estructuras repetitivas for. Impresión: Es el proceso por el cual se imprime las posiciones del vector. De acuerdo al problema se puede imprimir algunas posiciones específicas del vector o todas las posiciones. Ejercicio 20. Declarar una matriz con datos y luego imprimir la matriz por pantalla. (Utilizar la propiedad length para saber el tamaño de las filas y columnas). Capítulo 3 Estructuras de datos estáticas 27/37
Ejercicio 21. Declarar un vector con datos y luego imprimir las posiciones [0][1], [2][2] y [3][1]. 3.4. ASIGNACIÓN Para realizar la asignación de un valor en una posición de una matriz, utilizaremos la siguiente sintaxis: Ejemplos <nombre del array> [subindice fila][subindice columna] = <valor> Asignación de algunas posiciones: int[ ][ ] mat = new int[10][10]; mat[3][5] = 5; mat[9][2] = 23; Asignación de todas las posiciones de la matriz: int[ ][ ] mat1 = new int[5][8] for (i=0; i<5; i++) { for (j=0; j<8; j++) { a[i][j]=8; } } Capítulo 3 Estructuras de datos estáticas 28/37
Ejercicio 22. Declarar una matriz de tipo entero, vacio de tamaño 5x5 y asignar valores en las posiciones individuales [0][0], [1][1], [2][4] y [4][2]; finalmente imprimir la matriz. Ejercicio 23. Declarar una matriz de tipo entero vacio de tamaño 3x5, luego llenar todas las posiciones con el número 15. Capítulo 3 Estructuras de datos estáticas 29/37
Ejercicio 24. Declarar una matriz matpar de tipo entero, vacio de tamaño 6x5 y llenarlo con números naturales pares. Ejercicio 25. Llenar matriz mat de tamaño n x m con números enteros impares positivos. Capítulo 3 Estructuras de datos estáticas 30/37
Ejercicio 26. Declarar un matriz de tipo String que permita almacenar los nombre y apellidos de un grupo de estudiantes, finalmente imprimir la matriz. Capítulo 3 Estructuras de datos estáticas 31/37
Ejercicio 27. (Utilizar módulos) Llenar una matriz de tamaño n x m con números múltiplos de 3 y luego mostrar la matriz. Capítulo 3 Estructuras de datos estáticas 32/37
Ejercicio 28. Aplicación de matrices: En una universidad de la ciudad un docente desea almacenar las notas de sus alumnos. La siguiente tabla muestra los datos a almacenar: Nombre Apellido Asistencia Prácticas Examen Roberto Foronda 4 10 20 Gloria Echevarría 5 7 15 Sergio Loayza 3 8 12 Edwin Miranda 4 5 8 Alejandra Flores 5 10 15 Desarrollar un programa en java que permita almacenar esta información utilizando matrices. La solución al ejercicio utiliza dos matrices, la primera almacena el nombre y apellido de cada estudiante y la segunda matriz almacena las notas. Capítulo 3 Estructuras de datos estáticas 33/37
Capítulo 3 Estructuras de datos estáticas 34/37
Capítulo 3 Estructuras de datos estáticas 35/37
Ejecución del programa: Capítulo 3 Estructuras de datos estáticas 36/37
4. ARREGLOS MULTIDIMENSIONALES Un arreglo puede ser definido de tres dimensiones, cuatro dimensiones, hasta de n-dimensiones. En general, un arreglo de n-dimensiones requiere que los valores de los n-subíndices puedan ser especificados a fin de identificar un elemento individual del arreglo. Ejemplo de un arreglo de tres dimensiones: Capítulo 3 Estructuras de datos estáticas 37/37