Matrices

Contenidos

 
  - Definición de matriz
- Declaración de una matriz
- Sentencia Dim
- Caja de texto multilínea
- Trabajar con el texto de la caja de texto Multilínea
- Interceptando la tecla pulsada
- Matrices estáticas
- Matrices dinámicas
- Sentencia Erase
- Sentencia Option Base
- Copiar una matriz en otra

Definición de matriz

Una matriz es un conjunto de elementos contiguos, todos del mismo tipo, que comparten un nombre común, a los que se puede acceder por la posición (índice) que ocupa cada uno de ellos dentro de la matriz.. Esta disposición permitirá escribir código más pequeño y simple, ya que se pueden establecer bucles mediante el número del índice. Cada elemento es una variable que puede contener un dato numérico o una cadena de caracteres, dependiendo esto del tipo de matriz. La representación de las matrices se hace mediante variables suscritas o de subíndices y pueden tener una o varias dimensiones. A las matrices de una dimensión se les llama también listas y a las de dos dimensiones tablas. En genera, se utiliza la denominación de matriz (array en inglés).

Desde el punto de vista matemático, en más de una ocasión necesitaremos representar variables como: A1 A2 A3 ... An

En general, se puede elegir como rango de valores para cada una de las dimensiones el que se desee.

Una matriz de dos dimensiones se representa con una variable con dos subíndices (filas, columnas); una matriz de tres dimensiones se representa con una variable con tres subíndices, etc. El máximo número de dimensiones para una matriz en Visual Basic es 60, aunque las más utilizadas son las de una, dos y tres dimensiones. Los índices de las matrices deben estar en el rango de -2 a la 31 a 2 a la 31 en versiones de 32 bits.

Para formar el nombre de una matriz y definir si ésta es numérica o de caracteres, se siguen las mismas reglas que para las variables. Por ejemplo:
    Dim a(24) as integer 'matriz entera unidimensional de 24 elementos
    Dim c(12, 5) as string 'matriz de caracteres de 2 dimensiones

En Visual Basic hay dos tipos de matrices: matrices estáticas que tiene siempre el mismo tamaño y matrices dinámicas cuyo tamaño cambia en tiempo de ejecución. Ambas serán estudiadas con con detalle en este mismo capítulo.

Declaración de una matriz

La declaración de una matriz especifica el nombre de la matriz, el número de elementos de la lista y el tipo de éstos. En función del número de dimensiones, distinguimos entre matrices unidimensionales y multidimensionales.

Sentencia Dim

La sentencia Dim, además de para declarar variables, se puede utilizar también para declarar matrices. Su sintaxis es:

Dim variable[(dims)][As tipo][variable[(dims)][as tipo]]...

variable es un identificador que nombra la matriz.

dims es una de expresiones numéricas, separadas por comas y que definen las dimensiones de una matriz. Esta lista puedeser de la forma siguiente:
[inferior to]superior[,[inferior to]superior]...
As tipo define el tipo de variable. Puede ser un tipo simple(integer, log, single, double, string, etc.) o un tipo definido por el usuario.

Por ejemplo, la siguiente línea de código define una matriz unidimensional llamada temp con subíndices definidos en el rango de 0 a 59. Esto es, los elementos de la matriz son: temp(0), temp(1), ..., temp(59). El limite inferior predeterminado es 0.
Dim temp(1 to 60) as string * 40
La sentencia siguiente declara una matriz bidimensional de 10 por 10 elementos de tipo Double:
Dim ma(9,9) as double

Se puede declarar una o ambas dimensiones con límites inferiores explícitos:
Dim mc(3, -4 to 5, 1 to 12)


La declaración anterior crea una matriz que tiene tres dimensiones. El tipo de cada elemento es Variant. El número total de elementos es el producto de los tamaños de las tres dimensiones(4*10*12); es decir, 480.

El espacio de almacenamiento total que necesita una matriz depende de su número de elementos y del tipo de cada elemento. Por lo tanto, hay que utilizar las matrices multidimensionales con sumo cuidado. También hay que tener especial cuidado on las matrices de tipo Variant, ya que este tipo de datos requiere más espacio de almacenamiento que los otros tipos de datos.

Cuando se ejecuta la sentencia dim, se asigna a todos los elementos de las matrices numéricas el valor 0, y a los elementos de las matrices de caracteres uma cadena de longitud ("") si se trata de cadenas de longitud variable, o bien se rellenan los nulos(ANSI 0) si se trata de cadenas de longitud fija.

La propiedad ToolTipText de un control almacena una descripción corta acerca de la función que desempeña dicho control.

Caja de texto multilínea

