INTRODUCCIÓN
Un
arreglo multidimensional es simplemente
una extensión de un arreglo unidimensional. Más que almacenar una sola lista de elementos, piense en un arreglo multidimensional como el almacenamiento de múltiples
listas de elementos. Por ejemplo, un arreglo bidimensional
almacena listas en un formato de tabla de dos dimensiones de filas y columnas, en donde cada fila es una lista. Las filas proporcionan la dimensión
vertical del arreglo, y las columnas
dan la dimensión horizontal. Un arreglo de tres dimensiones almacena listas en un formato
de tres dimensiones de filas, columnas y planos, en donde cada plano es un arreglo bidimensional.
Las filas proporcionan la dimensión vertical;
las columnas, la dimensión horizontal; y los planos, la dimensión de profundidad del
arreglo.
El
diseño y elaboración de un proyecto de investigación que requiere como apoyo la
elaboración de un programa en computadora, depende inicialmente de la búsqueda
de código fuente ya creado en el mismo lenguaje o en su defecto en cualquier
otro lenguaje; incluso un algoritmo, pseudocódigo o diagrama de flujo, para
posteriormente integrarlos y obtener la aplicación final. Debido a esto es
recomendable disponer del código necesario, debidamente documentado para
facilitar el trabajo de programación y favorecer la posibilidad de tener un
mayor alcance en el programa a desarrollar, ya que el tiempo a invertir en el
desarrollo de ese conjunto de procedimientos, muchas veces de nivel básico, se
puede emplear precisamente en el abordaje del programa de manera avanzada.
Las
bibliotecas de programas son parte fundamental en la creación de las
aplicaciones, y para los desarrolladores de programas en el área de
investigación, académica, industrial y empresarial, son herramientas de
programación base para el mejoramiento de programas y evitan: la duplicación de
código, además de la pérdida de tiempo en la búsqueda y modificación o
adaptación de código. En internet se puede conseguir sitios que contengan
bibliotecas o segmentos de código que se pueden utilizar para realizar alguna
actividad, sin embargo son susceptibles a las desventajas propias de toda
información presente en internet como lo son: presencia de virus,
disponibilidad de conexión con el servidor, si es de algún lugar remoto y no se
tiene información directa para contactar al propietario, se dificulta la
obtención del recurso requerido.
Se
debe recurrir a libros o buscar en internet para a desarrollar; bien sea del
mismo lenguaje, alguno parecido o en caso extremo el algoritmo o diagrama de
flujo. Esto hace que se tenga que emplear un tiempo considerable, en el caso de
encontrar alguna biblioteca alternativa, para revisar cuales métodos tiene, el
tipo de variables y tipo de dato que utiliza, entre otras verificaciones. Lo
expuesto anteriormente conlleva a la necesidad de integrar y consolidar en una
biblioteca los métodos relacionados con el cálculo matricial y las operaciones
del área de computación para implementar en trabajos de y en la resolución de
problemas en el área de ingeniería. Investigación.
ARREGLOS Y MATRICES
Un
array (matriz o vector) es un conjunto finito y ordenado de elementos
homogéneos. La propiedad “ordenado” significa que el elemento primero, segundo
y tercero,…, enésimo de un array puede ser identificado. Los elementos del
array son homogéneos, es decir, del mismo tipo de datos. Los array también se
conocen como matrices-en matemáticas- y tablas- en cálculos financieros.
En
otras palabras un arreglo es una especie de variable que contiene muchos
valores pero cada uno con una posición diferente. Un arreglo puede ser
unidimensional o vectorial, bidimensional o matricial, o multidimencional.
ARREGLOS DE MÁS DE DOS DIMENSIONES
Para
algunas aplicaciones se requieren arreglos de más de dos dimensiones. En esta
lección se consideran sólo arreglos de tres dimensiones, ya que sólo unas
cuantas aplicaciones especializadas requieren arreglos de mayor dimensión. La forma
más fácil de imaginar un arreglo de tres dimensiones es dibujar un cubo. Piense
en un arreglo de tres dimensiones como la combinación de algunos arreglos de
dos dimensiones para formar una tercera dimensión, profundidad. El cubo se hace
de filas (dimensión vertical), columnas (dimensión horizontal) y planos
(dimensión de profundidad) De esta manera, se localiza un elemento dado dentro
de un arreglo de cubo especificando su plano, fila y columna.
Ahora,
veamos un ejemplo práctico de un arreglo de tres dimensiones para que sea
posible observar cómo se define y se acceda en C++. Piense en estas lecciones
como un arreglo en tres dimensiones, donde cada página de las lecciones es un
arreglo bidimensional compuesto de filas y columnas. Entonces las páginas
combinadas forman los planos dentro de un arreglo de tres dimensiones que conforman las lecciones.
Después suponga que existen 45 líneas en cada página que forman las filas para
el arreglo y 80 caracteres por fila que forman las columnas del arreglo.
Si
existen 750 páginas en las lecciones, existen 750 planos en el arreglo. De esta
manera, este arreglo de las lecciones es un arreglo de 45 × 80 × 750. ¿Cuáles son
los elementos del arreglo y cuántos hay? Bueno, los elementos del arreglo serán
caracteres, ya que éstos forman las palabras en una página. Además existirán 45
× 80 × 750 = 2, 700,000 caracteres, incluyendo espacios en blanco, porque éste
es el tamaño de las lecciones en términos de filas, columnas y páginas. ¿Cómo
se definirá el arreglo lecciones en C++? ¿Qué opina de esta forma?
const int PAGINAS = 750;
const int FILAS = 45;
const
int COLUMNAS = 80;
char
lecciones[PAGINAS][FILASI[COLUMNASI;
Es
posible comprender esta definición a partir de su trabajo con arreglos de una y
dos dimensiones. Existen tres dimensiones [PAGINAS], [FILAS] y [COLUMNAS] que
definen el tamaño del arreglo lecciones. Un arreglo de tres dimensiones en C y
C++ se ordena con el plano principal. Esto es porque primero se especifica el
tamaño del plano, seguido por el tamaño del renglón, seguido por el tamaño de
columna. La clase de datos del arreglo es char, ya que los elementos son
caracteres.
Después,
¿cómo supone que se acceda a la información del arreglo lecciones? La forma más
fácil es utilizar ciclos anidados. ¿Cómo deberán anidarse los ciclos? Ya que el
arreglo está ordenado por el plano principal, el ciclo página deberá ser el
ciclo externo, y el ciclo columna, el ciclo interno. Esto deja que el ciclo
fila se inserte entre los ciclos página y columna. Traduciendo esto al arreglo
lecciones, se obtiene:
for
(int pagina = 0; pagina < PAGINAS; ++pagina)
for (int fila = 0; fila < FILAS; ++fila)
for
(int columna = 0; columna < COLUMNAS; ++columna)
<proceso
lecciones[pagina][fila][columna]>
Con
este enfoque de anidamiento, se ejecuta 80 veces el ciclo columna por cada
iteración
del ciclo fila, que se ejecuta 45 veces por cada iteración del ciclo pagina.
Desde luego, el ciclo pagina se ejecuta 750 veces. Esta estructura for procesará
elementos una fila a la vez para una página dada. Observe la utilización de las
variables pagina, fila, y columna como los contadores de ciclo. Aquéllas
deberán ser diferentes de las constantes (PAGINAS, FILAS, COLUMNAS) que se
utilizan para definir el arreglo, ya que éstas son locales para los ciclos for.
PRECAUCIÓN
Cuando
se define un arreglo, C++ reserva suficiente memoria primaria para almacenarlo.
Ésta es exclusiva para el arreglo definido y no es posible utilizarlo para
otras tareas de programación o del sistema. En otras palabras, un arreglo grande
consume mucha memoria. Por ejemplo, el arreglo lección, contiene 2,700,000 caracteres
elemento. Cada uno de éstos requiere un byte de memoria para almacenarse, por
lo tanto C++ asignará casi 2,637 Kbytes de memoria de usuario para el arreglo
lecciones. Esto es mucho más de lo que está disponible en algunos sistemas PC y
podrá enviar un mensaje de error array size too big durante la compilación. Por
lo tanto, cerciórese de que sus arreglos no sean demasiado grandes para
almacenarlos en su sistema. Existen otras formas más eficientes del uso de la
memoria para almacenar grandes cantidades de datos -una lista vinculada
dinámica.
Características
de un arreglo tridimensional
1.
Tienen filas y columnas, por lo tanto cuenta con dos indices. Generalmente se maneja
el concepto de [Fila][Columna], aunque podria ser tambien [Columna][Fila].
2. La relacion entre valores se da por los indices.
3. Los arreglo unidimensionales se ordenan en fila, en cambio los multidimensionales se pueden acomodar en columnas dadas por lo indices.
4. En el anterior ejemplo usamos 5 arreglos que muestra una tabla o una matriz de 4×4, con los arreglos multidimensionales podriamos usar 1 solo arreglo del mismo tamaño (4×4).
5. El recorrido de filas y columnas se hace por medio de ciclos, esta a nuestra eleccion el primer recorrido que deseemos hacer, podriamos recorrer primero la columna que la fila, o recorrer desde determinado indice [i][j].
2. La relacion entre valores se da por los indices.
3. Los arreglo unidimensionales se ordenan en fila, en cambio los multidimensionales se pueden acomodar en columnas dadas por lo indices.
4. En el anterior ejemplo usamos 5 arreglos que muestra una tabla o una matriz de 4×4, con los arreglos multidimensionales podriamos usar 1 solo arreglo del mismo tamaño (4×4).
5. El recorrido de filas y columnas se hace por medio de ciclos, esta a nuestra eleccion el primer recorrido que deseemos hacer, podriamos recorrer primero la columna que la fila, o recorrer desde determinado indice [i][j].
FINALIDAD
Un array puede ser definido de tres
dimensiones, cuatro dimensiones, hasta de n-dimensiones.
Los conceptos de rango de subíndices y número
de elementos se pueden ampliar directamente desde arrays de una y dos
dimensiones a estos arrays de orden más alto. En general, un array de
n-dimensiones requiere que los valores de los n subíndices puedan ser
especificados a fin de identificar un elemento individual del array. Si cada
componente de un array tiene a subíndices, el array se dice que es sólo de
n-dimensiones.
Un arreglo de tres dimensiones almacena
listas en un formato de tres dimensiones de filas, columnas y planos, en donde
cada plano es un arreglo bidimensional. Las filas proporcionan la dimensión
vertical; las columnas, la dimensión horizontal; y los planos, la dimensión de
profundidad del arreglo.
ARRAYS
(ARREGLOS) MULTIDIMENSIONALES
Vamos a realizar un repaso sobre
conocimientos que debemos tener relativos a arrays multidimensionales. En Java
es posible crear arrays con más de una dimensión, pasando de la idea de lista,
vector o matriz de una sola fila a la idea de matriz de m x n elementos,
estructuras tridimensionales, tetradimensionales, etc. La sintaxis será:
Tipo_de_variable[
][ ]… [ ] Nombre_del_array = new
Tipo_de_variable[dimensión1][dimensión2]…[dimensiónN];
|
También podemos alternativamente
usar esta declaración:
Tipo_de_variable[
][ ] … [ ] Nombre_del_array;
Nombre_del_array
= new Tipo_de_variable[dimensión1][dimensión2]…[dimensiónN];
|
El tipo de variable puede ser
cualquiera de los admitidos por Java y que ya ha sido explicado. Ejemplos de
declaración e inicialización con valores por defecto de arrays, usando los
distintos tipos de variables Java, serían:
- byte[][] edad = new byte[4][3];
- short ][] edad = new
short[4][3];
- int[][] edad = new int[4][3];
- long[][] edad = new long[4][3];
- float[][] estatura = new
float[3][2];
- double[][] estatura = new
double[3][2];
- boolean[][] estado = new
boolean[5][4];
- char[][] sexo = new char[2][1];
-
String[][] nombre = new String[2][1];
La declaración de una matriz
tradicional de m x n elementos podría ser:
/* Ejemplo declaración - aprenderaprogramar.com */
int[][] matriz = new int[3][2];
O alternativamente
int[][] matriz;
matriz = new int[3][2];
|
El número de elementos sería:
3 x 2 = 6, dónde 3 es el número de filas y 2 es el número de columnas.
Ahora procedemos a cargar la matriz
con valores:
matriz[0][0] = 1; matriz[0][1] = 2;
matriz[1][0] = 3; matriz[1][1] = 4; matriz[2][0] = 5; matriz[2][1] = 6;
Hay que recordar que los elementos
empiezan a numerarse por 0. Así, la esquina superior izquierda de la matriz
será el elemento [0][0] y la esquina inferior derecha será el [2][1]. Hay que
prestar atención a esto porque en otros lenguajes de programación la numeración
puede empezar por 1 en vez de por 0.
También se pueden cargar
directamente los elementos, durante la declaración de la matriz de la siguiente
manera:
int[][] matriz =
{{1,2},{3,4},{5,6}};
donde {1,2} corresponde a la fila 1,
{3,4} a la fila 2 y {5,6} a la fila 3, y los números separados por coma dentro
de cada fila, corresponden a las columnas. En este caso, los números (1, 3, 5)
de cada una de las filas corresponden a la primera columna y los números (2, 4,
6) atañen a la segunda columna.
Para obtener el número de filas de
la matriz, podemos recurrir a la propiedad “length” de los arrays, de la
siguiente manera:
int filas = matriz.length;
Para el caso del número de columnas
sería de la siguiente forma :
int columnas = matriz[0].length;
También Java nos permite la
posibilidad de clonar una matriz, es decir, crear una matriz nueva a partir de
otra matriz, siguiendo esta sintaxis:
String[][] nuevaMatriz =
matriz.clone();
donde clone() es un método especial,
que permite la clonación de arrays de cualquier dimensión en Java. De esta
manera “nuevaMatriz” y “matriz” son 2 matrices distintas pero con los mismos
valores. Hablaremos del método clone más adelante.
EJERCICIO
RESUELTO
Vamos a plantear y resolver un
ejercicio: queremos almacenar en una matriz el número de alumnos con el que
cuenta una academia, ordenados en función del nivel y del idioma que se
estudia. Tendremos 3 filas que representarán al Nivel básico, medio y de
perfeccionamiento y 4 columnas en las que figurarán los idiomas (0 = Inglés, 1
= Francés, 2 = Alemán y 3 = Ruso). Se pide realizar la declaración de la matriz
y asignarle unos valores de ejemplo a cada elemento.
SOLUCIÓN
La declaración de la matriz
sería:
/* Ejemplo declaración - aprenderaprogramar.com */
int[][] alumnosfxniveleidioma= new int[3][4];
|
Podríamos asignar contenidos de la
siguiente manera:
alumnosfxniveleidioma[0][0] = 7; alumnosfxniveleidioma[0][1]
= 14;
alumnosfxniveleidioma[0][2]= 8;
alumnosfxniveleidioma[0][3] = 3;
alumnosfxniveleidioma[1][0] = 6;
alumnosfxniveleidioma[1][1]= 19;
alumnosfxniveleidioma[1][2] = 7;
alumnosfxniveleidioma[1][3] = 2
alumnosfxniveleidioma[2][0] = 3;
alumnosfxniveleidioma[2][1]= 13;
alumnosfxniveleidioma[2][2] = 4;
alumnosfxniveleidioma[2][3] = 1
También, podríamos asignar contenido
de esta otra forma, como ya se ha explicado anteriormente:
int[][] alumnosfxniveleidioma
= {{7,14,8,3},{6,19,7,2},{3,13,4,1}};
La representación gráfica que
podríamos asociar a esta asignación de datos sería esta matriz:
La organización de la información en
matrices, nos generará importantes ventajas a la hora del tratamiento de datos
en nuestros programas.
Para terminar en cuanto a
multidimensionalidad, veamos casos de declaraciones con más de dos dimensiones.
Para ello supongamos que estamos realizando un “conteo de coches”, es decir,
que estamos contando los coches que pasan por un determinado lugar en un
periodo de tiempo que puede ser un día, varios días, varios meses, etc. La
forma de declarar esos arrays podría ser la siguiente:
Duración del conteo
|
Tipo de array
|
Declaración con Java
(nc es Número de coches)
|
Un
día
|
Array
de una dimensión
(hora)
|
int[]
nc = new int[24];
|
Varios
días
|
Array
de dos dimensiones
(hora
y día)
|
int[][]
nc = new int[24][31];
|
Varios
meses
|
Array
de tres dimensiones
(hora,
día y mes)
|
int[][][]
nc = new int[24][31][12];
|
Varios
años
|
Array
de cuatro dimensiones
(hora,
día, mes y año)
|
Int[][][][]
nc = new int[24][31][12][2999];
|
Varios
siglos
|
Array
de cinco dimensiones
(hora,
día, mes, año y siglo)
|
Int[][][][][]
nc = new int[24][31][12][2999][21];
|
Veamos lo que sería un ejemplo de programa con array
multidimensional, usando un tipo String.
/*
Ejercicio Array multidimensional – aprenderaprogramar.com */
public class MatrizAlumnos {
public static void main(String arg[]) {
String[ ][
] nombreAlumno = new String[5][25];
nombreAlumno[2][23]
= “Pedro Hernández González”;
System.out.println(“El
alumno número 24 del curso tercero se llama “+nombreAlumno[2][23]);
}
}
|
El resultado del programa es la
aparición del mensaje “El alumno número 24 del curso tercero se llama Pedro
Hernández González.
En este ejemplo, [5] representa a
los cursos. Hablamos de 5 cursos que son identificados con 0, 1, 2, 3, 4,
por lo que [2] hace mención al tercer curso;lo mismo podemos decir de [23], que
corresponde al alumno número 24. Hay que recordar que siempre en Java tenemos
que contar el cero, ya que si no lo hacemos podemos cometer errores.
Ejemplo
19.14
Dada
la definición del arreglo lecciones anterior:
a.
Escriba un segmento de programa que pueda utilizarse para llenar el arreglo
lecciones.
b.
Escriba un segmento de programa que pueda utilizarse para imprimir el arreglo
lecciones.
c.
Escriba un segmento de programa que pueda utilizarse para imprimir la página
dos del arreglo
lecciones.
.
Solución
a.
Utilizando los tres ciclos anidados anteriores, se podrá llenar el arreglo
lecciones de esta manera:
for
(int pagina = 0; pagina < PAGINAS; ++pagina)
for (int fila = 0; fila < FILAS; ++fila)
for
(int columna = 0; columna < COLUMNAS; ++columna)
cin.get(lecciones[pagina][fila][columna]);
El
ciclo interno emplea una función get() para leer un carácter a la vez y lo
coloca en la
posición
indexada. El operador de extracción cin (>>) no funciona aquí, ya que
>>
ignora
los espacios en blanco, que obviamente forman parte del material de las
lecciones.
b.
Se emplea un objeto imprimir en el ciclo interno para imprimir las lecciones:
for
(int pagina = 0; pagina < PAGINAS; ++pagina)
for (int fila = 0; fila < FILAS; ++fila)
{
imprimir
<< endl;
for
(int columna = 0; columna < COLUMNAS; ++columna)
imprimir
<< lecciones[pagina][fila][columna];
} /
/Fin del for MEDIO
Observe
el único enunciado imprimir utilizado en el ciclo intermedio para proporcionar
un CRLF
después de que se ha impreso una fila determinada. Desde luego, se deberá
definir
el objeto imprimir como ya antes se explicó.
c.
Solamente se necesitan dos ciclos para imprimir cierto número de páginas, como
se muestra a
continuación:
for
(int fila = 0; fila < FILAS; ++fila)
{
imprimir
<< endl;
for
(int columna = 0; columna < COLUMNAS; ++columna)
imprimir
<< lecciones[1][fila][columna];
} //
Fin del for externo
Observe
que el índice página se ajusta a [1] dentro del enunciado imprimir para imprimir
la página 2 de las lecciones. (Recuerde que la primera página de las lecciones
realmente está en el índice [0] de la página)
Anexos
INDICE
Introducción……………………………………………………..1
Concepto
Arreglos y matrices……………………………………………..3
Características…………………………………………………..5
Finalidad………………………………………………………….6
Ejemplos…………………………………………………………10
Anexos