Está en la página 1de 7

5.

Vectores Y Matrices
5.1. Definici�n de una tabla y acceso a los datos
Una tabla, vector, matriz o array (que algunos autores traducen por �arreglo�) es
un conjunto de elementos, todos los cuales son del mismo tipo. Estos elementos
tendr�n todos el mismo nombre, y ocupar�n un espacio contiguo en la memoria.

Por ejemplo, si queremos definir un grupo de 4 n�meros enteros, usar�amos

int ejemplo[4];
Podemos acceder a cada uno de los valores individuales indicando su nombre
(ejemplo) y el n�mero de elemento que nos interesa, pero con una precauci�n: se
empieza a numerar desde 0, as� que en el caso anterior tendr�amos 4 elementos, que
ser�an ejemplo[0], ejemplo[1], ejemplo[2], ejemplo[3].

Como ejemplo, vamos a definir un grupo de 5 n�meros enteros y hallar su suma:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.01:
// Primer ejemplo de tablas

#include <iostream>
using namespace std;

int main()
{
int numero[5]; // Un array de 5 numeros enteros
int suma; // Un entero que guardar� la suma

numero[0] = 200; // Les damos valores


numero[1] = 150;
numero[2] = 100;
numero[3] = -50;
numero[4] = 300;
suma = numero[0] + // Y hallamos la suma
numero[1] + numero[2] + numero[3] + numero[4];
cout << "Su suma es " << suma;
/* Nota: esta es la forma m�s ineficiente e inc�moda...
Ya lo iremos mejorando */

return 0;
}
Ejercicios propuestos:

(5.1.1) Un programa que pida al usuario 4 n�meros, los memorice (utilizando una
tabla), calcule su media aritm�tica y despu�s muestre en pantalla la media y los
datos tecleados.
(5.1.2) Un programa que pida al usuario 5 n�meros reales y luego los muestre en el
orden contrario al que se introdujeron.
5.2. Valor inicial de una tabla
Al igual que ocurr�a con las variables �normales�, podemos dar valor a los
elementos de una tabla al principio del programa. Ser� m�s c�modo que dar los
valores uno por uno, como hemos hecho antes. Esta vez los indicaremos todos entre
llaves, separados por comas:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.02:
// Segundo ejemplo de tablas

#include <iostream>
using namespace std;

int main()
{
int numero[5] = // Un array de 5 n�meros enteros
{200, 150, 100, -50, 300};
int suma; // Un entero que guardar� la suma

suma = numero[0] + // Y hallamos la suma


numero[1] + numero[2] + numero[3] + numero[4];
cout << "Su suma es " << suma;
/* Nota: esta forma es algo menos engorrosa, pero todav�a no */
/* est� bien hecho. Lo seguiremos mejorando */

return 0;
}
Ejercicios propuestos:

(5.2.1) Un programa que almacene en una tabla el n�mero de d�as que tiene cada mes
(su�pon�dremos que es un a�o no bisiesto), pida al usuario que le indique un mes
(1=enero, 12=diciembre) y muestre en pantalla el n�mero de d�as que tiene ese mes.
(5.2.2) Un programa que almacene en una tabla el n�mero de d�as que tiene cada mes
(a�o no bisiesto), pida al usuario que le indique un mes (ej. 2 para febrero) y un
d�a (ej. el d�a 15) y diga qu� n�mero de d�a es dentro del a�o (por ejemplo, el 15
de febrero ser�a el d�a n�mero 46, el 31 de diciembre ser�a el d�a 365).
5.3. Recorriendo los elementos de una tabla
Es de esperar que exista una forma m�s c�moda de acceder a varios elementos de un
array, sin tener siempre que repetirlos todos, como hemos hecho en

suma = numero[0] + numero[1] + numero[2] + numero[3] + numero[4];


El �truco� consistir� en emplear cualquiera de las estructuras repetitivas que ya
hemos visto (while, do..while, for). Lo m�s habitual, ya que sabemos cu�ntos
elementos tiene un array, es usar un "for" para contar, as�:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.03:
// Tercer ejemplo de tablas (for)

#include <iostream>
using namespace std;

