Arreglos bidimensionales en C++
Un arreglo de una dimensión es usado para representar elementos en una lista o secuencia de valores. En algunos casos la relación entre elementos del arreglo no pueden representarse en forma de lista. Un arreglo de 2 dimensiones es usado para representar elementos en una tabla con columnas y filas, se puede acceder a cualquier elemento dentro del arreglo indicando el indice de la columna y la fila del arreglo.
La siguiente figura muestra un arreglo con 4 filas y 4 columnas. Las filas se acceden integrando un rango desde 0 hasta el 3 y las columnas con un rango del 0 al 3. Un arreglo bi-dimensional se declara de la misma manera que un arreglo unidimensional, exceptuando que su tamaño debe ser declarado.
1 2 3 4 5 |
const int NUMFIL=4; //numero de filas const int NUMCOL=4; //numero de columnas float caja[NUMFIL][NUMCOL] //arreglo creado con las constantes anteriores. [NUMFIL]=primera dimension. [NUMCOL] =segunda dimension. |
Este ejemplo declara caja como un arreglo de 2 dimensiones cuyos elementos son variables del tipo float. Para acceder a un elemento individual del arreglo debe de especificar 2 expresiones (una por cada dimensión) ejemplo: caja[0][2] donde [0] es fila y [2] columna.
Ejemplos de declaración de arreglos bidimensionales en C++
Necesitamos un arreglo que muestre el clima de cada día de año indicando la semana y el día (un arreglo de 52*7=364)
1 |
int clima[52][7]; |
Nuestro arreglo clima consta de 52 filas y 7 columnas partiendo del 0 al 51 y el 0 al 6, cada espacio de este contiene un valor int. Nuestra intención es que el arreglo guarde los datos de cada día del año. Si usamos la expresión clima[2][6], nos dará el clima del día 7 de la tercer semana..
Procesando arreglos bidimensionales en C++ para dos dimensiones
Procesar los datos de un arreglo de 2 dimensiones generalmente significa acceder al arreglo en uno o 4 patrones: aleatorio, a través de columna, a través de filas o a través del arreglo entero. Por ejemplo un usuario ingresa las coordenadas de un mapa a través de un indice en el arreglo nombre_calle para llegar a la dirección que desea, este proceso es conocido como aleatorio.
Hay veces que necesitamos utilizar una operación en cada elemento de una fila o columna en el arreglo. Suponiendo en el caso anterior del clima que queremos sacar un promedio de la temperatura de una semana debemos sumar lo valores en la fila semana y dividirlo entre 7, este caso accede al arreglo a través de las filas, si por el contrario lo que queremos es el promedio de un día de la semana en especifico (ejemplo promedio de todos lunes del año) debemos sumar los elementos de la columna días y dividirlo entre 52, este caso accede al arreglo a través de las columnas, un ejemplo mas, si queremos sacar el promedio del clima del año entero debemos acceder a cada elemento del arreglo (en este caso el orden para acceder a las filas o columnas no tiene relevancia) y dividirlo entre 364, esto accede a todo el arreglo.
Considerando los 4 ejemplos comunes para procesar los arreglos echemos un vistazo a los siguientes patrones para acceder a ellos.
- sumar las filas.
- sumar las columnas.
- inicializar el arreglo en 0 (o algún valor especifico)
- mostrar el arreglo.
Primero definimos algunas constantes y variables usando identificadores generales como fila y columna.
1 2 3 4 5 6 7 8 |
const int NUMCOL=10; const int NUMFIL=10; int arreglo[NUMFIL][NUMCOL]; //arreglo bidimensional int columna //indice de columna int fila //indice de fila int total //la variable para la suma |
Sumando filas de arreglos bidimensionales en C++
Suponiendo que queremos sumar la fila numero 3 (cuarta fila) en el arreglo y queremos mostrarlo. Lo haremos fácilmente con la función for
1 2 3 4 5 6 7 |
total=0; for(columna=0;columna<NUMCOL;col++){ total=total+arreglo[3][columna]; } cout<<"la suma es "<<total<<endl; |
El for suma cada columna mientras mantienes fija la fila con el indice 3, sumando cada valor que hay en ella.
Ahora supongamos que queremos sumar la fila 2 y 3, anidamos un for al que ya teníamos ejemplo:
1 2 3 4 5 6 7 8 |
total=0; for(fila=2;fila<4;fila++){ for(columna=0;columna<NUMCOL;columna++){ total=total+arreglo[fila][columna]; } } cout<<"el total es "<<total<<endl; |
el for de afuera controla las filas y el de adentro las columnas.
En la primera iteración se accede a la posición del arreglo: arreglo[2][0], arreglo[2][1], arreglo[2[2] … arreglo[2][NUMCOL-1];
En la segunda accede a: arreglo[3][0], arreglo[3][1], arreglo[3][2] …. arreglo[3][NUMCOL-1];
Si queremos acceder a una porción del arreglo declararemos las siguientes variables (subarreglo)
1 2 |
int filaFilled //dato esta en 0.....filaFilled int colFilled //datos esta en 0 ....colFilled |
Entonces escribimos el fragmento de código siguiente
1 2 3 4 5 6 7 8 |
total=0; for(fila=2;fila<filaFilled;fila++){ for(columna=0;columna<columnaFilled;columna++){ total=total+arreglo[fila][columna]; } } cout<<"el total es "<<total<<endl; |
Sumar columnas de arreglos bidimensionales en C++
Supongamos que queremos sumar cada columna y mostrarlas.
Una vez mas generalizamos el código sumando solo la porción del arreglo que contiene datos validos.
1 2 3 4 5 6 7 8 |
total=0; for(columna=0;columna<columnaFilled;columna++){ for(fila=2;fila<filaFilled;fila++){ total=total+arreglo[fila][columna]; } } cout<<"el total es "<<total<<endl; |
En este caso el primer for controla las columnas y el interior las filas.
Inicializando arreglos bidimensionales en C++
Como con los arreglos unidimensionales podemos inicializar los arreglos bidimensionales en su declaración o usando declaración de asignaciones.
Si el arreglo es corto es simple iniciarlo en su declaración, para iniciar un arreglo de 2 flas y 3 columnas como este
14 4 -5
0 46 7
podemos usar la siguiente declaración
1 2 3 4 5 |
int arreglo[2][3]= { {14, 3, -5}, {0, 46, 7} }; |
En esta declaración la lista consiste en dos elementos, siendo cada uno una lista de inicialización: la primera guarda los valores 14, 3, -5 en la fila 0 del arreglo; la segunda guarda los valores 0, 46 y 7 en la fila 1.
Inicializar un arreglo en su declaración es impractico si el arreglo es largo por ejemplo uno de 100*100, no necesariamente tienes que listar 10,000 elementos. Si los valores son todos distintos deberías guardarlos en un archivo y entrarlos en el arreglo al mismo tiempo que corre el programa. Si los valores son iguales lo usual es anidar iteraciones en su declaración de asignaciones, el siguiente ejemplo inicializa todos los arreglos en 0.
1 2 3 |
for(fila=0;fila<NUMFIL;fila++) for(columna=0;columna<NUMCOL;columna++) arreglo[fila][columna]=0; |
en este caso no importa si accedemos por las filas primero o las columnas, mientras accedamos a todos los elementos del arreglo.
Mostrar arreglos bidimensionales en C++
Si queremos mostrar el arreglo con una fila por fila entonces tendremos otro caso de procesamiento por fila:
1 2 3 4 5 6 7 8 9 10 |
#include <iomanip> //para el setw(); . . . for(fila=0;fila<NUMFIL;fila++) { for(columna=0;columna<NUMCOL;columna++) cout<<setw(15)<<arreglo[fila][columna]; cout<<endl; } |
Este fragmento de código imprime valores del arreglo en columnas de 15 caracteres.
No hay regla que diga que tenemos que imprimir cada fila en una linea, podemos voltear el arreglo e imprimir cada columna en una linea, simplemente cambiando los dos for.
Cuando imprimes un arreglo bidimensional, debes considerar cual orden de presentación tiene mas sentido y como el arreglo encaja en la pagina. Por ejemplo un arreglo de 6 columnas y 100 filas, seria mejor presentado como 6 columnas y 100 lineas de largo.
Como hacer una matriz donde las primeras columnas sean llenadas con randomn y las otras sean la multiplicacion de las otras dos matrices
Gracias!
no b¿hay nada