AnteriorPosterior

21. Varias variables del mismo tipo: Arrays

  Curso: Introducción a la programación en Basic, por Nacho Cabanes

21. Varias variables del mismo tipo: Arrays

21.1. Uso básico 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

(Fuente "2101.bas". Probado en Locomotive Basic de Amstrad CPC)

Ejercicio propuesto 21.1.1: Crea un programa que pida al usuario 10 números y luego los muestre en orden contrario al que se introdujeron.
Ejercicio propuesto 21.1.2: Crea un programa que pida al usuario 10 números y luego muestre su suma en una línea y, en otra línea, todos los datos que se habían introducido.
Ejercicio propuesto 21.1.3: Crea un programa que pida al usuario 10 números y luego calcule su media y muestre los que están por encima de la media.
Ejercicio propuesto 21.1.4: Crea un programa que pida al usuario 10 números y luego pregunte al usuario qué dato quiere buscar, y deberá decir si ese dato estaba entre los 10 iniciales o no.
Ejercicio propuesto 21.1.5: Crea un programa que pida al usuario 10 números y luego diga cuál es el mayor de los 10 (pista: toma el primer valor como "mayor provisional"; a partir de ahí, deberás comparar todos los demás valores con ese "mayor provisional"; si un valor es mayor que el "mayor provisional", ese deberá pasar a ser el nuevo "mayor provisional"; al terminar la pasada por todos los números, habrás obtenido el mayor de todos ellos).


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

(Fuente "2102.bas". Probado en QBasic 1.1)

21.2. 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

(Fuente "2103.bas". Probado en Locomotive Basic de Amstrad CPC)

Ejercicio propuesto 21.2.1: Crea un programa que pida al usuario 2 series de 6 números y luego los muestre la media de cada serie y la media global. Debes usar un array de 2 dimensiones.

21.3. 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)

(Fuente "2104.bas". Probado en Locomotive Basic de Amstrad CPC)

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).

21.4. 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

(Fuente "2105.bas". Probado en Locomotive Basic de Amstrad CPC)

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

(Fuente "2106.bas". Probado en Locomotive Basic de Amstrad CPC)

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 

(Fuente "2107.bas". Probado en Locomotive Basic de Amstrad CPC)

Ejercicio propuesto 21.4.1: Crea un programa que prepare un array que almacene la información sobre cuántos días tiene cada mes del año (suponiendo que febrero siempre tiene 28). El usuario introducirá un número de mes (por ejemplo, el 4 para referirse a "abril") y se le dirá cuantos días tiene ese mes.
Ejercicio propuesto 21.4.2: Crea un programa que prepare un array que almacene los nombres de los meses. El usuario introducirá un número de mes (por ejemplo, el 4) y se le dirá el nombre de ese mes (por ejemplo, "abril").
Ejercicio propuesto 21.4.3: A partir de la estructura del ejercicio 21.4.1, crea un programa que pida al usuario un día y un mes y le diga cual es el número de ese día dentro del año. Por ejemplo, el 5 de enero sería el día 5 del año, mientras que el 3 de febrero sería el día 34 del año.

Actualizado el: 08-01-2015 00:45

AnteriorPosterior