El aspecto y el comportammiento de una caja de texto está muy influenciado por dos propiedades, Multiline y ScrollBars, las cuales sólo pueden establecerse durante el diseño. La propiedad ScrollBars de una caja de texto no tiene que confundirse con el control scroll bar (barra de desplazamiento) que veremos más adelante.

Cuando la propiedad MultiLine de una caja de texto tiene un valor True, ésta permite escribir varias líneas de texto. Por omisión, esta propiedad tiene el valor False, lo que indica que la caja de texto sólo puede contener una línea.

Así mismo, la propiedad scrollBars permite dotar a la caja de texto con barras de texto horizontales o verticales. Por omisión esta propiedad tiene la propiedad un valor 0, lo cual indica que no tiene barras de desplazamiento. Un valor 1 añade a la caja de texto solamente la barra de texto horizontal, un valor 2 añade a la caja de texto solamente la barra de desplazamiento vertical y un valor 3 añade ambas barras de desplazamiento.

Guarde la aplicación con el nombre matriz1c y ejecútela. Pruebe a escribir texto, actúe bobre las barras de desplazamiento, modifique el texto, inserte texto y seleccione, borre y mueva bloques de texto. Como podrá comprobar, todas estas operaciones están implícitas sin escribir nada de código.

Si en una caja de texto multilínea no hay una barra de desplazamiento horizontal y una línea de texto alcanza el extremo derecho de la caja, ésta continúa automáticamente en la siguiente línea.

Cuando por software asigne texto a una caja de texto y necesite introducir un salto de línea, proceda como se indica a continuación. Por ejemplo, el procedimiento Form_Load que se escriba a continuación hace que se visualicen en la caja dos líneas de texto, "línea 01" y "línea 02".

   Private Sub Form_Load()
      Text1.Text="línea 01" & vbCrLf & "línea 02"
   End Sub

Trabajar con el texto de la caja de texto Multilínea

Como hemos dicho, Visual Basic dota automáticamente con capacidad de selección a las cajas de texto. Puede seleccionar texto utilizando el ratón o el teclado. Con el ratón apunte a al comienzo del texto a seleccionar y arrastre con el boton izquierdo del ratón pulsando hasta haber seleccionado todo el texto; con el teclado, sitúe el punto de inserción donde desea iniciar la selección y mantenimiento pulsada la tecla Mayús(Mayúscula) desplace el punto de inserción utilizando las teclas de desplazamiento.

Además de la capacidad de selección, las cajas de texto tienen una serie de propiedades que permiten trabajar con el texto seleccionado. Estas propiedades son SelStart, SelLength y SelText.

La propiedad SelStart es un entero (Long) que especifica la posición de comienzo del bloque de texto seleccionado. Si no hay texto seleccionado, entonces esta propiedad hace referencia al punto de inserción (cursor intermitente que marca la posición de escritura). Un valor cero especifica la posición justo antes del primer carácter de la caja de texto, y un valor igual a la longitud de texto especifica la posición justo después del último carácter de la caja de texto. Por ejemplo:
    Text1.SelStart=10

fija el punto de inserción en la posición 10 de la caja Text1 y

    pos = Text1.SelStart

devuelve la posición del punto de inserción.

La propiedad SelLength es un entero (Long) que especifica el número de caracteers seleccionados. Por ejemplo:
   Text1.SelLength=5

selecciona 5 caracteres a partir del punto de inserción en la caja Text1 y

   n = Text1.SelLength

devuelve el número de caracteres seleccionados.

La propiedad SelStart devuelve o establece una cadena de caracteres con el texto actualmete seleccionados. Si no hay texto seleccionado, su valor es una cadena de longitud cero. El ejemplo siguiente, muestra una forma rápida de añadir texto a una caja de texto multilínea sin necesidad de escribir el contenido de caja:

   Text1.SelStart=Len(Text1) ' situarse al final
   Text1.SelText = NuevoTexto ' añadir texto

Interceptando la tecla pulsada

Anteriormente vimos que cuando asignamos los contenidos de las cajas de texto Índice y ValorElemento a variables numéricas, Visual Basic convierte automáticamente dichos contenidos en valores numéricos, suponiendo lógicamente que los contenidos se correspondan con números.Pero ¿qué ocurre si el usuario introduce los caracteres que no pertenece a un valor numérico? Entonces se obtendría un error. Para evitarlo no queda otra solución que interceptar la tecla pulsada y desecharla en el caso de que el carácter correspondiente no sea adecuado.

