You are on page 1of 8

7.

ARRAYS
INTRODUCCIÓN
Un array es una estructura de datos que contiene distintos valores del mismo tipo
asociada a un identificador. Para acceder a un elemento individual de una tabla
utilizando su posición entera, que recibe el nombre de índice.
Un array puede tener 1 o más dimensiones (hasta 60) y cada dimensión tiene un límite
inferior que siempre es 0 y un límite superior que se corresponde al tamaño de la
dimensión del array menos 1.
Las tablas permiten el acceso aleatorio. Los elementos de una tabla ocupan posiciones
de memoria contiguas, lo que significa que un programa puede acceder con la misma
rapidez a todos los elementos de una tabla.

Índice entero 0 Índice entero 4


(cero) (cuatro)
Un elemento es un valor de Array. La longitud de Array es el número total de
elementos que puede contener. El rango de Array es el número de dimensiones de
Array.

DECLARACIÓN
Para declarar un array debemos utilizar un identificador y encerrados entre paréntesis,
se debe indicar las dimensiones de que va a constar. Los arrays se pueden declarar de
muchas formas pues se puede indicar o no el tamaño de cada dimensión, inicializar o no
sus valores. A continuación vemos la sintaxis correspondiente

Sintaxis:
Dim <nombreArray>([IndiceMayorDim1],[IndiceMayorDim2]…)
As <Tipo de Dato>[=<Valores>]
En una tabla definida como Dim tabla(3) existen 4 elementos, pues el número que se
incluye entre paréntesis es el índice mayor y éstos comienzan en 0.
Se pueden asignar valores en el momento de la declaración sólo en el caso de que no se
especifique los índices. En el caso de más de una dimensión se considera que el array
tiene el mismo número de filas y columnas a la hora de inicializar los valores.

Visual Basic .Net | 0BARRAYS 1


A continuación se muestran varios ejemplos de declaraciones de array correctas e
incorrectas.
Dim edades() As Byte={18,20,25,27} ‘correcto
Dim datos(,) As Integer={{2,3},{4,5}} ‘correcto

Dim datos(2,2) As Integer={{2,3},{4,5}} ‘error, no puede tener el dato del índice mayor
Dim datos(,) As Integer={{2,3},{4,5,5}} ‘error, no puede tener <> nº de filas y columnas

Ejemplos:
‘Se define un array de 31 y 11 posiciones
Dim alumnos(30),cursos(10) As String
‘No se determina el tamaño
Dim notas() As Double
Dim edades() As Byte={18,20,25,27}
Dim sueldos( , ) As Decimal ‘2 dimensiones

ACCESO A LOS ELEMENTOS


Para acceder a un elemento de una tabla de rango 1 se utiliza un índice entero.
matriz(3)
Para acceder a un elemento de una tabla de rango 2 se utilizan dos índices enteros
separados por una coma.
matriz(1,2)
Los índices de una tabla (de cualquier rango) se cuentan desde cero. Así, para acceder al
primer elemento de una fila se usa la expresión:
fila(0)
en lugar de:
fila(1)
Contar los índices desde 0 significa que el último elemento de una tabla con tamaño
elementos se encuentra en (tamaño -1) y no en (tamaño).
El acceso a cada uno de los elementos del array puede utilizarse para lectura o escritura
de los mismo.

Visual Basic .Net | 0BARRAYS 2


Si se quiere recorrer todos los elementos de un array se puede utilizar For…Next o For
Each…Next. En el caso del uso del For Each funciona de la misma manera para una o
para más dimensiones.

Ejemplo
Sub Main()
' array con 4 elementos: de 0 a 3
Dim ciudades(3) As String
Dim elemento As String
Dim i As Integer

' asignar valores al array


ciudades(0) = "Budapest"
ciudades(1) = "París"
ciudades(2) = "Lisboa"
ciudades(3) = "Amsterdam"

' obtener valores de un array


Dim ciudadA As String
Dim ciudadB As String
ciudadA = ciudades(1) ' París
ciudadB = ciudades(3) ' Amsterdam

' mostrar los valores obtenidos del array


Console.WriteLine("Variables: ciudadd: {0}, ciudadB:{1}", _
ciudadA, ciudadB)

' mostrar todos los valores del array


' uso de For Each
For Each elemento In ciudades
Console.WriteLine(elemento)
Next
Console.WriteLine()
' uso de for
For i = 0 To ciudades.Length - 1
Console.WriteLine(ciudades(i))
Next
Console.ReadLine()
End Sub

