Вы находитесь на странице: 1из 3

Matrices o Arrays (I)

Matrices (II)
En la entrega anterior, se hacía una introducción a cómo podíamos almacenar información en
una serie de vectores o matrices, pero la vida real nos hace comprender que no siempre esta
introducción es fructífera.

Redimensión
El estudio de las matrices entra en las primeras asignaturas de la carrera de informática y, tras
realizar miles y miles de ejercicios, el alumno sabe trabajar de mil maneras con los arrays, pero
siempre de un modo similar al siguiente (al igual que hicimos con la primera entrega):

Option Explicit
Option Base 0

Private Const MAX_ELEMENTOS As Integer = 10

Sub Ejemplo()
Dim Tabla(MAX_ELEMENTOS) As String
' ... Resto del código
End Sub

Eso sí, cuando entramos en el “mundo real”, lo primero que necesitamos es disponer de más
elementos de una manera dinámica, es decir, en tiempo de ejecución de la aplicación.

Dicho de otra manera, es más que probable que no sepamos de antemano el número de
elementos que tenemos que almacenar en un array.

En el siguiente ejemplo, se crea un array en el que se introducen una serie de valores, no


obstante, si nos fijamos, la definición de la matriz no es la misma que hemos usado hasta el
momento.

Option Explicit
Option Base 0

Private Tabla() As Integer

Sub Ejemplo()
Dim i As Integer

' Redimensión de la matriz


ReDim Tabla(10) As Integer

' Se llenan datos de ejemplo


For i = 0 To 10
Tabla(i) = i
Next i

Call ImprimeArray(Tabla())
End Sub

Private Sub ImprimeArray(ByRef datos() As Integer)


Dim i As Integer
For i = LBound(datos) To UBound(datos)
Debug.Print datos(i)
Next i
End Sub

Cualquiera que vea el código anterior puede pensar ¿qué estamos ganando, en vez de usar un
línea para dimensionar un array, ahora estamos usando dos?. La respuesta puede quedar más
clara si añadimos un poco de código adicional al ejemplo anterior, de tal manera que exista una
segunda “redimensión”.

Jesús Velasco 1/3


Matrices o Arrays (I)

Option Explicit
Option Base 0

Private Tabla() As Integer

Sub Ejemplo()
Dim i As Integer

' Primera dimensión


ReDim Tabla(10) As Integer

' Se llenan datos de ejemplo


For i = 0 To 10
Tabla(i) = i
Next i

' Segunda redimensión


ReDim Preserve Tabla(20)

' Se llenan de nuevo los datos de la tabla


For i = 11 To 20
Tabla(i) = i
Next i

Call ImprimeArray(Tabla())
End Sub

Private Sub ImprimeArray(ByRef datos() As Integer)


Dim i As Integer
For i = LBound(datos) To UBound(datos)
Debug.Print datos(i)
Next i
End Sub

Es importante destacar la cláusula Preserve en la línea en la que se redimensiona la matriz,


puesto que es lo que nos permite seguir manteniendo los datos que existían hasta el momento.
Si nos olvidamos de esta cláusula, en el ejemplo, sólo tendríamos una matriz de 20 elementos
en los que las “casillas” 0 a 10 tendrían un valor de 0.

Matrices multidimensionales
Aunque hasta el momento siempre se ha hablado de una matriz como un vector de datos,
debemos tener en cuenta que no siempre tenemos que limitarnos a esto, puesto que podemos
hacer que un array tenga, por ejemplo, dos dimensiones, al igual que una hoja de cálculo.

Así, si por ejemplo tuviésemos la necesidad de almacenar las notas de 10 alumnos de, digamos
tres exámenes, utilizaríamos la instrucción siguiente:

Dim notas(9, 2)

Con esta instrucción habremos conseguido crear un espacio en memoria similar al de la figura:

Jesús Velasco 2/3


Matrices o Arrays (I)

0 1 2
0
1
2
3
4
5
6
7
8
9

Y un ejemplo de cómo utilizar este tipo de matrices sería algo así como:

Option Explicit
Option Base 0

Dim notas(9, 2)

Sub Main()
Dim alumno As Integer

For alumno = 0 To 9
notas(alumno, 0) = Int(Rnd() * 10)
notas(alumno, 1) = Int(Rnd() * 10)
notas(alumno, 2) = Int(Rnd() * 10)
Next alumno

' Impresión de las notas


For alumno = 0 To 9
Debug.Print "Alumno " & Str(alumno), notas(alumno, 0), notas(alumno,
1), notas(alumno, 2)
Next alumno

End Sub

A partir de este punto, trabajar con matrices se convierte en una tarea más o menos repetitiva
(no pensemos que monótona, que las matrices tienen muchas sorpresas) en la que la velocidad
y el ahorro de memoria tienen un gran peso.

De todas formas, invito a reflexionar sobre determinados elementos:

¿Qué ocurre si, además de las notas, quiero almacenar el nombre del alumno?
¿Qué ocurre si, por ejemplo, quisiese ordenar los datos de un array?.

Intentaremos dejar estas cuestiones en el aire con la intención de responderlas en futuros


artículos.

Jesús Velasco 3/3