POLITECNICO COLOMBIANO JAIME ISAZA CADAVID Fundamentos de programación 1 Guía de preparación seminario de encuentro arreglos
ARREGLO: Un arreglo se define como una colección finita, homogénea y ordenada de elementos: • • •
Finita : Todo arreglo tiene un límite, establecido por el máximo número de elementos que puede tener el arreglo. Homogénea : Todos los elementos del arreglo son del mismo tipo (todos entero, todos real, etc, pero nunca una combinación de distintos tipos). Ordenada : Se puede determinar cuál es el primer elemento del arreglo, cuál es el segundo, cuál es el tercero, el cuarto, . . . y el n-ésimo elemento.
Representación gráfica de un arreglo: ...
Primer elemento
Segundo elemento
i – ésimo elemento
n –ésimo elemento
Un arreglo tiene la característica de poder almacenar simultáneamente N elementos del mismo tipo y permitir el acceso a cada uno de esos elementos. En un arreglo pueden diferenciarse dos partes : •
Elementos o componentes : Son cada uno de los valores almacenados en las posiciones del arreglo (casillas del arreglo).
•
Subíndices : Se refieren a las posiciones relativas dentro del arreglo, a través de ellos se accede a elementos individuales del arreglo.
elementos
2
subíndices
i=1
8 i=2
-3
-1
1
...
i=3
-2
1
8 i=n
Para hacer referencia a un elemento de un arreglo, se utiliza el nombre del arreglo y el subíndice del elemento. OBSERVACIONES: • • •
El subíndice debe ser un valor entero. Los elementos pueden ser de cualquier tipo, pero todos los elementos deben ser del mismo tipo. Se utilizan paréntesis para indicar una posición dentro del arreglo. Entre los paréntesis puede ir un valor literal, una variable, una constante o una expresión, siempre se que produzca un valor entero.
Podemos clasificar los arreglos en dos categorías:
Unidimensionales (Vectores) Bidimensionales (Matrices)
ARREGLO UNIDIMENSIONAL O VECTOR: También es conocido como lineal, e ese elemento en el arreglo. El rango o longitud de un vector es la diferencia entre el índice de valor máximo y el índice de valor mínimo de ese arreglo + 1. Normalmente los índices comienzan a enumerarse, es decir, el valor mínimo del índice es 0 ó 1, dependiendo del lenguaje (en Pascal con 1 y en C con 0). Sin embargo nadie impide que comiencen en cualquier otro valor. Como ya se mencionó, los arreglos se almacenan siempre en posiciones consecutivas de memoria y podemos acceder a cada elemento del arreglo de manera independiente a través de los índices. Un índice no tiene porque ser un valor constante, sino que puede ser también una variable o una expresión que al ser evaluada devuelva ese índice, por ejemplo, puede expresarse como una constante entera (por ejemplo 3), una variable entera (por ejemplo x) o una expresión entera (por ejemplo x + y - 1). En cualquiera de los casos, el valor del subíndice debe ser un entero mayor o igual a cero.
PREGUNTAS ORIENTADORAS Cuál es la función del índice en un arreglo? De qué manera se almacenan los arreglos en la memoria?
DECLARACIÓN DE UN ARREGLO: Para declarar un arreglo, daremos primero el tipo de dato que va a manejar nombre del arreglo, seguido entre corchetes del tamaño de este, que puede estar compuesto por el rango de sus índices o simplemente la cantidad de elementos. SINTAXIS GENERAL: Tipo: [Li.....Ls] Real : sueldo : arreglo [1 … 8] O también: Tipo : [número de elementos] Real : sueldo[5] REPRESENTACIÓN GRÁFICA DE UN VECTOR Vec[1] Vec[2] Vec[3] Vec[4]
7 8 9 1 0
OPERACIONES CON UN ARREGLO UNIDIMENSIONAL 1. Asignación de un dato a una posición concreta del arreglo: <nom_arreglo>[indice] valor Supongamos que tenemos un vector de 10 elementos llamado Ventas y vamos a asignarle el valor 800000 a la posición tres. Ventas [3] 800000
2. Lectura y escritura de datos: leer <nom_arreglo>[indice] escribir <nom_arreglo>[indice] Para llenar un vector, la forma más simple es utilizando la estructura repetitiva para, aunque obviamente puede hacerse con mientras o repetir. Ejemplo: Siguiendo con el vector ventas, para llenar cada una de las posiciones del vector lo podemos hacer utilizando las tres estructuras repetitivas vistas, así: 1. PARA (i=1,12, 1) hacer escribir ( “Introduce las ventas del mes”, i) leer ventas [i] fin Para 2. i=1 mientras (i <= 12) hacer Leer ventas[i] i=i+1 Fin-mientras 3. i=1 Repetir Leer ventas[i] i=i+1 Hasta-que i>12 3. Recorrido o acceso secuencial de un arreglo: Consiste en pasar por todas las posiciones del arreglo para procesar su información. Para (i=1, 12, 1) hacer ventas [i] ventas [i] + 1000000 Fin para 4. Actualización de un arreglo: 1) Añadir datos: Es un caso especial de la operación de inserción de un elemento en un arreglo, pero el elemento lo metemos después de la última posición que contiene información válida en el arreglo.
Para que esto se pueda hacer es necesario que si actualmente el arreglo tiene K posiciones de información válida, tenga un tamaño de al menos K+1 para que pueda añadir otro elemento a continuación de K. <nom_arreglo>[K+1] valor 2º) Inserción de datos: Consiste en introducir un elemento en el interior de un arreglo para lo cual será necesario desplazar todos los elementos situados a la derecha del que vamos a insertar una posición a la derecha con el fin de conservar el orden relativo entre ellos. Para que se pueda insertar un nuevo elemento en el arreglo si ya existen N elementos con información en el arreglo, el arreglo tendrá que tener un tamaño de cómo mínimo N+1 para poder insertar el elemento. C
E
F
J
M
O
“G” Siendo K la posición en la que tengo que insertar el nuevo elemento y N el número de elementos válidos en el arreglo en el momento de la inserción y siempre suponiendo de N+1, el algoritmo de inserción será: Para (i=N, K,1) Hacer A[I+1] A[I] Fin para A[K] valor 3º) Borrar datos: Para eliminar un elemento de un arreglo si ese elemento está posicionado al final del arreglo, no hay ningún problema, simplemente si el tamaño del arreglo era N, ahora hay que considerar que el tamaño del arreglo es N-1. Si el elemento a borrar ocupa cualquier otra posición entonces tendré que desplazar todos los elementos situados a la derecha del que quiero borrar una posición hacia la izquierda para que el arreglo quede organizado. C
E
F
J
M
O
Borrar J. Suponiendo que el número de elementos validos actualmente es N y que quiero borrar el elemento de la posición K.
Para (i=K, N-1,1 ) hacer A[I] A[I+1] Fin para Para indicar que el número de elementos validos es N, podríamos indicarlo como N N-1. Ejemplo: Calcular la suma de los elementos de un vector. Var. Entero : A arreglo [8] = {1, 3, 5, 4, 7, 2, 99, 16} Entero : i, total Inicio total 0 Para (i = 0, 8, 1) hacer total total + a[i] fin-para Escribir total Fin 2. Ingresar por teclado cada uno de los 5 elementos de un arreglo de nombre VECTOR Y luego leerlos y presentarlos por pantalla en orden inverso al que entraron (de 5 a 1) Solución: Var. Entero : VECTOR [0, 4] Entero : i Inicio Para (i = 0, 4, 1) Hacer Leer VECTOR[i] Fin Para Para (i = 0, 4, 1) Hacer Escribir VECTOR[i] Fin Para FIN
ARREGLOS BIDIMENSIONALES O MATRICES Un arreglo bidimensional o matriz esta compuesto por elementos del mismo tipo organizados por filas (M) y columnas (N), conformando dos dimensiones, por lo que para referirse a un elemento del arreglo se requiere el uso de dos índices en lugar de uno en el caso del arreglo unidimensional, por lo tanto, la representación lógica no será un vector sino una matriz. El primer subíndice podrá variar entre 1 y M si hemos empezado a numerar los índices por 1, y el segundo índice variará entre 1 y N, si hemos empezado a numerar los índices por el 1. Si se desea acceder a un elemento I,J estaríamos accediendo al elemento que ocupa la fila I y la columna J. En memoria, sin embargo todos los elementos del arreglo se almacenan en posiciones contiguas pero nosotros lo vemos como una matriz. Se puede definir un arreglo de dos dimensiones, de la siguiente manera: : <nom_arreglo> [LI1..LS1,LI2..LS2] Donde: LI1…LS1 equivale al límite inferior y superior de las filas. LI2…LS2 equivale al límite inferior y superior de las columnas. El tamaño del arreglo sería (LS1-LI1+1)*(LS2-LI2+1) O : <nom_arreglo> [TF] [TC] Donde TF es la cantidad de filas Donde TC es la cantidad de columnas Ejemplo: Necesitamos almacenar las ventas en una empresa para cada uno de los 5 empleados durante todos los 12 meses del año. Real : Ventas: arreglo [¡…5, 1…12] por lo tanto, el tamaño sería 5*12= 60 1 Emp 1 Emp 2
2
3
4
5
6
7
8
9
10
11
12
Emp 3 Emp 4 Emp 5 Manipulación de matrices: Para inicializar en 0 todos los elementos de la matriz. Const N=5 M = 12 Var Entero M [1..N,1..M] Entero i,j Inicio Para (i=1,N, 1) Hacer Para (j=1,M, 1) Hacer M [i, j] 0 Fin desde Fin desde Para hacer el llenado de una matriz se deben de usar dos variables para los índices y se utilizan 2 ciclos uno para los renglones y otro para las columnas. EJEMPLO Dada una matriz de 3 por 3, colocar en las columnas los elementos de las filas. Solución: Var. Entero : Matriz1 [0, 2] = { {5, 20, 3}, {7. 5, 20}, {15, 10 30} Entero : Matriz2 [0, 2], i, j Inicio Para (i = 0, 4, 1) hacer Para (j = 0, 4, 1) hacer Matriz2[j,i] = Matriz1[i,j] Fin para Fin para Para (i = 0, 4, 1) hacer Para (j = 0, 4, 1) hacer Escribir Matriz2[i,j] Fin para j Fin para i Fin Arreglos Multidimensionales
Un arreglo multidimensional es aquel que esta compuesto por 3 o más dimensiones. Si tenemos un arreglo de N dimensiones, cada dimensión de tamaño d1,d2,..,dN, el número de elementos del arreglo será d1*d2*..*dN, y para acceder a un elemento concreto del arreglo utilizaremos N índices, cada uno de los cuales referenciará a una posición dentro de una dimensión, siempre según el orden de declaración. En memoria, el arreglo se sigue almacenando en posiciones consecutivas. La declaración de un arreglo multidimensional sería: Tipo: Nom_arreglo: [LI1..LS1,LI2..LS2,LI3..LS3,LIN..LSN] Donde: LI1..LS1 equivale al límite inferior y superior de la primera dimensión LI2..LS2 equivale al límite inferior y superior de la segunda dimensión LI3..LS3 equivale al límite inferior y superior de la tercera dimensión LIN..LSN equivale al límite inferior y superior de la dimensión N. Ejercicios de desarrollo: En un grupo de n estudiantes se requiere almacenar las notas definitivas de todos los estudiantes, realice un algoritmo que halle la nota promedio de todo el grupo, los alumnos con nota igual o superior a la nota promedio y el alumno con mejor nota media. 2. En el Instituto de Meteorología de Caldas se tienen los datos del volumen de precipitaciones (en mm cúbicos) en cada uno de los municipios del departamento durante el primer semestre del año 2003, tal y como se muestra en la siguiente tabla: 1.
Municipios Aguadas Anserma …… Viterbo
MESES Ene ....... -
Feb ....... -
....... ....... ....... ....... .......
Confeccione un programa que determine: a. En qué mes (o meses) el volumen total de lluvias fue mayor? b. La media mensual total.
Jun ....... -