Cada vez que el usuario pulsa una tecla, ocurren tres eventos sobre el objeto actualmente seleccionado (objeto sobre el que está el punto de inserción): KeyDown, KeyPress y KeyUp. El evento KeyPress se genera solamente cuando se introduce un carácter ASCII. Esta definición excluye teclas especiales, como teclas de función (F1 a F12), teclas de desplazamiento del cursor o las teclas de edición y retroceso.

El juego de caracteres ASCII incluye un subconjunto del conjunto de caracteres ANSI con el que trabajaVisual Basic. Los caracteres ANSII incluyen todos los caracteres imprimibles, las combinaciones Ctrl+(A-Z) y otros caracteres estándar, como Entrar (ASCII 13) y BackSpace (ASCII 8- retroceso). Para interceptar cualquier otra tecla o combinación de teclas que no produzcan un código ASCII, se utilizarán los eventos KeyDown y KeyUp.

Un procedimiento conducido por el evento KeyPress utiliza el argumento KeyAscii, que contiene el valor ASCII del carácter imprimible.Este valor puede ser convertido a un carácter utilizando la función Chr y puede ser comparado utilizando los operadores de relación (=,<,><=,>= y <>).

Otras funciones relacionadas con caracteres son: Asc(car), que devuelve ell valor ASCII del carácter car,y UCase(car), que convierte el carácter car a mayúsculas. Por ejemplo, el siguiente procedimiento convierte a mayúsculas el carácter tecleado sobre el objeto Text1.
   Private Sub Text1_KeyPress(KeyAscii as integer)
    Dim car as string *1 ' cadena de un solo caracter
    car = Chr(KeyAscii) ' convierte a caracter
    car = UCase(car) ' convierte a mayusculas
    KeyAscii = Asc(car)
   End Sub

El siguiente ejemplo demuestra como cancelar un carácter si no esta dentro del rango permitido. Este ejemplo impide a la caja de texto Text1 recibir cualquier carácter que no sea un dígito:
Private Sub Text1_KeyPress(KeyAscii as integer)
  Dim car as string *1 ' cadena de un solo caracter
  car = Chr(KeyAscii) ' convierte a caracter
  if car <"0"or car >"9" then ' si se encuentra entre 0 y 9
    KeyAscii = 0 ' cancela caracter
    Beep              'suena un beep
  End If
End Sub
End Sub
Cambiar KeyAscii a 0 acncela la pulsación de la tecla, de forma que el objeto, en este caso Text1, no recibe ningún carácter.

En ocasiones, pueden ser útil responder a estos eventos desde un procedimiento del formulario. Para ello es necesario que que dicho formulario reciba los eventos antes de que lo reciban los controles del mismo. Esto se consigue poniendo su propiedad KeyPreview a True.

Matrices estáticas

Para declarar una matriz estática (matriz con un número fijo de elementos), Visual Basic hace tres consideraciones importantes:

- Para declarar una matriz global, hágalo en la sección de declaraciones de un módulo utilizando la sentencia públic.
        Public temp(59) as integer
- Para declarar una matriz a nivel de módulo, hágalo en la sección declaraciones del módulo utilizando la sentencia Private o Dim.
        Private temp(59) as integer
- Para declarar una matriz local a un procedimiento, utilice la sentencia Dim o Static dentro del propio procedimiento.
       Dim temp(59) as integer

A diferencia de otras versiones de Basic, Visual Basic no permite declarar implicitamente una matriz.Una matriz tiene que ser declarada explicitamente, y los índices de la mismos deben estar en el rango -2 a la 31 a 2 a la 31. A continuación observaremos algunos ejemplos:

       Dim Matriz_A(19) as string

Este ejemplo declara una matriz de una dimensión, Matriz_A, con veinte elementos, Matriz_A(0), Matriz_A(1),...,Matriz_A(19), cada uno de los cuales permite almacenar una cadena de caracteres de longitud variable.

      Dim Matriz_B(3, 1 to 6) as integer

Este ejemplo declara una matriz de dos dimensiones, Matriz_B, con 4*6 elementos, Matriz_B(0,1) ,..., Matriz_B(3,6) de tipo entero.

      Static Matriz_C(1 to 5 to 1 to 5) as integer

Este ejemplo declara una matriz estática (Static) de dos dimensiones, Matriz_C, con 5*5 elementos, Matriz_C (1,1),..., Matriz_C(5,5), de tipo entero.

    Public Matriz_D(1 to 12) as string * 60

Este ejemplo declara una dimensión, Matriz_D,, con doce elmentos, Matriz_D(1) ,..., Matriz_D(12)cada uno de los cuale s permite almacenar una cadena de caracteres de longitud fija (60 caracteres).

Matrices dinámicas

