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 notas(alumno, notas(alumno, notas(alumno, Next alumno
9 0) = Int(Rnd() * 10) 1) = Int(Rnd() * 10) 2) = Int(Rnd() * 10)
' 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