Arrays

 Array (Matriz o colección de Variables de un mismo Tipo de Dato):




Uso de arrays


Nos puede interesar tener una colección de variables del mismo tipo. Por ejemplo las edades de 20 amigos. Para ello se usa la orden DIM:


DIM edad(20)


Este tipo de datos "agrupados" es lo que se suele conocer como un "array", una "matriz", un "vector" o un "arreglo".

Se accedería a la primera de las edades con órdenes como "PRINT edad(1)", y la última como "PRINT edad(20)".

Aquí hay otra peculiaridad que comentar: algunas versiones de BASIC empiezan a numerar en 0, de modo que el primer elemento sería "edad(0)" y el último sería "edad(19)". En algunas versiones, como QBasic, se puede especificar si queremos empezar a numerar desde 0 o desde 1, con la orden OPTION BASE 0 o con OPTION BASE 1, respectivamente.


Podemos pedir los valores de 10 numeros, guardarlos en un array y luego mostrarlos, haciendo:

10 DIM dato(10)

20 REM Pedimos datos

30 FOR i=1 TO 10

40   PRINT "Dime el dato ";i

50   INPUT dato(i)

60 NEXT i

70 REM Mostramos datos

80 FOR i=1 TO 10

90   PRINT dato(i)

100 NEXT i





En QBasic también podemos indicar los valores máximo y mínimo de los índices del array:

DIM edad(1 TO 20)

de modo que el programa anterior podría quedar

10 DIM dato(1 TO 10)

20 REM Pedimos datos

30 FOR i=1 TO 10

40   PRINT "Dime el dato ";i

50   INPUT dato(i)

60 NEXT i

70 REM Mostramos datos

80 FOR i=1 TO 10

90   PRINT dato(i)

100 NEXT i



Arrays multidimensionales

Y también se pueden usar "varias dimensiones". Por ejemplo, si tenemos 20 deportistas (o menos) participando en 5 competiciones distintas, podríamos guardar en un único "bloque de memoria" todas las puntuaciones obtenidas por ellos,haciendo:

DIM puntuacion(20, 5)

y accederíamos a la puntuación del deportista número 10 en la competición 3 escribiendo cosas como

PRINT puntuacion ( 10, 3 )

En las versiones más modernas de BASIC podremos usar más de dos dimensiones (quizá no en algunas versiones de los años 80), de modo que podríamos hacer cosas más elaboradas, como almacenar la puntuación de 20 personas en 7 competiciones, cada una de las cuales tiene 12 pruebas, y en las que cada prueba tiene un máximo de 3 intentos:

DIM puntuacion(20, 7, 12, 3)

Una versión ampliada del primer ejercicio, con un array bidimensional formado por tres bloques de 5 elementos cada uno, podría ser:

10 DIM dato(5,3)

20 REM Pedimos datos

30 FOR bloque=1 TO 3

40   FOR posicion=1 TO 5

50     PRINT "Dime el dato ";posicion; "del bloque ";bloque

60     INPUT dato(posicion, bloque)

70   NEXT posicion

80 NEXT bloque

90 REM Mostramos datos

100 FOR bloque=1 TO 3

110   FOR posicion=1 TO 5

120     PRINT dato(posicion, bloque)

130   NEXT posicion

140 NEXT bloque

(


Arrays de otros tipos de datos

Por supuesto, no sólo podemos guardar número enteros. Los arrays también se pueden usar para guardar otros tipos de variables. Por ejemplo, podemos guardar los nombres de esos 20 amigos (cadenas de caracteres) con

DIM nombre$(20)

o las estaturas de 20 personas, en metros (por lo que puede haber decimales decimales) forzando a que sean números reales, con

DIM estatura!(20)

o dejar claro que los datos van a ser números enteros con

DIM puntos%(20)

y en todas las partes del programa en las que usáramos la variable "puntos", debería aparecer terminada en el símbolo de porcentaje, así:

10 DIM puntos%(5)

20 REM Pedimos algunos datos

30 FOR i=1 TO 4

40   PRINT "Dime el dato ";i

50   INPUT puntos%(i)

60 NEXT i

70 REM Mostramos datos

80 PRINT "El segundo dato es ";puntos%(2)


Ejercicio propuesto 21.3.1: Crea un programa que pida al usuario 10 nombres y luego los muestre en orden contrario al que se introdujeron.

Ejercicio propuesto 21.3.2: Crea un programa que pida al usuario 8 números enteros y luego muestre el mayor de ellos (mira el ejercicio 21.1.5 si tienes dudas sobre cómo calcular el mayor).



 Valores predefinidos: READ, DATA, RESTORE.


Si declaramos una matriz con varios datos, como DIM edad(20), podríamos darles valores haciendo algo como

10 DIM edad(20) 

20 edad(1) = 15 : edad(2) = 16 : edad(3) = 15 : edad(4) = 14 

30 edad(5) = 15 : edad(6) = 15 : edad(7) = 14 : edad(8) = 16 

40 edad(9) = 16 : edad(10) = 16 : edad(11) = 15 : edad(12) = 15 

50 edad(13) = 14 : edad(14) = 14 : edad(15) = 15 : edad(16) = 16 

60 edad(17) = 15 : edad(18) = 15 : edad(19) = 17 : edad(20) = 15


pero esto es lento e incómodo. En su lugar, la mayoría de las versiones de BASIC incluyen la orden DATA, con la que se enumeran todos estos posibles valores, y la orden READ para leer dichos valores, de modo que podríamos conseguir el mismo efecto así:

10 DIM edad(20) 

20 DATA 15,16,15,14, 15,15,14,16, 16,16,15,15, 14,14,15,16, 15,15,17,15 

30 FOR i = 1 TO 20: READ edad(i): NEXT i


Si en un mismo programa tenemos muchas líneas DATA distintas, que usemos desde distintas partes del programa, podemos usar la orden RESTORE para indicarle desde qué línea queremos leer los datos cada vez que nos interese, así:

10 DIM edad(20) 

20 REM Datos de otro tipo 

30 DATA 1125, 2450 

40 RESTORE 70: REM Queremos leer las edades 

50 FOR i = 1 TO 20: READ edad(i): NEXT i 

60 REM Estos son los datos de las edades 

70 DATA 15,16,15,14, 15,15,14,16, 16,16,15,15, 14,14,15,16, 15,15,17,15