int main()
{
int numero[5] = // Un array de 5 n�meros enteros
{200, 150, 100, -50, 300};
int suma; // Un entero que guardar� la suma
int i; // Para recorrer el array

suma = 0; // Valor inicial


for (i=0; i<=4; i++) // Y hallamos la suma
suma += numero[i];

cout << "Su suma es " << suma;


return 0;
}
En este caso, que s�lo sum�bamos 5 n�meros, no hemos escrito mucho menos, pero si
trabaj�semos con 100, 500 o 1000 n�meros, la ganancia en comodidad s� que est�
clara.
Ejercicios propuestos:

(5.3.1) A partir del programa propuesto en 5.2.2, que almacenaba en una tabla el
n�mero de d�as que tiene cada mes, crear otro que pida al usuario que le indique la
fecha, detallando el d�a (1 al 31) y el mes (1=enero, 12=diciembre), como respuesta
muestre en pantalla el n�mero de d�as que quedan hasta final de a�o.
(5.3.2) Crear un programa que pida al usuario 10 n�meros enteros y luego los
muestre en orden inverso (del �ltimo al primero), usando "for".
(5.3.3) Crear un programa que pida al usuario 10 n�meros reales, calcule su media y
luego muestre los que est�n por encima de la media.
(5.3.4) Un programa que pida al usuario 10 n�meros enteros y calcule (y muestre)
cu�l es el mayor de ellos.
En f�sica se usan mucho los "vectores", para representar magnitudes que no se
pueden expresar s�lo con un n�mero. Por ejemplo, para una temperatura basta con
decir cosas como "tengo 39 grados", pero para una fuerza no basta con decir que es
de 200 N, sino que tambi�n es importante en qu� direcci�n (y sentido) se aplica esa
fuerza: no tendr� el mismo efecto si se aplica en el centro de un cuerpo o en un
extremo, ni si comprime que si estira. Un vector se suele representar a partir de
sus "componentes", que son las coordenadas de su extremo (suponiendo que comienza
en el punto (0,0). Un vector en el plano tendr� dos componentes (x,y) y un vector
en el espacio tendr� 3 componentes (x,y,z).como un conjunto de varias coordenadas.
As�, un programa que pida al usuario las coordenadas de 2 vectores en el espacio y
halle su vector suma ser�a:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.04:
// Vectores, primer contacto

#include <iostream>
using namespace std;

int main()
{
float vector1[3];
float vector2[3];
float vectorSuma[3];
int i;

// Pedimos los datos del primer vector


for (i=0; i<3; i++)
{
cout << "Introduce la componente " << i
<< " del primer vector: ";
cin >> vector1[i];
}

// Pedimos los datos del segundo vector


for (i=0; i<3; i++)
{
cout << "Introduce la componente " << i
<< " del segundo vector: ";
cin >> vector2[i];
}

// Calculamos la suma
for (i=0; i<3; i++)
vectorSuma[i] = vector1[i] + vector2[i];

// Y mostramos el resultado
cout << "El vector suma es ";
for (i=0; i<3; i++)
cout << vectorSuma[i] << " ";

return 0;
}
No veremos m�s detalles sobre vectores, porque este no es un curso de f�sica. Pero
s� propondemos algunos ejercicios para que pueda aplicar sus conocimientos quien ya
ha estudiado con anterioridad lo que es un vector...

Ejercicios propuestos sobre vectores:

(5.3.5) Un programa que pida al usuario los datos de dos vectores en el plano (2
coordenadas) y calcule su diferencia.
(5.3.6) Un programa que pida al usuario las componentes de dos vectores en el
espacio (3 coordenadas) y calcule su producto escalar.
(5.3.7) Un programa que pida al usuario las componentes de dos vectores en el
espacio y calcule su producto vectorial.
(5.3.8) Un programa que pida al usuario dos vectores en el plano (2 coordenadas) y
diga si son linealmente dependientes (sus componentes son proporcionales).
5.4. Tablas bidimensionales
Podemos declarar tablas de dos o m�s dimensiones. Por ejemplo, si queremos guardar
datos de dos grupos de alumnos, cada uno de los cuales tiene 20 alumnos, tenemos
dos opciones:

Podemos usar int datosAlumnos[40] y entonces debemos recordar que los 20 primeros
datos corresponden realmente a un grupo de alumnos y los 20 siguientes a otro
grupo.
O bien podemos emplear int datosAlumnos[2][20] y entonces sabemos que los datos de
la forma datosAlumnos[0][i] son los del primer grupo, y los datosAlumnos[1][i] son
los del segundo.
En cualquier caso, si queremos indicar valores iniciales, lo haremos entre llaves,
igual que si fuera una tabla de una �nica dimensi�n. Vamos a verlo con un ejemplo
de su uso:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.05:
// Array de dos dimensiones

#include <iostream>
using namespace std;

int main()
{
int notas[2][10] =
{
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }
};

cout << "La nota del tercer alumno del grupo 1 es "
<< notas[0][2];

return 0;
}
Este tipo de tablas son las que se usan tambi�n para guardar matrices, cuando hay
que resolver problemas matem�ticos m�s complejos. Por ejemplo, un programa que pida
al usuario los datos de dos matrices de 3x3 y luego muestre su suma podr�a ser as�:
// Introducci�n a C++, Nacho Cabanes
// Ejemplo 05.06
// Matrices, primer contacto

