Está en la página 1de 12
Profesor: Balderas López Fausto Antonio. Alumno: Núñez Martínez Luis Enrique. Número de Control: 09071569. Carrera: Ingeniería Industrial. Grupo: 7j2I Semestre: 2° Horario: Lunes, Martes, Miércoles, Jueves y Viernes. 14:00 - 15:00 hrs. Materia: Algoritmos y Lenguaje de Programación. Trabajo: Investigación (Arreglos). ARREGLOS (VECTORES O MATRICES) Definición Un Arreglo (matriz o vector, llamados en inglés arrays) es una zona de almacenamiento contiguo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz. Desde el punto de vista lógico una matriz se puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos dimensiones). En principio, se puede considerar que todas las matrices son de una dimensión, la dimensión principal, pero los elementos de dicha fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multidimensionales, aunque las más fáciles de imaginar son los de una, dos y tres dimensiones. Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar una lista, ya que esta estructura puede cambiar de tamaño fácilmente durante la ejecución de un programa. Un arreglo:  No es una variable; es un grupo de variables conocidas como elementos  Cada elemento ocupa una posición dentro del grupo  Todos los elementos son del mismo tipo  El nombre del arreglo indica donde se localiza el grupo en la memoria de la computadora  Los arreglos se clasifican de acuerdo a las dimensiones que tengan  Las dimensiones no tienen relación con el plano Cartesiano; nada que ver con matemática  Las dimensiones indican como están organizados los elementos dentro del grupo  Los arreglos de dos dimensiones pueden visualizarse como tablas  Los valores que se guarden en el arreglo se almacenan en los elementos ya que los elementos son las variables Índice Todo vector se compone de un determinado número de elementos. Cada elemento es referenciado por la posición que ocupa dentro del vector. Dichas posiciones son llamadas índice y siempre son correlativos. Existen tres formas de indexar los elementos de una matriz:  Indexación base-cero (0): En este modo el primer elemento del vector será la componente cero ('0') del mismo, es decir, tendrá el indice '0'. En consecuencia, si el vector tiene 'n' componentes la última tendrá como índice el valor 'n-1'. El C es un ejemplo típico de lenguaje que utiliza este modo de indexación. Indexación base-uno (1): En esta forma de indexación, el primer elemento de la matriz tiene el indice '1' y el último tiene el índice 'n' (para una matriz de 'n' componentes). Indexación base-n (n): Este es un modo versátil de indexación en la que el índice del primer elemento puede ser elegido libremente, en algunos lenguajes de programación se permite que los índices puedan ser negativos e incluso de cualquier tipo escalar (también cadenas de caracteres).   Declaración de Arreglos nombre_variable[índice] = expresión del tipo Esta instrucción asigna el valor asociado de la expresión a la posición índice del arreglo nombre_variable. El índice debe ser una expresión del tipo entero en el rango [0, longitud-1]. Cabe destacar que C++ no chequea que el valor de la expresión sea menor a longitud, simplemente asigna el valor a esa posición de memoria como si formara parte del arreglo, pisando, de esta manera, otros datos que no forman parte del mismo, con lo que finalmente el programa no funciona correctamente. Declaración en C/C++ de un arreglo estático. int v[5]; int i; for (i=0 ; i<5 ; i++) { v[i] = 2*i; } Declaración en C++ de un arreglo de STL: #include vector v; // Si no se especifica el tamaño inicial es 0 for (int i=0 ; i<5 ; i++) { v.push_back(2*i); // inserta un elemento al final del vector } El ejemplo anterior está hecho para el lenguaje C++. En C, para crear arreglos dinámicos se tendrían que utilizar las instrucciones malloc y realloc para reservar memoria de forma dinámica (ver librería stdlib.h), y la función por free para liberar la memoria utilizada. Resultado: 0 1 2 3 4 0 2 4 6 8 El resultado de los dos ejemplos es el mismo arreglo Forma de acceso al Arreglo nombre_variable[índice] es valor del tipo que puede ser asignado a una variable, o pasado como parámetro, imprimirlo, etc. Aquí también vale la aclaración de que el índice debe estar dentro del rango de definición del arreglo, C++ no chequeará que esto sea cierto y devolverá lo contenido en la posición de memoria correspondiente a un arreglo de mayor longitud, el dato obtenido de esta manera es basura. La forma de acceder a los elementos de la matriz es directa; esto significa que el elemento deseado es obtenido a partir de su índice y no hay que ir buscándolo elemento por elemento (en contraposición, en el caso de una lista, para llegar, por ejemplo, al tercer elemento hay que acceder a los dos anteriores o almacenar un apuntador o puntero que permita acceder de manera rápida a ese elemento. Para trabajar con vectores muchas veces es preciso recorrerlos. Esto se realiza por medio de bucles. El siguiente pseudocódigo muestra un algoritmo típico para recorrer un vector y aplicar una función 'f(...)' a cada una de las componentes del vector: i=0 mientras (i < longitud) #Se realiza alguna operación con el vector en la i-ésima posición f(v[i]) i=i+1 fin_mientras Notación La representación de un elemento en un vector se suele hacer mediante el identificador del vector seguido del índice entre corchetes, paréntesis o llaves: Notación vector[índice_1,índice_2...,índice_N] vector[índice_1][índice_2]...[índice_N] vector(índice_1,índice_2...,índice_N) Ejemplos (Java, Lexico, Perl, etc.) (C, C++, PHP, etc.) (Basic) Aunque muchas veces en pseudocódigo y en libros de matemática se representan como letras acompañadas de un subíndice numérico que indica la posición a la que se quiere acceder. Por ejemplo, para un vector "A":  A0,A1,A2,... (vector unidimensional) Arreglos dinámicos y estáticos Lo habitual es que un vector tenga una cantidad fija de memoria asignada, aunque dependiendo del tipo de vector y del lenguaje de programación un vector podría tener una cantidad variable de datos. En este caso, se les denomina vectores dinámicos, en oposición, a los vectores con una cantidad fija de memoria asignada se los denomina vectores estáticos. El uso de vectores dinámicos requiere realizar una apropiada gestión de memoria dinámica. Un uso incorrecto de los vectores dinámicos, o mejor dicho, una mala gestión de la memoria dinámica, puede conducir a una fuga de memoria. Al utilizar vectores dinámicos siempre habrá que liberar la memoria utilizada cuando ésta ya no se vaya a seguir utilizando. Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo denominado recolector de basura (como es el caso de Java) que permiten que el programa decida si debe liberar el espacio basándose en si se va a utilizar en el futuro o no un determinado objeto. Arreglos multidimensionales En Basic, Java y otros lenguajes es posible declarar matrices (arreglos) multidimensionales, entendiéndolas como un vector de vectores. En dichos casos en número de elementos del vector es el producto resultante de cada dimensión. Por ejemplo el vector (arreglo) v(4,1) tiene 10 elementos se calcula del siguiente modo: (0-4) * (0-1). Los elementos de la primera dimensión del vector (arreglo) contiene 5 elementos que van del '0' al '4' y la 2º dimensión tiene 2 elementos que van desde '0' a '1'. Los elementos serían accedidos del siguiente modo: Elemento 1: (0,0) Elemento 2: (0,1) Elemento 3: (1,0) ... Elemento 8: (3,1) Elemento 9: (4,0) Elemento 10: (4,1) Explicación Para crear arreglos en C++, hay que indicar: 1. el tipo de los elementos (ejemplo, int, char, double, bool o un tipo definido por el programador) 2. el nombre del arreglo 3. la cantidad de dimensiones y sus tamaños; cada dimensión comienza con el signo [seguido por el tamaño de la dimensión y termina con el signo ] Para crear un arreglo de una dimensión, el formato es el siguiente: [ ] Para determinar la cantidad de elementos en un arreglo, hay que multiplicar el tamaño de cada una de las dimensiones indicados en la declaración. El tamaño debe ser un literal de tipo entero o el nombre de una constante de tipo entero. Para nombrar un elemento en un arreglo hay que indicar el nombre del arreglo, seguido de tantas parejas de corchetes [ ] como dimensiones declaradas. Dentro de cada pareja de corchetes tiene que haber un índice. La combinación de los índices indica la posición del elemento dentro del grupo. El valor mínimo para un índice es 0. El valor máximo es uno menos que el tamaño de la dimensión correspondiente en la declaración del arreglo. Ejemplos Ejemplo #1 Arreglo de una dimensión Declaración int a[3]; // forma una secuencia de tres elementos Nombre del grupo a Nombre de los elementos a[0] → primer elemento a[1] → segundo elemento a[2] → tercer elemento Ejemplo #2 Arreglo de dos dimensiones Declaración char m[2][3]; // forma una tabla de dos filas y tres columnas // cada fila es un arreglo de una dimensión // la declaración indica que hay dos arreglos de una dimensión Nombre del grupo m→ indica la localización del grupo en la memoria Nombre de las filas m[0] → primera fila → indica la localización de la fila dentro del grupo m[1] → segunda fila → indica la localización de la fila dentro del grupo Nombre de los elementos m[0][0] → primer elemento m[0][1] → segundo elemento m[0][2] → tercer elemento m[1][0] → cuarto elemento m[1][1] → quinto elemento m[1][2] → sexto elemento Ejemplo #3 Arreglo de tres dimensiones Declaración double w[2][2][3]; // forma dos tablas de dos filas y tres columnas // cada fila es una secuencia de tres elementos // cada fila es un arreglo de una dimensión // la declaración indica que hay dos arreglos de dos dimensiones // los arreglos de dos dimensiones tienen a su vez dos arreglos de una dimensión Nombre del grupo w→ indica la localización del grupo en la memoria Nombre de las tablas w[0] → primera tabla → indica la localización de la tabla dentro del grupo w[1] → segunda tabla→ indica la localización de la tabla dentro del grupo Nombre de las filas w[0][0] → primera tabla, primera fila w[0][1] → primera tabla, segunda fila w[1][0] → segunda tabla, primera fila w[1][1] → segunda tabla, segunda fila Nombre de los elementos w[0][0][0] → primer elemento w[0][0][1] → segundo elemento w[0][0][2] → tercer elemento w[0][1][0] → cuarto elemento w[0][1][1] → quinto elemento w[0][1][2] → sexto elemento w[1][0][0] → séptimo elemento w[1][0][1] → octavo elemento w[1][0][2] → noveno elemento w[1][1][0] → décimo elemento w[1][1][1] → undécimo elemento w[1][1][2] → duodécimo elemento Ejemplo #4 int a[5]; // Definición de un arreglo de 5 posiciones void main() { int i; // Pedimos el ingreso de 5 números for(i=0; i<4; i++) //No olvidar que los arreglos van de 0 a longitud-1 { cout << Ingrese el elemento Nro: << i <> a[i]; } // Los imprimimos imprimir(a,5); } void imprimir(int b[], int tamano) { int i; for(i=0; i