Vectores
La idea de vector, en informática, es la siguiente: imaginad que en vuestro programa necesitais 10.000 variables de tipo entero que representen cada una de ellas la temperatura de unos pueblos. Imagino que a nadie se le habrá ocurrido ponerse, en la declaración de variables, a declarar una por una las 10.000 variables que se necesitan. Dado que son variables que están relacionadas entre sí por su significado (y eso es algo que lo decide siempre el programador), parece lógico querer ponerles un nombre común, y que sea el índice (en qué componente de vector se encuentran) lo que las distinga. Vemos pues que los vectores nos dan unas ciertas ventajas: declarar muchas variables relacionadas entre sí de un mismo tipo de una vez, y acceder a cualquiera de ellas usando tan sólo un índice.
Declararemos algo como esto (lo precisamos un poco más adelante):
Temperaturas: es un vector de reales con 10.000 componentes
Para referirnos a los elementos de un vector, tenemos que especificar el
índice del elemento que estamos tratando: v[i].
Así, asignaremos un valor haciendo v[i] <- 3
y leeremos un valor haciendo m <- v[i].
Asignaremos valores a cada una de esas componentes, bien
a mano:
Temperaturas(1) <- 23.5
Temperaturas(2) <- 22.7
Temperaturas(3) <- 25.2
Temperaturas(4) <- 20.4
...
o bien en un bucle:
desde i=1 hasta i=10.000 hacer
Temperaturas(i) <- Medida_Temperatura
fin desde
y, en la memoria del ordenador, lo que tendremos será algo como:
|--------|
| 23.5 | Este es Temperaturas(1)
|--------|
| 22.7 | Este es Temperaturas(2)
|--------|
| 25.2 | Este es Temperaturas(3)
|--------|
| 20.4 | Este es Temperaturas(4)
|--------|
| ...... |
|--------|
| 19.2 | Este es Temperaturas(10000)
| -------|
Para acceder a cualquier componente del vector, sólo tendremos
que poner Temperaturas(posicion), donde posicion será el
número de orden.
Vamos a ser un poco más precisos con la nomenclatura: para declarar un vector de N elementos (numerados del 1 al N) de tipo X, lo haremos de la siguiente manera:
Variable: Vector[1..N] de Tipo;
Por ejemplo, para declarar un vector de 20 enteros, haremos:
v: Vector[1..N] de Entero;
¿Qué cosas podemos hacer con un vector?
Esto depende de quiénes lo integren; me explico: si nuestro
vector está formado por números, podremos sumar, restar y
multiplicar vectores. Sin embargo, estas funciones ya NO
forman parte del lenguaje de programación, si no que
tendremos que hacérnoslas nosotros. En el caso de vectores
numéricos, veremos cómo se puede escribir el pseudocódigo
para algunas de ellas.
Ya he mencionado que los vectores no sólo pueden ser de
números, sino también de caracteres. Por ejemplo, podemos
tener el siguiente vector de caracteres:
|-----|
| A |
|-----|
| G |
|-----|
| J |
|-----|
| H |
|-----|
| R |
|-----|
Quizá sin mucho sentido, pero sí con caracteres :)
Ahora, no hace falta un alarde mucho mayor de imaginación para
poner el siguiente vector de caracteres:
|-----|
| H |
|-----|
| O |
|-----|
| L |
|-----|
| A |
|-----|
Vaya sorpresa: una palabra ;)
Sí, los vectores de caracteres se usan para formar lo que
se conoce bajo el nombre de "cadenas de caracteres".
Las forma de trabajar con las cadenas de caracteres depende del lenguaje de programación usado. Nosotros emplearemos la siguiente convención: para declarar una cadena de caracteres, usaremos el tipo "cadena", diciendo cuántos caracteres tiene la cadena. Por ejemplo:
str: Cadena[10];
Esto será una cadena de 10 caracteres. Además, escribiendo str estamos haciendo referencia a la cadena completa, mientras que si escribimos str[i] nos estamos refiriendo al carácter i-ésimo de la cadena.
Como decía más arriba, la suma de dos vectores tiene sentido si
hablamos de vectores numéricos, pero, ¿qué sentido tiene "sumar"
dos cadenas de caracteres? Pues el que nosotros le queramos
dar, y este suele ser el de CONCATENAR, es decir, obtener una
nueva cadena de caracteres, de mayor tamaño, y que tenga, primero,
los caracteres de la primera cadena para, a continuación, pasar
a tener los caracteres de la segunda cadena (mucho ojo, que
esto no es tan trivial como suena).
Por ejemplo, supongamos que tenemos las cadenas siguientes:
cadena1 <- ('H','o','l','a')
cadena2 <- ('M','u','n','d','o')
y hacemos:
cadena <- cadena1+cadena2
tendremos, en cadena:
cadena <- ('H','o','l','a','M','u','n','d','o')
y no
cadena <- ('H','o','l','a',' ','M','u','n','d','o')
puesto que al concatenar, no se añaden espacios.
El mundo de las cadenas de caracteres es un tanto especial, y lo
dejamos por ahora.
Antes, cuando he hablado de "operaciones" con vectores, he dicho
que había que definirlas. Veamos algunos ejemplos:
Queremos sumar dos vectores. Lo primero de todo, es que el
número de componentes ha de ser el mismo (si nos vamos al
símil de algún espacio Rn). Llamamos U
y V a nuestros dos
vectores, y W al vector suma. Las componentes de W, como
sabemos, las obtendremos así:
desde i=1 hasta i=tamanyo hacer
W(i) <- U(i) + V(i)
fin hacer
La resta es igualmente sencilla (y queda como ejercicio al
lector ;) ). Ahora, multiplicar dos vectores... ¿cómo?
Si nuestro vector representara algo en R3, tenemos dos
productos (conocidos) para estos vectores: el vectorial
y el escalar, en otro Rn, tenemos el producto escalar.
Pongamos que queremos calcular el producto escalar. Sabemos
que el resultado de esa multiplicación NO es un vector,
sino que el resultado es un número. En el caso del
producto vectorial, el resultado es un vector. O podemos
inventarnos nosotros el producto. Podemos querer que sea
como la suma: que la componente i-ésima del vector sea
el producto de las componentes i-ésimas de los vectores
factores. Todo depende del sentido que le queramos dar
a esa operación.
Por ejemplo, en el caso en que queramos que cada componente
sea el producto de las otras dos, el algoritmo es un mero
calco del de la suma:
desde i=1 hasta i=tamanyo hacer
W(i) <- U(i)*V(i)
fin hacer
Y, en el caso, del producto escalar, tampoco tiene mucha
complicación.
producto=0
desde i=1 hasta i=tamanyo hacer
producto <- producto + ( U(i)*V(i) )
fin hacer
Resumiendo: no hay definidas operaciones para vectores, sólo las
que nosotros queramos usar, y para ello tendremos que programarlas.
También podemos querer hacer otras cosas con vectores,
como, por ejemplo, ORDENARLO, pero esta es una cuestión que
podeis consultar en un
curso de
estructuras de datos.
Unos pequeños ejercicios:
1.- Escribid funciones que implementen las operaciones conocidas con
vectores (y las que se os ocurran): suma y resta de vectores, producto
de un número por un vector...
2.- Dados dos vectores de caracteres, escribid una función que devuelva
un vector de caracteres que sea la concatenación de los dos dados.
Eso es todo por ahora :)