Manual de Basic Spectrum 48k.

Capítulo 12

Matrices

Resumen

  • Matrices (la forma en que el ZX Spectrum trata las matrices de cadenas se aparta algo del procedimiento normal).
  • DIM ...

Suponga que tiene una lista de números, por ejemplo, las notas de diez personas en una clase. Para almacenarlas en el ordenador podría establecer una variable única para cada persona, pero tal método se consideraría arduo. Podría decidir llamar a la variable Bloggs 1, Bloggs 2 y así sucesivamente hasta Bloggs 10, pero el programa para preparar estos diez números sería bastante largo y aburrido de introducir por teclado.

Sería mucho más atractivo si pudiera teclear:

  5 REM este programa no funcionará
10 FOR n = 1 TO 10
20 READ Bloggs n
30 NEXT n
40 DATA 10,2,5,19,16,3,11,1,0,6

Bueno, lo cierto es que no puede.

Sin embargo, hay un mecanismo mediante el cual puede aplicar esta idea y utiliza matrices. Una matriz es un conjunto de variables, sus elementos, todos ellos con el mismo nombre, y distinguidos solamente por un número (el subíndice) escrito entre paréntesis después del nombre. En nuestro ejemplo, el nombre podría ser b (como las variables de control de los bucles FOR-NEXT, el nombre de una matriz debe ser una sola letra) y las diez variables serían entonces b(1), b(2) y así sucesivamente, hasta b(10).

Los elementos de una matriz se denominan variables con subíndice, en oposición a las variables simples, con las que ya está familiarizado.

Antes de que pueda utilizar una matriz, debe reservar algún espacio para la misma en el interior del ordenador y puede hacer esta operación con el empleo de una sentencia DIM (dimensión).

DIM b(10)

establece una matriz llamada b con dimensión 10 (esto es, hay 10 variables con subíndice b(1)...b(10)) e inicializa los 10 valores a 0. También borra cualquier matriz denominada b que existiera anteriormente. (Pero no una variable simple. Una matriz y una variable numérica simple con el mismo nombre pueden coexistir y no debe producirse ninguna confusión entre ellas porque la variable de matriz siempre tiene un subíndice).

El subíndice puede ser una expresión numérica arbitraria, por lo que, ahora, puede escribir:

10 FOR n = 1 TO 10
20 READ b(n)
30 NEXT n
40 DATA 10,2,5,19,16,3,11,1,0,6

También puede establecer matrices con más de una dimensión.

En una matriz de dos dimensiones, necesita dos números para especificar uno de los elementos (bastante similar a los números de línea y de columna que especifican una posición de carácter en la pantalla de televisión), por lo que tiene la forma de una tabla. Como alternativa, si imagina los números de línea y de columna (dos dimensiones) como referencia a una página impresa, podría tener una dimensión adicional para los números de página. Por supuesto, nos estamos refiriendo a matrices numéricas y por lo tanto, los elementos no serían caracteres impresos como en un libro, sino números. Piense en los elementos de una matriz tridimensional v, como estando especificados por v: número de página, número de línea, número de columna.

Por ejemplo, para establecer una matriz de dos dimensiones c con dimensiones 3 y 6, utilizará una sentencia DIM:

DIM c(3,6)

Con esta sentencia obtendrá 3 * 6 = 18 variables con subíndice.

c(1,1), c(1,2)..., c(1,6)
c(2,1), c(2,2)..., c(2,6)
c(3,1), c(3,2)..., c(3,6)

El mismo principio se aplica para cualquier número de dimensiones.

Aunque pueda tener un número y una matriz con el mismo nombre, no ocurre así con dos matrices, aun cuando éstas tengan distintos números de dimensiones.

Hay también matrices de cadenas. Las cadenas en una matriz se diferencian de las cadenas simples en que son de longitud fija y en que el modo de asignación es siempre "procusteano" (fragmentado o rellenado con espacios). Otra forma de considerarles es como matrices (con una dimensión adicional) de caracteres simples. El nombre de una matriz de cadena es una letra única seguida por $ y una matriz de cadena y una variable de cadena simple no pueden tener el mismo nombre (a diferencia con el caso de números).

Suponga, entonces, que quiere una matriz a$ de cinco cadenas. Debe decidir cuál será la longitud de estas cadenas. Supongamos que fuera suficiente una longitud de 10 caracteres en cada una. Teclee:

DIM a$(5,10)

con lo que obtendrá una matriz de 5 * 10 de caracteres, pero también puede considerar cada fila como una cadena:

a$(1) = a$(1,1) a$(1,2) ... a$(1,10)
a$(2) = a$(2,1) a$(2,2) ... a$(2,10)
    ·       ·     ·                 ·  ·                     ·
    ·       ·     ·                 ·  ·                     ·
a$(5) = a$(5,1) a$(5,2) ... a$(5,10)

Si da el mismo número de subíndices (dos, en este caso) como si hubiera dimensiones en la sentencia DIM; entonces obtendrá un carácter único; pero si omite el último, obtendrá una cadena de longitud fija. Así, por ejemplo, A$(2,7) es el 7° carácter en la cadena A$(2); con el empleo de la notación de fragmentación, podría escribirlo también como A$(2)(7). Ahora teclee:

LET a$(2) = "1234567890"

y

PRINT A$(2), a$(2,7)

Obtendrá:

1234567890 7

Para el último subíndice (el que puede omitir), también tener una forma de fragmentación, de modo que, por ejemplo, sea:

a$(2,4 TO 8) = a$(2)(4 TO 8) = "45678"

Recuerde:

En una matriz de cadena, todas las cadenas tienen la misma longitud fija. La sentencia DIM tiene un número adicional (el último) para especificar dicha longitud.

Cuando escriba una variable con subíndice para una matriz de cadena, puede introducir un número adicional, o elemento de fragmentación, para estar en correspondencia con el número adicional en la sentencia DIM.

Puede tener matrices de cadenas sin ninguna dimensión. Teclee:

DIM a$(10)

y encontrará que a$ se comporta casi como una variable de cadena, con la salvedad de que siempre tiene la longitud 10 y que la asignación es siempre "procrusteana".

Ejercicios

  1. Utilice las sentencias READ y DATA para establecer una matriz m$ de doce cadenas en las que m$(n) es el nombre del n-ésimo mes. (Sugerencia: La sentencia DIM será DIM m$(12,9). Pruébela imprimiendo todas las m$(n) (utilice un bucle)).

    Teclee:

    PRINT "En ";m$(3);" se celebran las Fallas"

    ¿Qué puedo hacer con todos esos espacios?


Manual de Basic Spectrum 48k.