Matrices en C++. Uso, declaración, y sintaxis de las matrices en C++
Las matrices o como algunos las llaman "arreglos multidimensionales" son una estructura de datos bastante similar a los vectores o arreglos; de hecho una matríz no es más que una serie de vectores contenidos en en otro (u otros), es decir, una matriz es un vector cuyas posisiones son otros vectores. Hablemos con más detalle de esto para quedar más claros.
Nota: Te recomiendo ver y comprender la sección de
arrays o vectores, antes de iniciar con este artículo para poder dominar el tema de éste con más facilidad.
Primero dejemos claro qué es una matriz. En términos generales, una mátriz es una estructura conformada por filas y conlumnas, idealmente más de dos filas y columnas, de hecho podemos decir que si una "matriz" tiene una única fila o una única columna, entonces estamos hablando de un vector.
La intersección de una fila y una columna de la matriz son las casillas y cada una de ellas podrá poseer información, simple o compleja (ya dependerá de nuestras necesidades).
Ahora, tal como dije antes un vector posee una única fila (o columna, como lo quieras ver) y de este modo un grupo de vectores unidos conforman una matríz, es por esto que al comienzo dije que una matríz es un vector conformado por otra serie de vectores.
Viendolo desde el punto de vista de la programación, una matriz entonces, es un vector cuyas posiciones (de la cero a la n) son, cada una de ellas, otro vector
Como siempre, la mejor forma de comprender algo es viendo un ejemplo en acción, así que veamos un buen ejemplo de matrices en C++
Matrices en C++ un buen ejemplo
Muy bien voy a retomar el ejemplo de la
sección anterior donde teníamos la necesidad de almacenar los titulos y los autores de una serie de libros dada.
Tal como mencioné en dicha
sección, una solución alternativa al problema, además de correcta y adecuada; es crear una matríz que almacenará en la primera columna los títulos, y en la segunda columna los autores; cada fila será entonces la información completa de un libro.
Para solucionar este problema, aprendamos primero algunas normas básicas para poder crear y usar matrices en C++.
¿Cómo se crea una Matriz en C++?
Declarar una matriz en C++ es muy similar a la de un vector, se deben seguir las mismas normas para declarar una variable pero una vez más con un pequeño cambio en la sintaxis. Primero necesitaremos saber el tipo de los datos que irán al interior de este (números, decimales o cadenas de texto, etc.) necesitamos también, como siempre, un nombre para la matriz y un tamaño máximo tanto para las filas como para las columnas. La sintaxis para declarar una matriz en C++ es la siguiente:
tipoDato nombreMatriz[filas][columnas];
Nota: Recuerda que en C++, no es posible crear de una manera sencilla un vector (y por ende una matriz)capaz de almacenar una cantidad de información indefinida, es necesario ingresar con antelación la cantidad de datos (filas y columnas) que la matriz tendrá.
Tenemos entonces, como podrás ver, que la sintáxis es casi la misma excepto que hemos añadido un par de corchetes "[]" más esta vez y al interior de los éstos debemos poner el número de filas y columnas máximas de la matriz, respectivamenteque. Veamos un ejemplo en el cual pondré la declaración de varias matrices de diferentes tipos y tamaños en C++.
Declaración de una matriz en C++
int myMatriz1[10][5];
float myMatriz2[5][10];
string myMatriz3[15][15];
bool myMatriz4[1000][3];
Veamos rápidamente que representa cada línea del código anterior.
Línea 1
Esta línea contiene la declaración de una matriz llamada myMatriz1 que tendrá 10 filas y 5 columnas y cada una de las 50 casillas tendrá datos de tipo entero.
Línea 2
Esta línea contiene la declaración de una matriz llamada myMatriz2 que tendrá 5 filas y 10 columnas y cada una de las 50 casillas tendrá datos de tipo flotante.
Línea 3
Esta línea contiene la declaración de una matriz llamada myMatriz3 que tendrá 15 filas y 15 columnas (una matríz cuadrada) y cada una de las 225 casillas tendrá datos de tipo string.
Línea 4
Esta línea contiene la declaración de una matriz llamada myMatriz4 que tendrá 1000 filas (sí, leíste bien) y 3 columnas y cada una de las 3000 casillas (también leíste bien, tres mil casillas) tendrá datos de tipo boleano.
Ya que está claro cómo se declara una matriz, vamos a inicializarla, es decir darle un valor a cada casilla, según su tipo de dato.
¿Cómo inicializar una matriz en C++?
En cuanto tenemos declarado una matriz, es posible asignarle valores a cada una de sus casillas, evidentemente estos valores deben coincidir con el tipo de dato que le asignamos a dicha matriz
Voy a mostrar a continuación formas distintas de inicializar una matriz, todas son validas, ya es cuestión de nuestras necesidades y conocimientos determinar cuál es útil y en qué momento. Veamos entonces:
Forma 1 de declarar una matriz
int myMatriz1[2][2] = {{1,2},{3,4}};
Aquí hemos declarado una matriz de tipo int de dos filas y dos columnas y la hemos inicializado con diferentes valores. El valor inicial corresponde a la casilla 0,0 (fila cero, columna cero) y tiene el valor de 1, en la fila cero columna uno tenemos el valor de 2, en la fila uno columna cero el valor de 3 y finalmente en la fila uno columna uno el valor de 4. Es importante notar que el primer tanto la fila como la columna comienzan desde cero y no desde uno, por esto la primer casilla corresponde a la fila y columna cero.
Bien! Ya sabemos cómo declarar una matriz en C++, sin embargo aun no sabemos cómo acceder a lso datos que estas contienen. Veámoslo:
Obtener el valor de una casilla específica
Para acceder al valor de una casilla nuevamente haremos uso de los corchetes, pero esta vez no para declar tamaños (porque eso ya lo hicimos) sino para indicar posiciones (fila y columna).
int myMatriz1[2][2] = {{1,2},{1,1}};
int fila1Casilla1 = myMatriz[1][1];
int primerNumero = myMatriz[0][0];
Como podemos ver, para acceder a un valor específico conociendo el índice de la casilla, solo basta con escribir dicho índice entre los corchetes "[][]", recuerda que el índice comienza desde cero, así por lo tanto en una matriz de vector de 2 por 2 (como el ejemplo), el último elemento está en el índice 1 y el primer elemento en el índice 0.
Recorrer una matriz en C++
Para obtener todos los datos que se encuentran al interior de una matriz, debemos acceder a cada posición y esto se hace fácilmente con dos ciclos for (anidados). La lógica de este procedimiento es la siguiente, el primer ciclo for comenzará desde cero e ira hasta el número de filas, de modo que la variable de control que generalmente llamamos "i", será la que va a ir variando entre cero y el tamaño del array, de esta forma al poner la i al interior de los corchetes, estaremos accediendo al valor de cada fila y el segundo ciclo irá de cero al número de columnas y normalmente se usa la variable llamada j para acceder a cada columna, veamos:
Nota:En el código acontinuación uso una forma sencilla y rápida de obtener la cantidad o número de filas de una matriz y también cómo obtener el número o cantidad de columnas de una matriz. Ten en cuenta que esto es importante, pues a veces no tenemos la certeza del tamaño de la matriz.
#include
using namespace std;
int main()
{
int edades[3][2] = {{1,2},{9,8},{14,21}};
int filas = (sizeof(edades)/sizeof(edades[0]));
int columnas = (sizeof(edades[0])/sizeof(edades[0][0]));
for (int i = 0; i < filas; i++)
{
for (int j = 0; j < columnas; j++)
{
cout<<edades[i][j]<<endl;
}
}
}
Vamos a ver de forma resumida en qué consiste y que hace cada una de estas líneas
Línea 1:
Tenemos en la primera línea la declaración de una matriz que contiene las edades de tres parejas de personas y asignamos cada uno de los valores.
Líneas 2 y 3:
En estas líneas, tenemos la declaración del número de filas y columnas de la matriz, que serán el límite del primer y segundo ciclo, respectivamente. Para mas detalles de esto, verifica la información sobre el
operador sizeof.
Líneas 4 a 7:
Aquí, tenemos entonces un
ciclo for que comienza en cero y termina en el número de filas y luego tenemos otro ciclo for (anidado) que irá de cero hasta el número de columnas (es importante notar que la condición usada en ambos ciclos es estrictamente menor "<" y no menor o igual "<="), al interior del segundo ciclo, es donde accedemos a cada uns de las casillas de la matriz usando loc corchetes.
Línea 8:
La octava línea es quizá la más vital aunque sin las demás no tendríamos nada. En esta línea, estamos accediendo a cada una de las casillas de la matriz, fila por fila y columna por columnaaccedemos a cada elemento poniendo entre los corchetes la variable i y j, que son las que están cambiando a medida que los ciclos van "girando", así estaremos accediendo a todos los elementos e imprimiéndolos por pantalla por medio de cout.
Muy bien, llegó el momento de afianzar nuestros conocimientos viendo un ejemplo. Ahora que tenemos claro como declarar un vector en C++, como recorrerlo y como acceder a sus datos, vamos a ver un ejemplo basado en el problema que planteé al inicio de esta sección (el de los libros).
Ejemplo de Matrices en C++
El problema es simple, queremos crear un programa con el cual podamos guardar los títulos y los autores de diferentes libros sin perder ninguno de ellos. El usuario es el encargado de suministrar la información de cada libro. Vamos a suponer que el usuario solo podrá ingresar un máximo de 5 libros, para así tener un tamaño de vector fijo. Veamos entonces cómo se haría esto usando matrices:
#include "iostream"
#include "stdio.h"
#include "string"
using namespace std;
int main()
{
string libros[5][2];
cout << "Por favor ingrese la siguiente información de los Libros: \n";
string titulo ,autor;
for(int i = 0; i < 5; i++)
{
cout << "\n******* Libro " << i + 1 << "********:\n";
cout << "Titulo: ";
getline(cin,titulo);
cout << "Autor: ";
getline(cin,autor);
libros[i][0] = titulo;
libros[i][1] = autor;
}
system("pause");
return 0;
}
Notar que en el código anterior, debido a que tenemos la completa certeza de sólo usar dos columnas, no es necesario usar otro ciclo for (de hecho, eso complicaría todo) basta con poner de manera explícita que el valor del título va en la columna cero y el del autor en la columna uno.