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

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 pseudos-
aleatorios, 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

Вам также может понравиться