Matrices o Arrays (I)
Matrices o Arrays (I) Introducción Si vamos a intentar simplificar al máximo, lo mejor será no extenderse en una aburrida introducción. Una matriz nos permitirá tratar unas cuantas variables como si se tratase de una sola. Si lo miramos así, casi parece hasta divertido, pero debemos tener en cuenta un par de puntos: Todas las variables que tenemos en nuestra matriz serán de un mismo tipo Añadir, eliminar y modificar elementos de la matriz no es tarea sencilla De hecho, un array o matriz no es ni más ni menos que una “tabla” de variables, en la que cada variable almacenada ocupará una “celda” de dicha tabla. Ahora, una vez dicho esto, ¿por qué no podemos empezar con un ejemplo? Necesitamos almacenar, por ejemplo, los números que ha introducido un usuario en el juego típico de adivinar el número mayor y menor. No vamos a entrar aquí en el juego en sí, pero sí que nos vamos a preocupar de almacenar los datos que ha ido introduciendo el jugador. Nota: Es posible que se “incumpla” alguna regla básica de programación, pero el ejemplo está enfocado, principalmente a entender el tema, así que no me preocupo de más. Damos por supuesto que sólo vamos a crear la rutina que almacene los números que ha introducido el “jugador”. Damos por supuesto que hemos creado una pequeña aplicación que siempre pierde, puesto que, en vez de pedir números al usuario, tan sólo se limita a generar una serie de números aleatorios y, ni tal siquiera los comprueba. Añadimos el código completo y así podremos ir comentándolo. Option Explicit Option Base 0 Private Const MAX_INTENTOS As Integer = 10 Private NumerosJugados(MAX_INTENTOS - 1) As Integer
Sub InicioJuego() Dim contador As Integer Dim NumeroIntroducido As Integer ' ... programa ' Bucle de petición de los números For contador = 0 To MAX_INTENTOS - 1 NumeroIntroducido = Int(Math.Rnd * 1000) + 1 If IsNumeroCorrecto(NumeroIntroducido) Then MsgBox ("Has ganado") Else ' Se guarda el número en la matriz NumerosJugados(contador) = NumeroIntroducido End If Next contador
' De momento, siempre se pierde, así que se muestran los números
Jesús Velasco
1/4
Matrices o Arrays (I)
' que se han introducido For contador = 0 To MAX_INTENTOS - 1 Debug.Print NumerosJugados(contador) Next contador ' ... Más programa End Sub Private Function IsNumeroCorrecto(ByVal NumeroIntroducido As Integer) As Boolean IsNumeroCorrecto = False End Function
Visto así, parece un poco complejo, ¿no?.
Preparando el módulo para trabajar con matrices. Cuando nos juntamos varios amigos para tomar, por ejemplo, una refrescante cerveza, empezamos a contar con “los dedos”, es decir, empezamos contando 1, 2, 3.. los lenguajes de programación no hacen esto. Ellos, hacen uso de la totalidad de los números arábigos y añaden el 0. Resumiendo, es como si nosotros, en esa cerveza que comentaba, contásemos 0,1,2… En VBA o en VB podemos hacer que este comportamiento quede alterado con la instrucción que puede observarse al principio del código: Option Base 0 Option Base puede adoptar los valores de 0 ó 1, dependiendo de si queremos que el primer elemento de la “tabla”, es decir, de la matriz sea 0 ó 1. Es aconsejable empezar a acostumbrarse a trabajar con el 0 (amén de los inconvenientes que podamos encontrarle), puesto que la inmensa mayoría de los lenguajes de programación no contemplan un dimensionado de matrices con un primer elemento 1 (incluidas las nuevas versiones de VB.NET).
Dimensionando matrices La dimensión de una matriz se asemeja mucho a la de cualquier variable: Private Const MAX_INTENTOS As Integer = 10 Private NumerosJugados(MAX_INTENTOS - 1) As Integer Podemos fijarnos que he creado una matriz de 10 “casillas” o elementos, puesto que si tenemos en cuenta el punto anterior, la primera posición es NumerosJugados(0) y, por supuesto, la última NumerosJugados(9). En principio, en esta primera entrega, vamos a dejar que el tamaño de la matriz será estático y que necesitaremos “estudiar” mucho más para poder variarlo.
Llenar de datos una matriz Llenar una matriz se asemeja, todavía más que el dimensionado, al uso cotidiano de variables, puesto que tan sólo se trata de hacer asignaciones del tipo: Variable(indice)=valor
Jesús Velasco
2/4
Matrices o Arrays (I)
Seguiremos el ejemplo inicial: ' Bucle de petición de los números For contador = 0 To MAX_INTENTOS - 1 NumeroIntroducido = Int(Math.Rnd * 1000) + 1 If IsNumeroCorrecto(NumeroIntroducido) Then MsgBox ("Has ganado") Else ' Se guarda el número en la matriz NumerosJugados(contador) = NumeroIntroducido End If Next contador
El bucle siguiente permite repetir una serie de acciones un máximo de veces estipulado en MAX_INTENTOS, que es el número máximo de intentos que, en teoría, permitimos al jugador. For contador = 0 To MAX_INTENTOS – 1 ... Next contador He sustituido la típica petición de números al usuario por una generación de números pseudosaleatorios, gracias a la línea: NumeroIntroducido = Int(Math.Rnd * 1000) + 1 De esta manera, sin importar tampoco ahora si se validan o no estos números (en la función siempre devuelvo un valor False, así que nunca se acierta, pero queda para poder acabar el juego en el futuro), lo importante es cómo almacenamos estos valores en la matriz: ' Se guarda el número en la matriz NumerosJugados(contador) = NumeroIntroducido Tal como se decía al principio del tema, almacenar datos en una matriz es similar a guardarlos en una variable, pero añadiendo el índice de la “tabla”.
Lectura de los datos almacenados De la misma manera que hemos escrito valores en una matriz, podemos leer los valores almacenados de la misma manera, es decir: For contador = 0 To MAX_INTENTOS - 1 Debug.Print NumerosJugados(contador) Next contador
Podemos observar que no tiene más secreto que la precaución de no sobrepasar los límites de la matriz.
¿Qué pasa si? ¿Qué pasa si he desarrollado una aplicación en la que tenía OPTION BASE 1 y ahora, que empiezo a usar otros lenguajes, quiero usar OPTION BASE 0? No pasa nada. De hecho, VBA tiene un par de funciones la mar de simpáticas que nos devuelven el rango inferior y superior de una matriz. Con estas funciones, el bucle del punto anterior podría quedar como:
Jesús Velasco
3/4
Matrices o Arrays (I)
For contador = LBound(NumerosJugados) To UBound(NumerosJugados) Debug.Print NumerosJugados(contador) Next contador Lbound nos devolverá el índice inferior de la matriz y Ubound su homónimo, es decir, su índice superior.
Jesús Velasco
4/4