Y ahora algo muy interesante, los arrays, que están dentro de la librería Array, quién lo hubiera sospechado, ¿eh? Como ya hemos visto las variables en Small Basic solo almacenan números y cadenas (y estas últimas al almacenarlas con la asignación en las variables o al usar el operador +, se comprueba primero si se pueden convertir a un número), pero en una aplicación, o mismamente en un juego, vamos a necesitar muchas veces formas de almacenar datos en tablas para tenerlos organizados de alguna forma. Para ello existe la librería Array, que contiene las siguientes operaciones:
- ContainsIndex(nombre, índice): Comprueba si existe un índice en un array, algo que puede ser útil para determinar si hemos inicializado o no una zona del array con un valor o no. Si el índice tiene asignado un valor devolverá “True”, sino ha sido inicializado o ha sido borrado, devolverá “False”.
- ContainsValue(nombre, valor): Comprueba si existe un determinado valor en alguno de los índices de un array. Si existe el valor en el array devolverá “True”, sino devolverá “False”.
- GetItemCount(nombre): Devuelve el número de elementos almacenados en un array.
- GetValue(nombre, índice): Devuelve un valor almacenado en un índice de un array. Si no existe el índice lo que devuelve es una cadena vacía.
- RemoveValue(nombre, índice): Borra un índice de un array.
- SetValue(nombre, índice, valor): Inicializa o cambia el valor almacenado en un índice de un array.
Hay que tener una cosa muy presente a la hora de manejar arrays y que es muy importante. Tanto el nombre, como el índice que le pasemos a estas operaciones, serán convertidos a cadenas internamente en caso de pasarle un número. Es decir que yo puedo hacer lo siguiente:
Array.SetValue(0, 0, 101)
aux = Array.GetValue("0", "0")
TextWindow.WriteLine(aux)
Ahí lo que hacemos es crear un array cuyo nombre es el número cero y en la posición cero asignar el valor 101. Sin embargo internamente coge los valores numéricos que le hayamos pasado para el nombre y el índice, y los transforma en cadenas, por lo que en realidad hemos creado un array cuyo nombre es la cadena “0″ y hemos asignado el valor 101 en el índice “0″. Puede resultar un poco lioso al principio, pero todo es acostumbrarse, como con los punteros en C/C++.
El caso es que lo mejor para descubrir como funciona algo es realizar toda clase de experimentos con ello y probar todas las posibles combinaciones que se nos ocurran para ver qué es lo que funciona y que no funciona. Pero antes de ponerse a lo loco, aquí tenéis un ejemplo ilustrativo de como utilizar los arrays:
'----------------------------------------------------
' Prueba con arrays
'----------------------------------------------------
TextWindow.Title = "Prueba con arrays"
endl = Text.GetCharacter(13) '\n
endl = endl + Text.GetCharacter(10) '\r
'----------------------------------------------------
' Meter valores en un array
TextWindow.WriteLine("1) Metemos valores:")
TextWindow.Write(endl)
Array.SetValue("Teléfonos", "Pepe", "555-1234")
Array.SetValue("Teléfonos", "Juan", "555-1243")
Array.SetValue("Teléfonos", "Jose", "555-1423")
Array.SetValue("Edad", "Pepe", 37)
Array.SetValue("Edad", "Juan", 42)
Array.SetValue("Edad", "Jose", 101)
Array.SetValue("Números", "0", "Zero")
Array.SetValue("Números", "1", "Ichi")
Array.SetValue("Números", "2", "Ni")
Array.SetValue("Números", "3", "San")
Array.SetValue("Números", "4", "Shi")
Array.SetValue("Números", "5", "Go")
Array.SetValue("Números", "6", "Roku")
Array.SetValue("Números", "7", "Nana")
Array.SetValue("Números", "8", "Shichi")
Array.SetValue("Números", "9", "Kyu")
Array.SetValue("Números", "10", "Jû")
Array.SetValue("Binario", "00", "000")
Array.SetValue("Binario", "01", "001")
Array.SetValue("Binario", "02", "010")
Array.SetValue("Binario", "03", "011")
Array.SetValue("Binario", "04", "100")
Array.SetValue("Binario", "05", "101")
'----------------------------------------------------
' Obtener valores de un array
TextWindow.WriteLine("2) Mostramos los valores:")
TextWindow.Write(endl)
Sub MostrarPersona
aux = nombre + ": "
aux = aux + Array.GetValue("Edad", nombre)
aux = aux + ", "
aux = aux + Array.GetValue("Teléfonos", nombre)
TextWindow.WriteLine(aux)
EndSub
TextWindow.WriteLine("Listado de datos:")
nombre = "Pepe"
MostrarPersona()
nombre = "Juan"
MostrarPersona()
nombre = "Jose"
MostrarPersona()
TextWindow.Write(endl)
TextWindow.WriteLine("Los números en japonés:")
For i = 0 To 10
aux = Array.GetValue("Números", i)
TextWindow.Write(aux + " ")
EndFor
TextWindow.Write(endl)
PauseAndClear()
'----------------------------------------------------
' Problemas al obtener valores de un array
TextWindow.WriteLine("3) Problemas al mostrar:")
TextWindow.WriteLine("Los números en binario:")
For i = 0 To 5
aux = Array.GetValue("Binario", i)
TextWindow.Write(aux + " ")
EndFor
TextWindow.Write(endl)
TextWindow.Write("Pero no ha salido nada, snif... ")
TextWindow.Write("porque los índices no son los ")
TextWindow.WriteLine("correctos." + endl)
TextWindow.WriteLine("Los números en binario:")
For i = 0 To 5
i = Text.Append("0", i)
aux = Array.GetValue("binario", i)
TextWindow.Write(aux + " ")
EndFor
TextWindow.Write(endl)
TextWindow.Write("Pero no ha salido nada, snif... ")
TextWindow.Write("porque el nombre del array es ")
TextWindow.WriteLine("incorrecto." + endl)
TextWindow.WriteLine("Los números en binario:")
For i = 0 To 5
i = Text.Append("0", i)
aux = Array.GetValue("Binario", i)
TextWindow.Write(aux + " ")
EndFor
TextWindow.Write(endl)
TextWindow.WriteLine("Ahora sí sale todo bien ^_^")
PauseAndClear()
'----------------------------------------------------
' Obtener información de un array
TextWindow.WriteLine("4) Informaciones varias:")
TextWindow.Write(endl)
Sub ExisteÍndice
existe = Array.ContainsIndex(nombre, índice)
aux = "¿Existe en " + nombre + " el índice "
aux = aux + índice + "? "
TextWindow.Write(aux)
MostrarExiste()
TextWindow.Write(endl)
EndSub
nombre = "Números"
índice = 5
ExisteÍndice()
nombre = "Números"
índice = "8"
ExisteÍndice()
nombre = "Números"
índice = 14
ExisteÍndice()
TextWindow.Write(endl)
Sub ContieneValor
existe = Array.ContainsValue(nombre, valor)
aux = "¿Existe en " + nombre + " el valor "
aux = aux + valor + "? "
TextWindow.Write(aux)
MostrarExiste()
TextWindow.Write(endl)
EndSub
nombre = "Edad"
valor = 42
ContieneValor()
nombre = "Edad"
valor = 64
ContieneValor()
nombre = "Edad"
valor = "101"
ContieneValor()
TextWindow.Write(endl)
Sub MostrarTamaño
tamaño = Array.GetItemCount(nombre)
aux = "El array " + nombre + " tiene "
aux = aux + tamaño + " elementos."
TextWindow.WriteLine(aux)
EndSub
nombre = "Teléfonos"
MostrarTamaño()
nombre = "Números"
MostrarTamaño()
nombre = "Pájaros"
MostrarTamaño()
PauseAndClear()
'----------------------------------------------------
' Borrar valores en un array
TextWindow.WriteLine("5) Borramos valores:")
Sub MostrarTrasBorrar
aux = "Borrando el índice " + índice
TextWindow.WriteLine(aux)
Array.RemoveValue(nombre, índice)
MostrarTamaño()
EndSub
nombre = "Números"
MostrarTamaño()
índice = "1"
MostrarTrasBorrar()
índice = "3"
MostrarTrasBorrar()
índice = "5"
MostrarTrasBorrar()
índice = "7"
MostrarTrasBorrar()
índice = "9"
MostrarTrasBorrar()
índice = "11"
MostrarTrasBorrar()
índice = "02"
MostrarTrasBorrar()
TextWindow.Write(endl)
TextWindow.WriteLine("Los números pares en japonés:")
For i = 0 To 10 Step 2
aux = Array.GetValue("Números", i)
TextWindow.Write(aux + " ")
EndFor
TextWindow.WriteLine(endl)
'----------------------------------------------------
' Subrutinas de apoyo
Sub MostrarExiste
colorAux = TextWindow.ForegroundColor
If existe Then
TextWindow.ForegroundColor = "Green"
TextWindow.Write("Verdadero")
Else
TextWindow.ForegroundColor = "Red"
TextWindow.Write("Falso")
EndIf
TextWindow.ForegroundColor = colorAux
EndSub
Sub PauseAndClear
TextWindow.Write(endl)
TextWindow.Pause()
TextWindow.Clear()
EndSub
En el próximo artículo hablaremos sobre las pilas y su uso en un lenguaje como Small Basic, también es posible que después de hablar de las pilas haga algunas anotaciones sobre el tema de las cadenas y su conversión a número o no, dependiendo de diversos factores.
Posted in Small Basic
