Vectores y Matrices
Vectores y Matrices
Vectores y Matrices
estructuras de datos que nos ofrece C++, siendo además una de las principales
y más útiles estructuras que podremos tener como herramienta de
programación. Los arrays, arreglos o vectores (como los quieras llamar), son
utilizados para almacenar múltiples valores en una única variable. En un
aspecto más profundo, los arrays, permiten almacenar muchos valores en
posiciones de memoria continuas, lo cual permite acceder a un valor u otro de
manera rápida y sencilla. Estos valores pueden ser números, letras o cualquier
tipo de variable que deseemos incluso tipos de datos propios.
Muy bien, ahora que sabemos la gran utilidad de los arrays, vectores o arreglos
para nosotros, aprendamos más acerca de estos, veamos como declarar un
vector, array o arreglo, como recorrer un vector y algunos ejemplos de esto.
tipo_de_dato nombre_del_vector[tamanio];
Tenemos entonces, tal como mencioné antes, que para declarar un vector en
C++, debemos definirle un tipo de los datos, sea entero, float, string, etc.,
debemos darle un nombre y al interior de los corchetes "[]" debemos poner el
tamaño máximo que tendrá el vector, es decir la cantidad máxima de datos que
podrá contener (recuerda que en C++ esto es necesario hacerlo). Veamos un
ejemplo en el cual pondré la declaración de varios vectores de diferentes tipos
y tamaños en C++.
Declaración de un Array o Vector en C++
int my_vector1[10];
float my_vector2[25];
string my_vector3[500];
bool my_vector4[1000];
char my_vector5[2];
Línea 1
Esta línea contiene la declaración de un vector llamado my_vector1, el cual
contendrá un máximo de 10 elementos de tipo entero.
Línea 2
Esta línea contiene la declaración de un vector llamado my_vector2, el cual
contendrá un máximo de 25 elementos de tipo float.
Línea 3
Esta línea contiene la declaración de un vector llamado my_vector3, el cual
contendrá un máximo de 500 elementos de tipo string.
Línea 4
Esta línea contiene la declaración de un vector llamado my_vector4, el cual
contendrá un máximo de 1000 elementos de tipo booleano.
Línea 5
Esta línea contiene la declaración de un vector llamado my_vector5, el cual
contendrá un máximo de 2 elementos de tipo char.
Ya que está claro cómo se declara un vector, vamos a ver cómo inicializarlo, es
decir inicializar un vector en C++ o en otras palabras darle valores a un vector.
int vector2[3];
vector2[3] = {1,5,10};
int vector2[3];
vector2[0] = 1;
vector2[1] = 3;
vector2[2] = 10;
float vector4[5] = {10.5, 5.1, 8.9, 10, 95.2}; //Array con 5 elementos
float numero5 = vector4[4]; //Para acceder al elemento 5, se usa el índice 4
float primerNumero = vector4[0]; //Para el primer elemento se usa el índice 0
#include "iostream"
int main()
{
int edades[] = {1,2,9,8,16,32,9,50,36,20,1,87};
int limite = (sizeof(edades)/sizeof(edades[0]));
for (int i = 0; i < limite; i++)
{
cout<<edades[i]<<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 un vector que contiene las
edades de 12 personas, notemos que entre los corchetes no se puso ningún
numero, pues no es necesario, ya que el vector tendrá el tamaño según la
cantidad de elementos que declaremos entre las llaves, evidentemente si
pusiéramos un 12 entre los corchetes, no habría ningún problema.
Línea 2:
En la segunda línea, tenemos la declaración del límite del ciclo o en otras
palabras el tamaño del array. El tamaño de un array se puede calcular de
varias formas, aquí lo obtenemos calculando el tamaño del array entero,
dividido por el tamaño del primer elemento de dicho array, para mas detalles de
esto, verifica la información sobre el operador sizeof.
Línea 3 a 6:
Desde la tercera línea hasta la sexta, tenemos entonces un ciclo for que
comienza en cero y termina en el límite (es importante notar que la condición
usada es estrictamente menor "<" y no menor o igual "<="), al interior de este
ciclo, es donde accedemos a cada uno de los elementos del vector por medio
de la sintaxis explicada anteriormente
Línea 5:
La quinta 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 uno de los elementos del array de
edades, un elemento por cada vuelta que da el ciclo, accedemos a cada
elemento poniendo entre los corchetes la variable i, que es la que esta
cambiando a medida que el ciclo va girando, así estaremos accediendo a todos
los elementos e imprimiéndolos por pantalla
#include "iostream"
int main()
{
char titulos[5];
char autores[5];
cout << "Por favor ingrese la siguiente información de los Libros: \n";
for(int i = 0; i < 5; i++)
{
cout << "\n******* Libro " << i + 1 <<"********:\n";
cout << "Titulo: ";
cin >> titulos[i];
cout << "Autor: ";
cin >> autores[i];
}
}
Estoy seguro de que a estas alturas comprendes bien qué hace cada una de
estas líneas. En caso de que no comprendas nada de esto, te recomiendo leer
nuevamente esta sección, la sección de ciclos o la sección de entrada y salida
de datos.
Hay que considerar que el tipo de dato que estamos usando para los vectores
de titulos y autores es char por lo tanto debes ingresar un único caracter
cuando pruebes el algoritmo, pues de lo contrario el comportamiento será un
poco extraño (aunque tiene su explicación). A continuación haremos este
mismo ejemplo pero usando cadenas de texto completas (strings) para poder
ingresar sin problemas más de una letra.
Nota: Recuerda que si no tienes clara alguna cosa, detectas algún error, tienes
alguna sugerencia o simplemente tienes algo que comentarme, puedes hacerlo
con total tranquilidad en la sección de comentarios.
Ejemplo 1 mejorado
Vamos a solucionar el mismo problema, pero esta vez lo haremos bien. Vamos
a utilizar cadenas de texto completas (string) de modo que al ingresar un titulo
o un autor podamos poner textos completos:
#include "iostream"
#include "string"
using namespace std;
int main()
{
string titulos[5];
string autores[5];
cout << "Por favor ingrese la siguiente información de los Libros: \n";
for(int i = 0; i < 5; i++)
{
cout << "\n******* Libro " << i + 1 << "********:\n";
cout << "Titulo: ";
cin >> titulos[i];
cout << "Autor: ";
cin >> autores[i];
}
}
Muy bien, tal como dije en el ejemplo anterior ahora ya podemos ingresar más
de un caracter para el título y los autores (tal y como debe ser) y nuestro
algoritmo funciona aún mejor. Puedes ver que los unicos cambios necesarios
fueron importar la librería string y poner los tipos de datos como string en vez
de char y eso solucionó por completo nuestro problema. Ten en cuenta que en
versiones antiguas de compiladores usar la funcion cin para leer strings genera
un error así que asegurate de usar una versión reciente o usa entonces la
función getline
Ejemplo perfeccionado
En la versión del ejemplo anterior tenemos un problema un poco delicado
(discubierto gracias a sus comentarios), y es que cuando ingresamos el título
del libro o el autor de este con espacios, es decir, más de una palabra
(habitualmente es así) el objeto cin interpresta esto como un fin de línea y no
nos solicita el siguiente valor. Para solucionar esto haremos uso de la
funciín getline (la que mencioné hace un momento) que nos permite solucionar
este tipo de problemas.Vamos a solucionar el mismo problema, pero esta vez
lo haremos bien. Vamos a utilizar cadenas de texto completas (string) de modo
que al ingresar un titulo o un autor podamos poner textos completos:
#include "iostream"
#include "string"
using namespace std;
int main()
{
string titulos[5];
string autores[5];
cout << "Por favor ingrese la siguiente información de los Libros: \n";
for(int i = 0; i < 5; i++)
{
cout << "\n******* Libro " << i + 1 << "********:\n";
cout << "Titulo: ";
//cin >> titulos[i]; //No funciona con espacios
getline(cin, titulos[i]);
cout << "Autor: ";
//cin >> autores[i]; //No funciona con espacios
getline(cin, autores[i]);
}
}
Pues bien, creo que es todo de momento con los arrays, arreglos o vectores en
C++ de momento, espero más adelante añadir unos videos tutoriales con más
explicaciones y ejemplos de este tema, además de añadir varios ejemplos más
aquí mismo. De momento, espero que toda esta información haya sido de tu
utilidad.
Las matrices o como algunos las llaman "arreglos multidimensionales" son una
estructura de datos bastante similar a los vectores o arreglos. De hecho, una
matriz no es más que una serie de vectores contenidos uno en el otro (u otros),
es decir, una matriz es un vector cuyas posiciones son otros vectores.
Hablemos con más detalle de esto para quedar más claros.
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
matriz, es por esto que al comienzo dije que una matriz es un vector
conformado por otra serie de vectores.
tipoDato nombreMatriz[filas][columnas];
int myMatriz1[10][5];
float myMatriz2[5][10];
string myMatriz3[15][15];
bool myMatriz4[1000][3];
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 matriz 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 booleano.
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.
¡Bien! Ya sabemos cómo declarar una matriz en C++, sin embargo, aún no
sabemos cómo acceder a los datos que estas contienen. Veámoslo:
#include
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
más 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 una de las casillas de la matriz
usando los 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 columna. Accedemos 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.
#include "iostream"
#include "stdio.h"
#include "string"
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;
}