Cuando las dimensiones de una matriz no son siempre las mismas, la mejor forma de especificarlas es mediante variables. Una matriz declarada de esta forma es una matriz dinámica. El espacio necesario para una matriz estática se asigna al iniciarse la aplicación y permanecerá fijo. En cambio, el espacio para una matriz dinámica será asignado durante la ejecución de la aplicación. Una matriz dinámica puede ser redimensionada en cualquier momento durante la ejecución. Para crear una matriz dinámica:

- Declare la matriz en la sección de declaraciones de módulo con una sentencia Public si se quiere global o con Private o Dim. Si la quiere al nivel del módulo, o en procedimiento con Static o Dim si la quiere local. Para especificar que la matriz va a ser dinámicadeje la lista de dimensiones vacía. Por ejemplo:

         Dim Matriz_A()

- Asigne un número actual de elementos con la sentencia ReDim. Se supone que N está definida previamente.

         ReDim Matriz_A(N + 1)

La sentencia Redim puede aparecer solamente en un procedimeinto y permite cambiar el número de elementos de la matriz, no el número de dimensiones. Sin embargo, no puede declarar un a matriz de un tipo de datos y luego usar ReDim para cambiar la matriz a otro tipo de datos.
Por ejemplo, si declaramos la matriz Matriz_A a nivel de un módulo,
        Private Matriz_A() as integer
más tarde, un procedimiento cálculo puede asignar espacio para la matriz, como se indica a continuación:
        Sub Cálculo()
             Dim F as integer, C as integer
               ...
             ReDim Matriz_A(F,C)
               ...
        End Sub

        Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en la matriz se pierden. Visual Basic restablece los valores del valor Empty en matrices Variant, a cero en matrices numéricas, a una cadena de longitud cero en matrices de cadenas, o a Nothing en matrices de objetos. Cuando le interese cambiar el tamaño de la matriz conservando los valores de la misma los valores de la misma, ejecute ReDim con la palabra clave Preserve. Por ejemplo, supongamos la matriz A de dos dimensiones. La sentencia:

        ReDim Preserve A(D1, UBound(A, 2) + 2)

       Incrementa el tamaño de la matriz multidimensional, sólo se puede cambiar el límite superior de la última dimensión. Cualquier otro intento produce un error. Evidentemente, si se disminuye el tamaño de la matriz hay una perdida parcial de los datos.

Sentencia Erase

Para matrices estáticas, Erase asigna cero a cada elemento de las matrices numéricas y nulo ("") a cada elemento de las matrices de caracteres.
Para matrices dinámicas, Erase libera el espacio de memoria utilizado por las matrices. Para utilizar de nuevo cualquiera de ellas , es necesario de nuevo declarar las dimensiones de la matriz utilizando ReDim o Dim.
      Erase nombre_de_la_matriz[,nombre_de_la_matriz]...
Cuando se dispone de poco espacio de memoria, resulta útil la sentencia Erase para borrar las matrices dinámicas que ya no van a ser utilizadas. Erase también puede utilizarse cuando deseamos redimensionar matrices en una aplicación. Por ejemplo:
      Dim b() as integer
      n = 10: m = 20
      Dim a(100) as integer
      ReDim b(n, m)
        ...
      Erase a,b 'poner a 0 la matriz a y liberar la memoria de b
      ReDim b(5, 5) 'redimensionar la matriz b

Sentencia Option Base

Se utiliza en el nivel del módulo para definir el límite inferior predeterminado para los subíndices de una matriz. Su sintaxis es:

       Option Base n

donde n es una expresión entera de valor 0 o 1.

El valor predeterminado es 0.Esta sentencia debe ejecutarse antes de definir cualquier matriz y no se puede utilizar dentro de un procedimiento. Por ejemplo:
      Option Base 1
      Private Sub Form_Load()
          Dim a(100) as integer 'matriz de 100 elementos: a(1) ... a(100)
          a(1) = 10
           ...
     End Sub

Este ejemplo crea una matriz numérica unidimensional llamada a con 100 elementos, a(1) ... a(100).

No obstante, la cláusula To en las instrucciones Dim, Private, Public, ReDim y Static proporciona una forma mas flexiblede controlar los límites inferior y superior de cada dimensión de una matriz.

Copiar una matriz en otra

No existe una función predefinida que permita copiar una matriz en otra. Por lo tanto, para realizar esta operación tendremos que añadir a nuestra aplicación el código correspondiente.

Es posible asignar el contenido completo de una matriz a otra matriz, siempre y cuando la matriz del lado izquierdo de la asignación sea una matriz dinámica. Las matrices estáticas solo pueden aparecer a la derecha de la asignación. Según esto, puede sustituirse la rutina de copiar matriz del ejemplo anterior por:
   x= m

<<Menú Inicio