ARREGLOS TRIDIMENSIONALES (MONOGRAFIA)



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].

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  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

 
dianaluisespinoza@gmail.com


 

 

 

 

 

 

 

 

 

 

 

 

 

INDICE

 

Introducción……………………………………………………..1

 

Concepto

Arreglos y matrices……………………………………………..3

Características…………………………………………………..5

Finalidad………………………………………………………….6

Ejemplos…………………………………………………………10


 
 

Anexos