REDIMENSIÓN DE ARRAYS
Los arrays en .net son de tamaño variable. Cada vez que se cambia de tamaño un array ,
el entorno destruye internamente el array actual y crea un nuevo objeto con el mismo
nombre.
Puede utilizar la instrucción ReDimy para cambiar el tamaño de una o más dimensiones
de una matriz que ya se ha declarado. Si dispone de una matriz grande y ya no necesita
algunos de sus elementos, ReDimy puede reducir el tamaño de la matriz para liberar
memoria. Por otra parte, si el código determina que una matriz necesita más elementos,
ReDimy puede agregarlos.

Visual Basic .Net | 0BARRAYS 3


Sintaxis:
ReDim [Preserve] < nombreArray >([Tamaño])As<tipo de Dato>[<=valores>]
Cada vez que se utiliza ReDim se borran los valores previos del array, así que para
evitar este problema se debe utilizar la palabra clave Preserve.

Ejemplo:
Sub Main()
‘Se define el array
Dim i, miArray(5) As Integer

'Introduce valores en el array. UBound contiene el índice mayor del array


For i = 0 To UBound(miArray)
miArray(i) = i
Next i

'Redimensiona el array
ReDim Preserve miArray(7)

‘Asignación de valores en las nuevas posiciones


For i = 5 To miArray.Length – 1 'Length contiene el tamaño del array
miArray(i) = i
Next

'Se muestran el contenido del array


For Each i In miArray
Console.WriteLine(i)
Next
Console.ReadLine()
End Sub
En el caso de que no se le haya indicado el tamaño a un array en el momento de su
declaración, antes de usar el objeto creado debe asignársele un tamaño utilizando la
instrucción ReDim. En caso de que se quiera utilizar un array en el que no se ha
especificado su tamaño se produciría una excepción del tipo NullReferenceException
‘Se define el array sin tamaño
Dim i, miArray() As Integer
‘La siguiente instrucción da error pues el array no tiene tamaño
miArray(0)=3
‘Se le asigna un tamaño al array para poder ser utilizado
Redim miArray(5)

PROPIEDADES
En realidad, todas las tablas que definamos, sea cual sea el tipo de elementos que
contengan, son objetos que derivan de System.Array. Es decir, van a disponer de todos
los miembros que se han definido para esta clase, entre los que son destacables:
• Length: Campo de sólo lectura que informa del número total de elementos
que contiene la tabla. Si la tabla tiene más de una dimensión indica el
número de elementos de todas sus dimensiones y niveles. Por ejemplo:
Visual Basic .Net | 0BARRAYS 4
Dim tabla1(3) As Integer
Dim tabla2(4,5) As Integer

Console.WriteLine(tabla1.Length); ‘Imprime 4
Console.WriteLine(tabla2.Length); ‘Imprime 30
• Rank: Campo de sólo lectura que almacena el número de dimensiones de
la tabla. Obviamente si la tabla no es multidimensional valdrá 1. Por
ejemplo:
Dim tabla1(3) As Integer
Dim tabla2(4,5) As Integer

Console.WriteLine(tabla1.Rank); ‘Imprime 1
Console.WriteLine(tabla3.Rank); ‘Imprime 2

MÉTODOS
La clase System.Array (que utilizan implícitamente todas las tablas) contiene muchos
métodos que se pueden utilizar para trabajar con tablas. Este tema describe los métodos
empleados más frecuentemente.
• Sort. Este método efectúa una ordenación en contexto de la tabla pasada
como argumento.
Dim tabla () As Integer= {4,6,3,8,9,3} ‘Sin ordenar
System.Array.Sort (tabla) ‘Ordenada
• Clear. Este método cambia el valor de un rango de elementos de la tabla a
cero (para tipos de valor) o Nothing (para tipos de referencia), como en este
ejemplo:
Dim tabla () As Integer = {4,6,3,8,9,3}
‘pone a 0 3 elementos a partir de la posición 2
System.Array.Clear (tabla, 2, 3)
• Clone. Este método crea una nueva tabla cuyos elementos son copias de los
elementos de la tabla original.
Dim data() As Integer = {4, 6, 3, 8, 9, 3}
Dim miClon() As Integer
miClon = data.Clone()
El método Clone realiza una copia superficial. Si la tabla copiada contiene
referencias a objetos, se copiarán las referencias pero no lo objetos; las dos
tablas apuntarán a los mismos objetos.
• GetLength. Calcula el número de elementos que contiene una dimensión
del array
Dim tabla (4,5) As Integer
‘muestra la longitud de la dimensión primera que es 5
tabla.GetLength(0)
‘muestra la longitud de la dimensión segunda que es 6
tabla.GetLength(1)
• IndexOf. Este método devuelve el índice entero de la primera vez que
aparece un valor pasado como argumento, o –1 si el valor no está presente.

