Universidad Rafael Urdaneta Escuela de Ingeniería de Computación • • Arreglos Estructura (struct) MSc Jaime Soto 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. Estáticos Datos Estructurados Dinámicos Arrays (Vectores / Matrices) Registros Ficheros Cadenas Listas (Pilas/Colas) Listas Enlazadas Árboles Grafos Los tipos de Datos SIMPLES pueden ser organizados en diferentes estructuras de datos: Estáticas y Dinámicas. Las Estructuras de Datos Estáticas son aquellas 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. Las Estructuras de Datos Dinámicas no tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas. Mediante el uso de un puntero, pueden construir estructuras dinámicas. Supongamos queremos guardar en el ordenador la temperatura que ha hecho cada hora del día. Para darle cierta utilidad al final calcularemos la media de las temperaturas. El programa en C quedaría así: #include <stdio.h> void main() { /* Declaramos 24 variables, una para cada hora del dia */ int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; int temp17, temp18, temp19, temp20, temp21, temp22, temp23; int media; /* Ahora tenemos que dar el valor de cada una */ printf( "Introduzca las 24 temperaturas l separadas por un espacio: " ); scanf( "%i %i %i ... %i", &temp0, &temp1, &temp2, ... &temp23 ); media = ( temp0 + temp1 + temp2 + temp3 + temp4 + ... + temp23 ) / 24; printf( "\nLa temperatura media es %i\n", media ); } Como se puede observar, el programa es largo, y seria poco eficiente si se tratara, por ejemplo, de tomar la temperatura de las 24 horas del día, de todos los días del año ¿Cuántas variables serian? MUCHAS. Aquí es cuando surgen la maravilla de los Arrays, los cuales se pueden interpretar como una colección de variables de un mismo tipo. #include <stdio.h> void main() { /* Con esto ya tenemos declaradas las 24 variables */ int temp[24]; float media; int hora; /* Ahora tenemos que dar el valor de cada una */ for( hora=0; hora<24; hora++ ) { printf( "Temperatura de las %i: ", hora ); scanf( "%i", &temp[hora] ); media += temp[hora]; } media = media / 24; printf( "\nLa temperatura media es %f\n", media ); } Un array es un conjunto finito y ordenado de elementos homogéneos. Propiedades: Ordenado. Significa que todos los elementos del arreglo pueden ser identificados. Homogéneos. Significa que todos los elementos del array son del mismo tipo. Los arrays también son conocidos como matrices o tablas. El tipo más simple de Array es el array Unidimensional o vector (Matriz de una Dimensión). Vector denominado Notas Notas (0) Notas (1) …….. Notas (I) …….. Notas (N) El subíndice o índice de un elemento (0,1,2,…,i,n) designa su posición en la ordenación del vector. Ejemplo de un Vector: El vector temperatura, contiene las temperaturas horarias registradas en una ciudad durante las 24 horas del día. Este vector contiene 24 elementos de tipo REAL, ya que las temperaturas no son siempre enteras. El valor mínimo permitido de un vector se denomina Límite Inferior del vector (L) El valor máximo permitido de un vector se denomina Límite Superior del vector (U). Ejemplo Temperatura: El limite inferior es 1 y el superior 25, entonces Temperatura (I), donde 1<= I <=24 El número de elementos de un vector se denomina Rango del Vector. El rango del vector A(L:U) es U-L+1 Los vectores se almacenan en memoria central de la computadora en un orden adyacente. Así un vector de 50 números denominado NUMEROS se representa gráficamente por 50 posiciones de memoria sucesiva. Memoria NUMEROS [0] Dirección [X] NUMEROS [1] Dirección [X+1] NUMEROS [2] Dirección [X+2] NUMEROS [50] Dirección [X+49] Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una posición de memoria. Así, NUMEROS [25] = 72 almacena el valor 72 en la posición 25ª, en este caso 72. Para visualizar el valor almacenado en determinada posición seria: escribir NUMEROS [25] visualiza el valor en la posición 25ª, en este caso 72. Algoritmos y Programación I – Unidad III Consideremos un vector X de 8 elementos: X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7] 14.0 12.0 8.0 7.0 6.41 5.23 6.15 7.25 Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 8 Operaciones a Realizar: Acciones Resultado Escribir (X[0]) Visualiza el valor 14.0 X[3] ←45 Almacena el valor 45 en x[4] SUMA ← X[0] + X[2] Almacena en la variable suma, la suma de X[0] + X[2], es decir, 22.0 X[4] ← X[4] + 3,5 Suma 3.5 a X[4]; el nuevo valor de X[4] será 9.91 X[5] ← X[0] + X[1] Almacena la suma de X[0] y X[1] en X[5], 26.5 Vector Resultante X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7] 14.0 12.0 8.0 45.0 9.91 26.5 6.15 7.25 Consideremos un vector X de 8 elementos: X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7] 12 5 -7 14.5 20 1.5 2.5 -10 Los subíndices de un vector pueden ser enteros, variables o expresiones enteras. Operaciones a Realizar: Acciones Resultado I ←4 X [I+1] Representa el elemento X(5) de valor 1.5. X [I+2] Representa el elemento X(6) de valor 2.5. X [I-2] Representa el elemento X(2) de valor -7 X [I+3] ¿Qué valor representa? Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son: Asignación. Lectura/Escritura. Recorrido (acceso Secuencial) Actualizar (Añadir, Borrar, Insertar) Ordenación Búsqueda Las operaciones con vectores implican el procesamiento o tratamiento de los elementos individuales del vector Notaciones algorítmicas tipo tipo_de_datos nombre_del_array [Tamaño] Donde: tipo_de_datos: Tipo de Datos de los elementos que contendrá el arreglo nombre_array: Nombre válido del array. Tamaño Numero de Elementos que contendrá el arreglo Tipo int NOMBRES [10] NOMBRES es un array unidimensional de 10 elementos de tipo int Tipo double LISTA [24] Representa un vector cuyos elementos son 24, de tipo double 1. Asignación: La asignación de valores a un elemento del vector se realizará con la instrucción de asignación: A[29] ← 5 asigna el valor 5 al elemento 20 del vector A Si desea asignar valores a todos los elementos de un vector, se debe recurrir a estructuras repetitivas (desde, mientras o repetir) e incluso selectivas (sientonces, según). 1. Asignación: Ejemplo: Si se introducen los valores Si se desea dar el mismo valor a 5,7,8, 14 y 12 mediante todos los elementos, la notación algorítmica se simplifica. asignaciones. A[0] ← 5 A[1] ← 7 A[2] ← 8 A[3] ← 14 A[4] ← 12 desde i=0 hasta 4 hacer A [i] ← 8 fin_desde. Valores: A[0]=8, A[1]=8,….., A[5]=8 Ejemplo de Asignación en C: #include <stdio.h> Se pueden inicializar void main() arreglos, asignándoles valor al comienzo del { programa. int hora; int temperaturas[24] = { 15, 18, 20, 23, 22, 24, 22, 25, 26, 25, 24, 22, 21, 20, 18, 17, 16, 17, 15, 14, 14, 14, 13, 12 }; for (hora=0 ; hora<24 ; hora++ ) { printf( "La temperatura a las %i era de %i grados.\n", hora, temperaturas[hora] ); } } 2. Lectura / Escritura de Datos: La lectura/escritura de datos en arrays u operaciones de entrada/salida normalmente se realiza con estructuras repetitivas, aunque también pueden hacerse con estructuras selectivas. 2. Acceso Secuencial al Vector (recorrido) Se puede acceder a los elementos de un vector para Introducir Datos (Escribir) en el o bien para Visualizar su Contenido (Leer). A la operación de efectuar una acción general sobre todos los elementos de un vector se le denomina Recorrido del vector. Estas operaciones se realizan utilizando estructuras repetitivas, cuyas variables de control (por ejemplo I), se utilizan como subíndices del vector (por ejemplo S[I]). 2. Acceso Secuencial al Vector (recorrido) Ejemplo 1. Lectura de veinte valores enteros de un vector denominado F Procedimiento 1 algoritmo leer_vector tipo int FINAL[20] Var FINAL: F inicio desde i← 0 hasta 19 hacer leer (F[i]) fin_desde fin La lectura de veinte valores sucesivos desde el teclado rellenará de valores el vector F, comenzando con el elemento F[1] y terminando F[20]. 2. Acceso Secuencial al Vector (recorrido) Ejemplo 1. Lectura de veinte valores enteros de un vector denominado F, utilizando bucle mientras. Procedimiento 2 algoritmo leer_vector tipo int FINAL[20] Var FINAL: F inicio i← 0 mientras i <= 19 hacer leer (F[i]) i ← i +1 fin_mientras fin 2. Acceso Secuencial al Vector (recorrido) Ejemplo 1. Lectura de veinte valores enteros de un vector denominado F, utilizando bucle repetir Procedimiento 3 algoritmo leer_vector tipo int FINAL[20] Var FINAL: F inicio i← 0 repetir leer (F[i]) i ← i +1 hasta_que i>19 fin Ejemplo 2. Este ejemplo procesa un array PUNTOS, realizando las siguientes operaciones: Lectura, Cálculo de la Suma de los valores del Array y Cálculo de la media de los valores. algoritmo mediapuntos const LIMITE= 40 tipo real PUNTUACION [LIMITE] var PUNTUACION: puntos real: suma, media entero: i inicio suma ← 0 escribir (´ Datos del Array ´) desde ← 1 hasta LIMITE hacer leer (Puntos [i]) suma ← suma + puntos [i] fin_desde media ← suma/ LIMITE escribir (´ La media es: ´, media) fin Ejemplo de Acceso Secuencial en C #include <stdio.h> #include <conio.h> main() { int vector[7]; /* Tipo_de_datos nombre_del_array [Tamaño] */ int c; /* Contador */ for (c=0;c<=6;c++) { printf ("Numero para guardar en vector[%d]:,c); scanf ("%d",&vector[c]); } for (c=0;c<=6;c++) { /* Para mostrar los datos del vector */ printf("\nValor Vector[%d]=%d",c,vector[c]); } getch(); } 4. Actualización de un Vector: La operación de actualizar un vector, puede constar a su vez de 3 operaciones elementales: Añadir, Insertar y Borrar elementos. Se denomina añadir datos a un vector la operación de añadir un nuevo elemento al final del vector. La única condición necesaria para esta operación consistirá en la comprobación de espacio de memoria suficiente para el nuevo vector. 4. Actualización de un Vector: La operación de insertar un elemento consiste en introducir dicho elemento en el interior del vector. En este caso se necesita un desplazamiento previo hacia abajo para colocar el elemento nuevo en su posición relativa 1 2 3 Alfa Romeo 4 5 Lancia 6 7 8 9 Seat Fiat Ford Renault 1 2 3 Insertar 4 Opel Alfa Romeo Fiat Ford Lancia 5 Opel 6 7 8 9 Renault Seat Insertar Citroen 1 2 3 Alfa Romeo 4 5 Ford 6 7 8 9 Opel Citroen Fiat Lancia Renault Seat 4. Actualización de un Vector: La operación de borrar un elemento al final del vector no presenta ningún problema; el borrado de un elemento del interior del vector provoca el movimiento hacia arriba de los elementos inferiores a él para reorganizar el vector. algoritmo borrado inicio AUX ← COCHES [J] desde i ← j hasta N-1 hacer // llevar el elemento j+1 hacia arriba leer (Puntos [i]) COCHES [i] ← COCHES [i + 1] fin_desde //actualizar contador de elementos // ahora tendra un elemento menos, N-1 N ← N-1 fin Realizar lo EJERCICIOS del Capitulo 7 del Libro de Fundamentos de Programación De Luis Joyanes Aguilar Página 283 Ejercicios del 7.1 al 7.6