Colecciones de datos
Hasta el momento únicamente disponemos de variables (y constantes) como recurso para almacenar información, bueno, para referenciar la ubicación de los datos en la memoria RAM, para ser más precisos. Pero una variable sólo permite almacenar un dato cuando ya hemos podido comprobar que en un algoritmo muchas veces necesitamos almacenar muchos. Es cierto que según qué circunstancias multiplicar el número de variables es la única solución, pero en otras muchas los arreglos, matrices o vectores (que diferentes nombres tienen) son una buena alternativa. En esta entrada vamos a trabajar sobre los arreglos en PSeInt, paso previo para su estudio en Python.
En la propia documentación de PSeInt, a la que puedes acceder desde este comando...
... puedes encontrar información sobre los arreglos, también identificados como vectores o matrices: los arreglos se definen como estructuras homogéneas de datos que permiten almacenar un determinado número de elementos.
Si pensamos en términos de teoría de conjuntos, podríamos definir un arreglo como un conjunto o subconjunto no unitario, en oposición a una variable que se definiría como conjunto o conjunto unitario.
Es importante entender que un arreglo requiere que los datos sean homogéneos, esto es: que todos sean del mismo tipo. En principio, en un arreglo no podemos mezclar datos alfanuméricos con datos numéricos y/o lógicos. De ahí que dijera antes que podremos utilizar arreglos en lugar de variables en determinadas circunstancias, esto es: cuando los datos que deseamos almacenar en la memoria RAM sean homogéneos.
Para trabajar con arreglos hay que aprender a crearlos, pero necesitamos un segundo paso: necesitamos dimensionarlos también, cosa que no es necesario hacer con las variables ya que, por definición, éstas sólo hacen referencia a un datos (son conjuntos unitarios, como ya dije).
Definir o declarar un arreglo no presenta ninguna diferencia con declarar una variable; de hecho se pueden declarar o definir variables y arreglos en una misma instrucción (siempre, claro está, que ambos sean del mismo tipo). Por ejemplo: Definir palabra, palabras como caracter; es perfectamente válido: palabra es una variable y palabras es un arreglo. Bueno, aun no lo es, ya que para que lo sea necesitamos dimensionarlo.
De hecho, mientras que a la variable palabra queremos asignarle un datos, podemos hacerlo directamente mediante un operador de asignación (palabra<-"Casa";), pero si queremos hacer lo mismo con el arreglo palabras (palabras<-"casa","mesa"...;) PSeInt nos manda un aviso de que hemos introducido demasiados parámetros, que viene a ser lo mismo que decir que palabras está siendo entendido como variable (y a una variable sólo se le puede "asignar" un dato o elemento).
Para evitar este problema, primero deberemos dimensionar el arreglo mediante la instrucción Dimension: Dimension palabras[3], por ejemplo, significa que:
- palabras no es una variable (alfanumérica), es un arreglo (alfanumérico)
- el arreglo palabras[n] hace referencia a una dirección en la memoria RAM que contiene una lista de elementos (homogéneos) formada por n número de datos o elementos.
- nuestro arreglo tiene un máximo de 3 elementos, siendo este dato delimitador de los índices que las identifican posiciones que ocupan en la memoria RAM.
... de este modo estableceremos la dimensión del arreglo de forma interactiva (en tiempo de ejecución), lo que da mucha más flexibilidad al algoritmo, aunque presenta un problema: no podremos modificar esta dimensión a lo largo de todo el algoritmo... en PSeInt.
palabras[0]="casa"; asigna "casa" a la primera posición del arreglo palabras[]. Y así con los siguientes datos del arreglo hasta finalizar la lista de elementos de su índice.
NOTA. Esta primera posición se identifica, por defecto, con el valor 0, aunque podemos cambiar la configuración de PSeInt para que el conteo de los índices empiece en 1, cosa que no recomiendo por mantener la similitud con los lenguajes de programación, que normalmente utilizan el criterio de inicio 0.
Proceso Arreglo2//Declarar arreglo y variables para contador e índiceDefinir palabras como caracter;Definir i, contador como entero;//Dar valor al número de elementos del arregloEscribir "¿De cuántas palabras va a estar compuesta esta lista?";Leer i;//Dimensionar el arregloDimension palabras[i];//Solicitar valores para incluir en el arregloPara contador = 0 Hasta i-1 HacerLeer palabras[contador];FinPara//Devolver información a demanda del usuario o usuariaEscribir "¿Qué datos quieres ver?. Indica la posición que ocupa en la lista.";leer i;i = i-1;Escribir palabras[i];FinProceso
- El correcto funcionamiento del bucle requiere de dos variables: una con función de contador (contador) y otra como límite de iteraciones (i). Esta segunda debe ser igual al total de elementos del arreglo, por lo que utilizamos la expresión i-1, ya que i, tal y como queda definida antes sobrepasa en 1 el número de elementos del arreglo (por eso de que se inicia en 0), lo que generaría desbordamiento: el número de iteraciones superar en 1 al número de elementos del arreglo "dimensionados" mediante i. En consecuencia, lo correcto es Para contador = 0 Hasta i-1 Hacer.
- También utilizamos el valor del contador contador para identificar el índice del arreglo en el que introducir el dato durante las iteraciones, ya que es contador la variable que se ajusta a la iteración, puesto que es la variable asociada a Para. Si usáramos la variable i, cuyo valor establecimos antes (Leer i;) como número de elementos del arreglo, ya en la primera iteración nos situaríamos fuera de sus límites.
- Las mismas razones por las que en el bucle establecimos como límite de iteraciones i-1 nos llevan en la solicitud de datos a asignar a i el valor i+1 para acceder a una posición del arreglo: i = i-1; permite que el usuario o usuaria no tenga que estar pensando en términos de programador y, claro está, no sería lógico explicar que debe descontar 1 al número que introduzca para obtener el dato deseado.