Visual Basic .Net | 0BARRAYS 5


Sólo se puede utilizar en tablas unidimensionales. El siguiente es un
ejemplo:
Dim tabla () As Integer ={4,6,3,8,9,3}
Dim numero As integer
numero=System.Array.IndexOf(tabla,9) ‘devuelve 4
• Reverse. Este método ordena de forma inversa en contenido de la tabla.
Dim tabla () As Integer = {4,6,3,8,9,3} ‘tabla sin ordenar
System.Array.Reverse (tabla) ‘tabla ordenada de mayor a menor

DEVOLUCIÓN DE ARRAYS DESDE FUNCIONES


Los arrays pueden ser devueltos por llamadas a funciones como cualquier otra variable.

Ejemplo
Sub Main()
Dim miArray() As Integer
miArray = CrearArray(5)
For Each i In miArray
Console.WriteLine(i)
Next
Console.ReadLine()
End Sub

Function CrearArray(ByVal tamaño As Integer) As Integer()


Dim creada(tamaño) As Integer
Dim i As Integer
For i = 0 To tamaño
creada(i) = 5 * i
Next
Return creada
End Function

PASO DE TABLAS COMO PARÁMETROS


Cuando se pasa una variable de tabla como argumento para un método, el parámetro del
método pasa a ser una copia del argumento de la variable de tabla. Tanto el argumento
de tabla como el parámetro de tabla apuntan a la misma tabla.

Visual Basic .Net | 0BARRAYS 6


Sub Main()
Dim miArray(5) As Integer
DarValor(miArray)
For Each i In miArray
Console.WriteLine(i)
Next
Console.ReadLine()
End Sub

Sub DarValor(ByRef tabla As Integer())


For i = 0 To tabla.Length - 1
tabla(i) = 5 * i
Next
End Sub
Cuando se pasa una variable de tabla no se crea una copia profunda de la tabla, lo que
hace que pasar una tabla como parámetro sea muy rápido. Esta copia superficial es más
que suficiente si se quiere que un método tenga acceso de escritura a la tabla del
argumento.

PRÁCTICAS
1) Hacer un programa que sume dos matrices de enteros de 2 dimensiones y la muestre
por pantalla en dos dimensiones.
a) Hacer un método para pedir la dimensión de las matrices
b) Hacer un métodos para introducir los datos de las dos matrices (un métodos
llamado dos veces).
c) Hacer un método para sumar las matrices
d) Hacer un método para mostrar el resultado.
2) Se desea calcular las notas finales de los alumnos de un curso, así como también el
promedio, mínimo y máximo de éstas. Se introducirá el número de alumnos de un curso
y las notas parciales de cada uno de éstos junto con la nota del examen final. La nota
final de cada alumno se calculará en función de la siguiente fórmula:
NM= (P1+P2+P3+P4)/4 // Media de los exámenes parciales
NF=0.7*NM+0.3*EX //Cálculo de la nota final: nota media y examen
Se desea saber al final la nota media de todas las notas finales, la máxima y la
mínima.
3) Construir la siguiente aplicación
a) Declarar una estructura de tipo Persona que contenga la siguiente información:
nombre, apellidos, edad, DNI
b) Declarar un array que almacene la estructura anterior por medio de un método
que nos dice el tamaño en tiempo de ejecución
c) Implementar un método para introducir los datos.
d) Implementar un método para ordenar la matriz por edad.
Método de ordenación de la burbuja.

Visual Basic .Net | 0BARRAYS 7


Los pasos a seguir utilizando este método son los siguientes, imaginando que deseamos
realizar una ordenación creciente:
1.- Se compara el primer elemento con el segundo. Si están desordenados se intercambian.
Luego se mira el segundo con el tercero, intercambiando también si es necesario. Así hasta
que llegamos al último elemento. De esta forma tenemos en la última posición de nuestra
tabla el elemento más grande.
2.- Repetimos lo mismo que antes pero ahora con todos los elemento, menos el último, que
ya está ordenado.
3.- Repetimos el primer paso pero esta vez con otro elemento menos, ya que este también
está ordenado. Este método finaliza en el momento en el que se han realizado tantas pasadas
como objetos - 1 hay en la lista. Su hace menos 1 pasadas porque el primero de los objetos,
como es lógico si pensamos que los demás ya están ordenados, ya está ordenado
e) Implementar un método para mostrar los datos que contiene el array.

Visual Basic .Net | 0BARRAYS 8

You might also like