jueves, 27 de noviembre de 2008

1.- ARRAYS

Un array permite referirse a una serie de elementos de un mismo tipo con un mismo nombre, haciendo referencia a un único elemento de la serie utilizando uno o más índices, como un vector o una matriz.

En Visual Basic se permiten definir arrays de variables de una o más dimensiones (hasta 60) y de cualquier tipo de datos. Además tiene la clase de arrays de controles (arrays de botones, de etiquetas, de paneles).

Los elementos de un array deben ser del mismo tipo y están almacenados de forma contigua en la memoria. Si el arrary es de tipo Variant cada elemento puede contener un dato de tipo diferente, e incluso puede contener otro array.

Entre los arrays de variables existen:

Arrays Estáticos: Su dimensión es siempre la misma y su declaración dependerá siempre de su ambito.

- La declaración de un array público se hace en la sección de declaraciones de un módulo utilizando la sentencia Public.

      Public cadena(1 To 12) As String
Este ejemplo declara un array de una dimensión, cadena, con doce elementos , cada uno de los cuales permite almacenar una cadena de caracteres.

- La declaración de un array a nivel del módulo o del formulario se hace en la sección de declaraciones del módulo o del formulario utilizando la sentencia Dim o Private.
      Dim vector (19) As Double
En este ejemplo se declara un array de una dimensión, llamado vector, con veinte elementos vector(0), vector(1),…,vector(19), cada uno de los cuales permite almacenar un Double.

La declaración de los arrays estáticos es bastante cómoda y se declaran una sola vez. Sin embargo tienen el inconveniente que en la mayoría de los casos están sobredimensionados y utilizan más memoria de la que realmente necesitan.

Arrays Dinámico: Su dimensión se puede modificar durante la ejecución del programa, este tipo de array puede ser redimensionado en cualquier momento de la ejecución. La mejor forma de redimensionar los arrays es mediante variables que contienen los valores adecuados.

Para crear un array dinámico primero hay que declararlo como si fuera un array estático, pero sin darle dimensión. Es decir se deja la lista entre paréntesis vacía sin ponerle ningún número y con la sentencia Public, si se quiere que sea global con Dim o Private.

Para asignar el número actual de elementos se utiliza la sentencia ReDim, esta sentencia puede aparecer solamente en un procedimiento y permite cambiar el número de elementos del array y sus límites inferior y superior, pero no el número de dimensiones, es decir, no se puede transformar un vector en una matriz.

Ejemplo:

Si se declara el array Matriz a nivel del formulario,
      Dim Matriz ( ) As Integer
Y luego en un procedimiento Calculo puede asignar espacio para el array:
       Sub Calculo ( )
….
ReDim Matriz(F, C)
….
End Sub
Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el array se pierden. Cuando se desee cambiar el tamaño del array conservando los valores del array, hay que ejecutar ReDim con la palabra Preserve.

      ReDim Preserve Matriz(F, C)

2.- NÚMEROS ALEATORIOS


La función que se usa para generar números aleatorios es: RND. Esta función devuelve un número que será mayor o igual a cero y menor que uno.

Ejemplo:
Private Sub Form_Load()
Show
Print Rnd * 30
End Sub
Muestra 21,16643. Si se ejecuta varias veces dará el mismo resultado, es decir:NO ES TAN ALEATORIO.

Para cambiar esta Falta de Aleatoriedad se usa Randomize seguido de un número:
Private Sub Form_Load()
Show
Randomize 5
Print Rnd * 30
End Sub
Ahora muestra 9,771772 todas las veces que se ejecute, ya que se esta colocando un numero fijo.

El Visual Basic proporciona una función que devuelve el número de segundos transcurridos desde la media noche (TIMER). Usando esta función se pueden generar números que serán casi aleatorios.

3.- LISTAS (ListBox)

Es un objeto que permite mostrar varios registros o líneas, teniendo uno o varios de ellos seleccionados, si el tamaño de la lista no permite mostrar todos los registros, se añade automáticamente un ScrollBars.

Para agregar o eliminar registros de la lista en modo de ejecución se utilizan los métodos AddItem y RemoveItem. Las listas se inicializan o declaran desde el evento Form_Load.

La propiedad List es un array que permite definir el contenido de la lista en modo de diseño utilizando la ventana de Propiedades.

Para declarar esta lista como un array se puede utilizar la siguiente instrucción a nivel de Form:
      Dim  List1(20) As Integer
List permite también acceder a los elementos de la lista en tiempo de ejecución, para utilizar y/o cambiar su valor. Para ello se coloca el índice del elemento entre paréntesis (empezando a contar por cero).

Añadir un registro: en tiempo de ejecución se utiliza AddItem:
      lstName.AddItem Registro_Añadido, posición
Donde posición es un argumento opcional que permite especificar la posición en que se debe añadir . Si se omite el registro se añade al final de la lista. Lo anterior es válido si la propiedad Stored esta en False , si está en True el nuevo registro se añade en la posición ordenada que le corresponde.

Eliminar un Registro: en tiempo de ejecución se utiliza Remove:
      lstName.RemoveItem Posición_delRegistro_en_la_lista
