Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vectores en C++
Hasta ahora en las prácticas todos los datos que hemos manejado eran “simples”: enteros, reales,
carácter.... En esta práctica veremos cómo se trabaja con vectores, que son los datos estructurados
más sencillos y habituales, además de ser imprescindibles para el tratamiento de datos a los que se
quiere acceder de manera directa.
1 Vectores en C++
Un vector (array, en inglés) es una estructura de datos que nos permite almacenar una colección de
datos, todos ellos del mismo tipo, que a su vez puede ser simple o estructurado. Frente a otros tipos
de estructuras, un vector se caracteriza porque:
• los elementos del vector se almacenan en posiciones contiguas de memoria.
• existe un único nombre de variable que representa a todos los elementos, diferenciándose éstos
por un índice entero, que varía entre 0 y el tamaño del vector menos uno.
• se puede acceder de manera directa a los elementos del vector.
Ejemplo:
Declaración de una variable, de nombre v, de tipo vector de enteros de tamaño 10
int v[10];
Otro detalle importante es que C++ no realiza comprobación de “salida de rango” en los vectores, es
decir, no detiene la asignación de valores o acceso a valores fuera del vector. Es el programador
quien se ha de encargar de ello. De esta forma, y siguiendo el ejemplo anterior, una expresión en la
que apareciera v[12] no generaría un error al compilar un programa, pero estaríamos accediendo a
una posición de memoria que no estaba previamente reservada. En el caso de acceso a las
componentes el problema consistiría en la no obtención de los resultados deseados, pero en el caso
de asignación de valores a componentes podríamos "machacar" datos de zonas prohibidas de
memoria, pudiendo incluso bloquear el ordenador. Debemos ser pues especialmente cuidadosos
en el manejo de vectores.
C++ no realiza comprobaciones de salida de rango en el acceso a posiciones de un vector
con lo que definiríamos una matriz, especialmente útiles en el diseño de tablas y en aplicaciones
matemáticas.
Ejemplo
Para crear una matriz m de 2 filas por 3 columnas, con sus elementos de tipo real, escribiríamos:
float m[2][3];
Los índices siguen comenzando en cero, con lo que en este ejemplo los cuatro elementos de la
matriz serían:
m[0][0], m[0][1], m[0][2], m[0][1], m[1][0], m[1][1], m[1][2]
crea un vector de tamaño 3, asignando ‘a’ al elemento v[0], ‘b’ al elemento v[1] y ‘c’ al elemento
v[2].
2
Informática. Práctica 7.
Vectores en C++
En el caso de inicialización de matrices, debemos tener en cuenta que el primer índice que varía es el
situado a la derecha: C++ trata las matrices por filas.
Ejemplo
La declaración:
float m[2][3]={1,2,3,0,1,2};
es decir, que no es necesario especificar entre los corchetes la dimensión del vector, sino
simplemente informar a la función de que el parámetro es un vector. Para ello añadimos los
corchetes al tipo de datos básico de cada elemento del vector 1.
Los vectores en C++ son siempre parámetros de entrada-salida: su contenido puede ser modificado
por la función que los recibe, y esos cambios seguirán vigentes en el módulo llamador.
En C++ los vectores son siempre parámetros de entrada/salida y además no debe utilizarse el &
para indicarlo.
Otra peculiaridad de C++ es que no permite que una función devuelva como resultado un dato de
tipo vector (en la orden return). Por tanto, si necesitamos que un subprograma devuelva como
resultado un vector, deberemos utilizar una acción2.
En C++ una función no puede devolver como resultado un vector (en la orden return).
Para una mayor comprensión de estas ideas, observa el ejemplo al final de la práctica.
1 Con matrices podemos obviar la primera dimensión, pero debemos incluir obligatoriamente la segunda.
Ejm. tipo [][tamaño2]
2 Para indicar que un subprograma C devuelve un vector hay que recurrir al concepto de puntero, lo que
excede el alcance de esta asignatura introductoria. Será materia de asignaturas futuras de la carrera.
3
Informática. Práctica 7.
Vectores en C++
'H' 'o' 'l' 'a' ' ' 'M' 'a' 'r' 'í' 'a' '\0'
Es necesario observar que las cadenas son vectores de caracteres, pero que no necesariamente
todos los vectores de caracteres son cadenas: para que un vector de caracteres sea una cadena debe
tener el carácter '\0' como último elemento.
C++ reconoce constantes de tipo cadena, que son los caracteres que aparecen entre comillas dobles
("").
Ejemplo
"Hola María" es una constante de tipo cadena en C++.
0 1 2 3 4 5 6 7 8 9 10
char cadena[15];
...
cin >> cadena;
4
Informática. Práctica 7.
Vectores en C++
Si introducimos por teclado la cadena “Hola a todos” (sin las comillas), tras la primera lectura el valor
de cadena será “Hola”, es decir, que se omite todo lo que va tras el primer espacio en blanco. Esto
es debido a que los espacios en blanco actúan como “marca de final de cadena”. En la segunda
lectura, el valor que se lee para cadena sería “a”.
Para evitar este problema, utilizaremos el método cin.getline(variableCadena,tamaño). Este
método lee una cadena de caracteres que almacena en variableCadena y limita el número de
caracteres leídos al valor de tamaño., incluido el '\0' final (es decir, lee como máximo tamaño-1
caracteres significativos). Con el uso de tamaño evitamos que un usuario mal intencionado
introduzca código malicioso en el sistema (es lo que se denomina inyección de código). Ante una
lectura de una cadena de caracteres con el método cin.getline el usuario puede escribir el
número de caracteres que quiera, pero el sistema leerá, como máximo, el número indicado en
tamaño. De esta forma garantizamos que no vamos a desbordar el tamaño de la variable cadena.
Ejemplo
char cadena[ ]="Hola";
...
cin.getline(cadena,5);
cout<<cadena;
...
char cadena[15]
strcpy(cadena,"hola")
5
Informática. Práctica 7.
Vectores en C++
3 Un ejemplo
En el siguiente ejemplo se muestra un programa en C++ que calcula el máximo de N números
enteros introducidos por teclado. Los N números se almacenan en un vector. Observa cómo se
define una constante (TAM) para fijar el tamaño del vector, de forma que no se debe superar ese
tamaño (N debe ser menor que él). Presta atención también al uso de los vectores como
parámetros: observa que desde el punto de vista del subalgoritmo de lectura, el vector es un
parámetro de salida, que llega vacío al subprograma y sale de él con valores. Recuerda que en C/C++
los vectores son siempre tratados como parámetros de entrada/salida y que además no hay que
utilizar el & para indicarlo.
#include <iostream>
using namespace std;
int main()
{
const int TAM = 100;
int lista[TAM];
int n;
cout << endl << "¿Cuántos elementos?(debe estar entre 1 y " << TAM << "): ";
cin >> n;
leeVector(lista, n);
cout << endl << "Máximo de los " << n << "números: " << maximoVector(lista,n);
return 0;
}
for(i=0;i<n;i=i+1)
{
cout << endl << "Introduce elemento " << i;
cin >> v[i];
}
6
Informática. Práctica 7.
Vectores en C++
maxi=v[0];
for(i=1;i<n;i++)
{
if(v[i] > maxi)
{
maxi=v[i];
}
}
return maxi;
}
7
Informática. Práctica 7.
Vectores en C++
4 Sesión de prácticas
4.1 Primer ejercicio
Con este ejercicio aprenderás como:
• Declarar vectores en C++ y acceder a sus componentes
Traduce el siguiente seudocódigo a C++. Edita, guarda con el nombre P7EJ1, compila y ejecuta el
programa. Recuerda que C++ indexa los vectores comenzando en 0.
Especificación:
Entrada: dni
Salida: letra del NIF
8
Informática. Práctica 7.
Vectores en C++
int main()
{
const int TAM = 100;
int n;
..............
float media;
cout<<endl<<"¿Cuántos elementos?(debe estar entre 1 y " << TAM << "): ";
cin>>n;
.............. /* Llamada a la acción leeVector*/
.............. /* Llamada a la función de calculo de la media */
cout<<endl<<"La media de los "<< n <<" números es "<< media;
return 0;
}
suma=0;
.........
for (............)
{
suma=suma+.........
}
media=suma/n;
................
}
9
Informática. Práctica 7.
Vectores en C++
de tal manera que devuelva VERDAD si la palabra que se le pasa como parámetro es un
palíndromo, es decir, se lee igual de izquierda a derecha que de derecha a izquierda (por
ejemplo, alla, oso, rasarson palíndromos), y FALSO en caso contrario.
2) Crea un programa completo en C++ que lea por teclado una palabra, llame a la función
anterior y muestre por pantalla si el texto es o no un palíndromo. La lectura puede hacerse
usando cin.getline, obteniendo luego su tamaño con la función strlen.
3) Mejora lo hecho en el primer apartado permitiendo frases. Por ejemplo, dabale arroz a la
zorra el abad es un ejemplo de palíndromo. Para poder utilizar lo ya hecho, basta con
diseñar una nueva acción que, dado un vector de caracteres (y su tamaño), construya el
vector que resulta de eliminar sus espacios en blanco (dando también como salida su
tamaño).
10
Informática. Práctica 7.
Vectores en C++
11