#include <iostream>
using namespace std;

int main()
{
float matriz[2][3][3];
float matrizSuma[3][3];
int m, fila, columna;

// Pedimos los datos de las dos matrices


for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
{
cout << "En la matriz " << m+1
<< ", dime el dato de la fila " << fila+1
<< " y la columna " << columna+1 << ": ";
cin >> matriz[m][fila][columna];
}

// Calculamos la suma
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
matrizSuma[fila][columna] = matriz[0][fila][columna]
+ matriz[1][fila][columna];

// Y mostramos el resultado (puede salir un poco descolocado)


cout << "La matriz suma es " << endl;
for (fila=0; fila<3; fila++)
{
for (columna=0; columna<3; columna++)
cout << matrizSuma[fila][columna] << " ";
cout << endl;
}

return 0;
}
Cuidado: no podemos dar por sentado que los datos de un array tengan valor inicial
0, sino que pueden contener "basura" (lo que hubiera en cada posici�n de memoria
anteriormente), de modo que este programa es incorrecto y puee mostrar resultados
incorrectos:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.06b:
// Matrices, l�gica err�nea (sin dar valor inicial)

#include <iostream>
using namespace std;

int main()
{
float matriz[2][3][3];
float matrizSuma[3][3];
int m, fila, columna;
// Pedimos los datos de las dos matrices
for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
{
cout << "En la matriz " << m+1
<< ", dime el dato de la fila " << fila+1
<< " y la columna " << columna+1 << ": ";
cin >> matriz[m][fila][columna];
}

// Calculamos la suma
for (m=0; m<2; m++)
for (fila=0; fila<3; fila++)
for (columna=0; columna<3; columna++)
matrizSuma[fila][columna] += matriz[m][fila][columna];
// La l�nea anterior es err�nea: estamos dando por sentado
// que la matriz suma contiene ceros, y quiz� no sea as�

// Y mostramos el resultado (puede salir un poco descolocado)


cout << "La suma es ";
for (fila=0; fila<3; fila++)
{
for (columna=0; columna<3; columna++)
cout << matrizSuma[fila][columna] << " ";
cout << endl;
}

return 0;
}
Ejercicios propuestos sobre matrices:

(5.4.1) Un programa pida datos al usuario los datos de una matriz de 2x2 y muestra
su traspuesta (el resultado de intercambiar filas por columnas).
(5.4.2) Un programa que pida al usuario los datos de una matriz de 3x3, y muestre
su determinante.
(5.4.3) Un programa que pida al usuario los datos de una matriz de 3x3, y calcule y
muestre su matriz adjunta.
(5.4.4) Un programa que pida al usuario los datos de una matriz de 3x3, y calcule y
muestre su matriz inversa.
(5.4.5) Un programa que pida al usuario los datos de dos matrices de 2x2, y calcule
y muestre su producto.
(5.4.6) Un programa que use una matriz de 3x4 para resolver un sistema de 3
ecuaciones con 3 inc�gnitas usando el m�todo de Gauss (hacer ceros por debajo de la
diagonal principal para luego aplicar sustituci�n regresiva).
5.5. Arrays indeterminados.
Si damos un valor inicial a un array, no ser� necesario que indiquemos su tama�o,
porque el compilador lo puede saber contando cuantos valores hemos detallado, as�:

// Introducci�n a C++, Nacho Cabanes


// Ejemplo 05.07:
// Arrays en los que no se indica el tama�o

#include <iostream>
using namespace std;

int main()
{
int diasMes[] = // D�as de cada mes
{31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};

cout << "Los d�as de noviembre son: " << diasMes[10];


return 0;
}

También podría gustarte