En caso de que se quiera vaciar completamente el contenido de una lista se puede utilizar el método Clear.

Para determinar el número total de registro en la lista se utiliza la propiedad ListCount.

ListIndex: se usa para acceder a una posición concreta de la lista, para añadir un registro nuevo en esa posición, borrar uno ya existente, seleccionarlo, etc.

PRÁCTICA - Números Aleatorios

1.- Hacer un programa que genere un número entre 1 y 100 e intentar adivinarlo. Si el número que se le da es mayor o menor, que el VB avise y si se acierta que lo comunique y finalice el programa.

Para que el VB Comunique

Para preguntarle el número y guardarlo en la variable N:

      N = Val(InputBox(“Escribe un número entre 1 y 100”))

El InputBox muestra una pantalla preguntando y devuelve lo que se escriba o una cadena vacía si se pulsa en cancelar. El Val convierte esta cadena en un número.
Para avisar que el número N introducido es menor o mayor:

       MsgBox “El número “ &CStr(N) & “es xxxx” 

Option Explicit
Private Sub Form_Load()
Dim n As Integer
Dim x As Integer

Randomize Timer
x = Int(Rnd * 100) + 1
Do
n = Val(InputBox$("Escribe un numero del 1 al 100"))
If n = x Then Exit Do
If n < x Then
MsgBox "El número " & CStr(n) & " es menor"
Else
MsgBox "El número " & CStr(n) & " es mayor"
End If
Loop
MsgBox "Lo has acertado"
End Sub
2.- Comprobar que el número introducido en el InputBox esté entre 1 y 100, en caso de que no sea así, volver a preguntar:

Option Explicit
Private Sub Form_Load()
Dim n As Integer
Dim x As Integer

Randomize Timer
x = Int(Rnd * 100) + 1
Do
Do
n = Val(InputBox$("Escribe un numero del 1 al 100"))
Loop While n < 1 Or n > 100
If n = x Then Exit Do
If n < x Then
MsgBox "El número " & CStr(n) & " es menor"
Else
MsgBox "El número " & CStr(n) & " es mayor"
End If
Loop
MsgBox "Lo has acertado"
End Sub
3.- Si se escribe CERO mostrar el número que el VB había “pensado” y terminar
Option Explicit
Private Sub Form_Load()
Dim n As Integer
Dim x As Integer

Randomize Timer
x = Int(Rnd * 100) + 1
Do
Do
n = Val(InputBox$("Escribe un numero del 1 al 100"))
If n = 0 Then
MsgBox "Mi número era el " & CStr(x)
Unload Me
End If
Loop While n < 1 Or n > 100
If n = x Then Exit Do
If n < x Then
MsgBox "El número " & CStr(n) & " es menor"
Else
MsgBox "El número " & CStr(n) & " es mayor"
End If
Loop
MsgBox "Lo has acertado"
End Sub
4.- Cuando se acierte el número indicar en cuantos aciertos se ha conseguido:
Option Explicit
Private Sub Form_Load()
Dim n As Integer
Dim x As Integer
Dim v As Integer

Randomize Timer
x = Int(Rnd * 100) + 1
Do
Do
n = Val(InputBox$("Escribe un numero del 1 al 100"))
If n = 0 Then
MsgBox "Mi número era el " & CStr(x)
Unload Me
End If
Loop While n < 1 Or n > 100
v = v + 1
If n = x Then Exit Do
If n < x Then
MsgBox "El número " & CStr(n) & " es menor"
Else
MsgBox "El número " & CStr(n) & " es mayor"
End If
Loop
MsgBox "Lo has acertado en " & CStr(v) & " veces"
End Sub
5.- Ahora al revés, es decir: que el usuario piense el número del 1 al 100 y el VB intente adivinarlo, para ello deberá mostrar un número y el usuario indicarle si lo ha acertado:
Option Explicit
Private Sub Form_Load()
Dim x As Integer
Dim v As Integer

Randomize Timer
Do
x = Int(Rnd * 100) + 1
v = v + 1
If MsgBox("Mi número es: " & CStr(x) & Chr$(13) & "¿He acertado", 4) = 6 Then
MsgBox "Lo he acertado en " & CStr(v) & " veces"
Exit Do
End If
Loop
End Sub
6.- Otro igual pero indicándole si el numero pensado por el usuario es Menor, Mayor o es Correcto…. habrá que darle las mismas oportunidades (este es el que tiene el truco del divide y vencerás….
Private Sub Form_Load()
Dim x As Integer
Dim v As Integer
Dim a As Integer
Dim z As Integer

a = 1
z = 100
' En este caso no se necesitan numeros aleatorios
Do
x = (z - a) / 2 + a
v = v + 1
If MsgBox("Mi número es: " & CStr(x) & Chr$(13) & "¿He acertado?", 4) = 6 Then
MsgBox "Lo he acertado en " & CStr(v) & " veces"
Exit Do
Else
If MsgBox("Entonces.... ¿ " & CStr(x) & " es mayor?", 4) = 6 Then
'El número del computador es mayor
'debe estar entre x-1 y a
z = x - 1
Else
'El número del computador es menor
'debe estar entre x+1 y z
a = x + 1
End If
End If
Loop

End Sub