Fecha y hora actual: Jueves 17 Ene 2019 05:41
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Curso VB .NET - Tema 1.34 - Arrays, VB 2005

Responder al Tema

Índice del Foro > Visual Basic .NET > Curso VB .NET - Tema 1.34 - Arrays, VB 2005

Autor Mensaje
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3200
Ubicación: Valencia - España

Mensaje Publicado: Viernes 23 Oct 2009 11:05

Título del mensaje: Curso VB .NET - Tema 1.34 - Arrays, VB 2005

Responder citando

Curso de programación en .NET - Tema 1.34 - Arrays, Visual Studio 2005


1. Arrays, VB.
1.1 Objetivos del tema.

Hecha la introducción a los arrays en el tema anterior, toca ahora su visión desde Java, las distintas acciones que se pueden llevar a cabo con ellos y su utilización.

1.2 Introducción.
Los arrays, también se pueden conocer como vectores, cuando son de una sola dimensión y como matrices cuando son de más de una dimensión.



El ejemplo superior es un vector de 7 elementos, un array de una dimensión.
En este otro ejemplo, es una matriz de dos dimensiones, 3 x 3, un array de dos dimensiones.



Hasta ahora en las estructuras de datos hemos visto que utilizamos variables para almacenar cada uno de los datos que se utilizan en un programa.

Pero en algunas ocasiones, en un programa es necesario guardar muchos datos que en su conjunto pueden tener el mismo nombre, por ejemplo podríamos 3 columnas guardar el nombre de un mes, y podríamos llamar a la variable NombreMes, pero también tenemos que tener presente que para asignarle el nombre, tendríamos que hacer antes un sin fin de sentencias condicionales hasta localizar la que coincida el nombre del mes con el de la fecha.

Código:
if mes = 1 then
      nombremes = "Enero"
   else if mes = 2 then
      nombremes = "Febrero"
   ' ... / ...


o bien
Código:
Select Case Mes
   Case 1
      nombremes = "Enero"
   case 2
      nombremes = "Febrero"
   case 3
      nombremes = "Marzo"
   ' ... / ...
End Select


Por supuesto es válido, porque funciona, pero existe una alternativa mucho más cómoda a la solución anterior, y es crear un array de doce elementos en el que almacenamos el nombre de todos los meses y luego para hacer referencia al que nos interesa utilizamos la variable del ejemplo anterior como índice, y quedaría algo parecido a lo siguiente.

Código:
' Declaración e inicialización del vector con los
' nombres de los meses, de tipo string
Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}
Dim mes as Integer = 1
Console.writeln(NomMeses[mes])


Y si probamos éste ejemplo, veremos como el resultado es que el mes es Febrero, sí, porque la primera posición del array es cero y es el mes de Enero, y al índice que es la variable "mes", le hemos dado el valor uno, que es la posición del mes de "Febrero".

Los arrays son direccionables, no hay que buscar un elemento para utilizarlo, si es que conoces su dirección, por el contrario, en según que acciones son mucho más lentos que las listas.
Las listas no son direccionables, para utilizar un elemento hay que llegar a él, hay que buscarlo.
Las listas son unas estructuras dinámicas en cuanto a su tamaño, los arrays por principio no, aunque en muchos lenguajes se dispone de instrucciones para cambiar su tamaño en tiempo de ejecución.

En cuanto a la discrepancia entre listas o arrays, es una historia absurda, lo adecuado es tener claro el funcionamiento de ambas estructuras y utilizarlas cada una en el momento adecuado, pero para ello hay que tener un criterio abierto, o no hay que cerrarse en banda, igual que con los lenguajes de programación.
Pero si que hay que tener claro que no tiene sentido implementar una lista con un array.

1.3 Declaración
Cuando declaramos un vector
Código:
Dim V(11) as String


Este vector tiene en realidad doce elementos, que van desde el cero hasta el once, en total doce.
Hay varias formas de declarar un vector en VB.

  • Podemos declararlo de forma estática.
  • Podemos declarar e inicializar.
  • Podemos declarar de forma dinámica.


1.3.1 Declaración estática.
La declaración estática es la de siempre.
Código:
Dim Meses(11) as String

Meses(0) = "Enero"
Meses(1) = "Febrero"
Meses(2) = "Marzo" .. / ..


Pero si se ha de cargar dentro del programa con datos, no tiene sentido. Si se carga después desde un archivo o por teclado, si.

1.3.2 Declaración estática inicializada.
Código:
' Declaración e inicialización del vector con los
' nombres de los meses, de tipo string
Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}


1.3.3 Declaración dinámica.
Para cuando la dimensión del array depende de la ejecución del programa.
Código:
Module Ejemplo
  Sub Main()
     Dim Valor As String
    ' Declaración e inicialización
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}
   
    ' Declaración dinámica
    Dim OtrosMeses() As String
    ' En esta línea nos dará Nothing, no hay asignación todavía
    Console.WriteLine("Tipo del vector {0} ", TypeName(OtrosMeses))
   
    ' Asignación de dimensión
    ReDim Otrosmeses(Meses.GetUpperBound(0))
    ' Aquí el resultado será String
    Console.WriteLine("Tipo del vector {0} ", TypeName(OtrosMeses))
    Console.WriteLine("Visualizamos el contenido ")
   
    ' Copia de meses sobre otros meses
    Meses.CopyTo(OtrosMeses, 0)
    ' Visualización del vector
   
    For Each Valor In OtrosMeses
       Console.WriteLine(Valor)
    Next
   
    Console.WriteLine("Elementos del vector {0} ", OtrosMeses.GetLength(0))
    Console.WriteLine("Primer índice {0} ", OtrosMeses.GetLowerBound(0))
    Console.WriteLine("Ultimo índice {0} ", OtrosMeses.GetUpperBound(0))
    Console.WriteLine("Visualizamos el contenido ")
    Console.ReadLine()
  End Sub
End Module


1.4 Recorrido.
Para recorrer el vector podemos usar cualquiera de los dos sistemas, el de recorrerlo como una colección.
Código:
Module Ejemplo
  Sub Main()
    ' Declaración e inicialización del vector con los
    ' nombres de los meses, de tipo string
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
   
    ' Declaramos la variable del mismo tipo para poder
    ' recorrer el vector
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido")
   
    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


Pero también se puede seguir haciendo lo clásico, con la función Ubound, aunque ahora también hay un método del objeto Meses, que se llama GetUpperBound.
Y también podemos utilizar los siguientes métodos, en lugar del X=0 to 11, o to Ubound(meses)

Código:
For X=Meses.GetLowerBound(0) To Meses.GetUpperBound(0)


O bien
Código:
For X = 0 To UBound(Meses)


Código:
Module Ejemplo
  Sub Main()
    ' Declaración e inicialización del vector con los
    ' nombres de los meses, de tipo string
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim X As Int16
    Dim Valor As String
   
    Console.WriteLine("Visualizamos el contenido")
   
    ' Mostramos lo valores
    For X = 0 To UBound(Meses)
       Console.WriteLine(Meses(X))
    Next
   
    For X=Meses.GetLowerBound(0) To Meses.GetUpperBound(0)
       Console.WriteLine(Meses(X).ToString)
    Next
    Console.ReadLine()
  End Sub
End Module


Visto como se recorre el vector, veamos como se hace con una matriz, o un array de dos dimensiones.
Como principio, hay que indicar que una matriz necesita para recorrerse tantos contadores como dimensiones tiene, es decir tres dimensiones, tres contadores.

En el ejemplo utilizamos una matriz de dos dimensiones.
Veamos primero como cargar datos, usando una generación aleatoria de números.
Código:
Module Ejemplo
  Sub Main()
    ' Declaración e inicialización
    Dim M(3, 4) As Integer ' veinte elementos
    Dim X As Integer
    Dim Y As Integer
    Randomize() ' inicializar el generador de números aleatorios
   
    ' generar la matriz
    X=0
    Do
       Y=0
       Do
          M(X, Y) = CInt(Int((6 * Rnd()) + 1))
          Y=Y+1
        Loop Until Y > UBound(M, 2)
       X=X+1
    Loop Until X > UBound(M, 1)
  End Sub
End Module


Una vez cargada la matriz para que tenga datos, vemos el uso completo carga y visualización.
Código:
Module Ejemplo
  Sub Main()
    ' Declaración
    Dim M(3, 4) As Integer ' veinte elementos 4 x 5
    Dim X As Integer
    Dim Y As Integer
    Randomize() ' inicializar el generador de números aleatorios

    ' generar la matriz
    X=0
    Do
       Y=0
       Do
          M(X, Y) = CInt(Int((6 * Rnd()) + 1))
          Y=Y+1
       Loop Until Y > UBound(M, 2) ' columnas
       X=X+1
       Console.WriteLine()
    Loop Until X > UBound(M, 1) ' filas
 
    Console.WriteLine("Visualizamos el contenido")
 
    ' Mostramos lo valores
    X=0
    Do
       Y=0
       Do
          Console.WriteLine("Fila {0} Columna {1} Valor {2} ", X, Y, M(X, Y))
          ' Console.Write(" " & M(X, Y))
          Y=Y+1
       Loop Until Y > UBound(M, 2) ' columnas
       X=X+1
       Console.WriteLine()
    Loop Until X > UBound(M, 1) ' filas
  End Sub
End Module


En principio ésta es una forma de recorrer la matriz sin colocar en las condiciones del bucle el número de filas o de columnas de la matriz, que suele ser el formato normal, igual que se ha hecho para recorrer el vector podemos hacer con una matriz.
Código:
Loop Until Y > UBound(M, 1) ' filas


para las filas, la primera dimensión, 1.
Código:
Loop Until Y > UBound(M, 2) ' columnas


para las columnas, la segunda dimensión, 2.
De ésta forma el bucle se ejecutará correctamente siempre independientemente del número de elementos del array.

Evidentemente la sintaxis que sigue también es correcta.
Código:
while (y < 5)
   Loop Until Y > 5


En los ejemplos, por costumbre, se ha recorrido la matriz por filas, pero no hay nada que impida que se recorra por columnas. El siguiente es un sencillo ejemplo de clase. Muy mejorable, pero fácil de entender.
Código:
Public Class ClaseVectores
  Dim V() As Integer
 
  ' Es una variable inicializada, pero no es una propiedad
  Private ValorMaximo As Integer = 100
  Private Sub New()
     ' Impedimos que se declare sin recibir el vector en el constructor, new.
  End Sub
 
  Public Sub New(ByVal W() As Integer)
     ReDim V(W.Length) ' se obliga a recibir un vector en el new.
     V=W
  End Sub
 
  Public Sub GeneraVector()
     Randomize()
     Dim X As Integer
     While (X) < UBound(V)
        V(X) = CInt(Int((ValorMaximo * Rnd()) + 1))
        X=X+1
     End While
  End Sub
 
  Public Sub VerVector()
     Dim X As Integer
     While X < UBound(V)
        Console.WriteLine("Elemento número {0} valor {1} ", X, V(X))
        X=X+1
     End While
  End Sub
End Class


En la clase se ha recibido el vector en la inicialización del objeto, por lo que no es necesario recibirlo como argumento a la hora de visualizarlo.

Pero se podía haber hecho lo siguiente.
Código:
Public Class ClaseVectores
   Public V() As Integer ' declaramos public el vector


Pero lo lógico entonces sería anular ésta sobrecarga.
Código:
Public Sub New(ByVal W() As Integer)
   ReDim V(W.Length) ' se obliga a recibir un vector en el new.
   V=W
End Sub


Y entonces el método VerVector sería como sigue.
Código:
Public Sub VerVector(ByVal V() As Integer)
   Dim X As Integer
   While X < UBound(V)
      Console.WriteLine("Elemento número {0} valor {1} ", X, V(X))
      X=X+1
   End While
End Sub


Obligamos a que nos envíen el vector en el método.
Y todo esto se utiliza como sigue, para el primer formato:
Código:
Private Sub Ejemplo()
   Dim V(10) As Integer
   Dim Objeto As New ClaseVector(V)
   Objeto.GeneraVector()
   Objeto.VerVector()
   Console.ReadKey()
End Sub


O bien si elegimos la opción de no inicializar el objeto enviando el vector
Código:
Private Sub Ejemplo()
   Dim V(10) As Integer
   Dim Objeto As New ClaseVector()
   Objeto.GeneraVector(V)
   Objeto.VerVector(V)
   Console.ReadKey()
End Sub


Esta es otra de las posibilidades para recorrer un vector, utilizándolo como si fuera una colección.
Es un bucle del tipo For, pero en el que se incorpora la sintaxis del tipo "para cada elemento del objeto recorre todos sus elementos". Aquí en éste caso el elemento es del tipo entero y el objeto es un vector.
Código:
Dim X As Integer
For Each X In V
   Console.Write(X)
Next


1.5 Operaciones.
La existencia de las estructuras de datos, arrays o listas, tiene como fin el resolver problemas a la hora de desarrollar programas, por lo tanto su misión es la de almacenar datos u objetos, y la de localizarlos o acceder a ellos posteriormente.

Por lo tanto un array tiene distintos tipos de operaciones.
La principal acceder a los datos. Hay que recalcar que un vector o matriz permiten el acceso a sus datos de manera inmediata, sin necesidad de realizar búsquedas, lo cual es muy práctico en muchas ocasiones.

Pero no siempre es posible estructurar los datos de forma que se pueda acceder cómodamente y en algunas ocasiones hay que realizar búsquedas.
En otros momentos los datos en un array, no pueden guardarse de forma adecuada, y es necesario realizar operaciones de clasificación para obtenerlos en la forma adecuada o que nos interesa para el programa.

1.5.1 Acceso.
El acceso, si los datos están adecuadamente utilizados, es directo sin necesidad de realizar una búsqueda.
En el siguiente ejemplo, no es necesario buscar un elemento, delante del mes de Enero, hay un valor nulo, de forma que toma el índice cero y así Enero es el índice uno.
Código:
Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre","Octubre", "Noviembre", "Diciembre"}


Sabemos que el mes de Enero es el número uno en el año, Febrero el dos, etc..
Por lo tanto podemos perfectamente, sin necesidad de buscar el dato, hacer lo siguiente.
Código:
Console.Writeln(NomMeses(mes))


Siendo "mes" una variable que contiene el mes de la fecha con la que trabajamos.
Pero como siempre eso no es posible, a veces hay que buscar la información.

1.5.2 Copia.
Una de las acciones posibles es la copia del contenido de un vector sobre otro. Para ello en VB disponemos del método Copy, que lo realiza con comodidad. La sintaxis de éste método es la siguiente
Código:
Meses.Copy(Meses, OtrosMeses, OtrosMeses.GetUpperBound(0))


Donde:
  • Meses --> Es el origen
  • OtrosMeses --> Es el destino
  • OtrosMeses.GetUpperBound(0) --> El número de elementos que deseamos copiar


OtrosMeses.GetUpperBound(0) lo utilizamos para indicar cuantos elementos deseamos copiar, ya que nos devuelve el número de elementos que tiene el vector de destino.

Existe otra alternativa que es Clone, a diferencia de Clone, Copy hace un duplicado del vector, solo del número de elementos que se indica en el argumento.
El programa podría quedar como sigue:
Código:
Private Sub Copia()
  Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
  "Mayo", "Junio", "Julio", "Agosto", _
  "Septiembre","Octubre", "Noviembre", "Diciembre"}

  ' Le damos cinco elementos
  Dim OtrosMeses(5) As String
  Dim Valor As String
  Console.WriteLine("Visualizamos el contenido ")
  Console.WriteLine("Elementos del vector {0} ", Meses.Length)

  ' Visualizamos el vector
  For Each Valor In Meses
     Console.WriteLine(Valor)
  Next

  ' Copiamos el vector
  Meses.Copy(Meses, OtrosMeses, OtrosMeses.GetUpperBound(0))
  Console.WriteLine("Elementos vector {0} ", OtrosMeses.Length)
  Console.WriteLine("Visualizamos el contenido ")

  ' Visualizamos el vector
  For Each Valor In OtrosMeses
     Console.WriteLine(Valor)
  Next
  Console.ReadLine()
End Sub


1.5.3 Clasificación.
Con las búsquedas sucede lo mismo, hay distintos tipos de algoritmos, unos más eficientes y otros menos, y como siempre depende del momento y lo que hay que hacer.

Como ejemplo exponemos un método de clasificación, el de la burbuja, el menos eficiente, pero el más fácil de recordar, a partir de ahí, a mejorar.

A la clase anterior le podemos añadir éste método, y podremos desde el main visualizar el vector ordenado.
Código:
Public Sub OrdenaVectorAscendente()
  Dim Y As Integer
  Dim Fin As Integer = V.Length
  Dim Aux As Integer

  While Fin > 0
     Y=0
     ' cada pasada se reduce en uno el
     ' número de elementos a comprobar
     Fin = Fin -1
     ' el mayor, en cada pasada se lleva al final del vector.
     While (Y < Fin)
        ' comprobar si es mayor que el siguiente
        If (V(Y) > V(Y + 1)) Then
           ' intercambio, cuando es mayor
           Aux = V(Y)
           V(Y) = V(Y + 1)
           V(Y + 1) = Aux
        End If
        Y = Y + 1 ' incremento
     End While
  End While
End Sub


En función de cómo guste más la clase, el inicio del método puede ser como se ha visto o como sigue, public Sub OrdenaVectorAscendente(ByRef V() as Integer) ' se recibe el vector.

Todo depende de que método de inicialización se haya dejado. Y en el principal del programa queda
Código:
Sub Main() ' No hay ni generación ni envío del vector.
  Dim Objeto As New ClaseVector(10)

  Objeto.GeneraVector()
  Objeto.VerVector()
  Objeto.OrdenaVectorAscendente()
  Objeto.VerVector()
  Console.ReadKey()
End Sub


Pero si hemos usado la otra opción ...
Código:
Sub Main() ' Si que hay generación y envío del vector.
  Dim V(10) as Integer
  Dim Objeto As New ClaseVector()

  Objeto.GeneraVector(V)
  Objeto.VerVector(V)
  Objeto.OrdenaVectorAscendente(V)
  Objeto.VerVector(V)
  Console.ReadKey()
End Sub


Expliquemos las diferencias
Código:
Sub Main() ' No hay ni generación ni envío del vector.
   Dim Objeto As New ClaseVector(10) ' Se crea en la clase, y está en la clase
   Objeto.GeneraVector()


entre estas dos opciones de crear una clase en un programa.
Código:
Sub Main() ' Si que hay generación y envío del vector.
   Dim V(10) as Integer ' Se crea en el programa y se envía a la clase
   Dim Objeto As New ClaseVector()
   Objeto.GeneraVector(V)


Cuando hemos anulado la declaración del objeto con el envío del vector, la clase no tiene el vector en su poder, por decirlo de alguna forma, por lo que si queremos visualizar el vector, se lo hemos de enviar, la clase solo sabe del vector que recibe, por que no tiene ninguno.

Por lo tanto el método de ordenación, al igual que el de visualización, debe recibir el vector.
¿Pero que sucede?, si lo ordena, lo lógico es que lo devuelva, si no, para que sirve, por eso de ahí viene el cambio sintáctico de la utilización del método.

La diferencia entre un sistema y el otro es
Código:
public Sub OrdenaVectorAscendente() ' no se recibe el vector.


Primer ejemplo.
    Se crea el objeto y se indica cuantos elementos ha de tener.
    El vector está en el objeto.
    Se visualiza, lo que hay en el objeto.
    Se ordena, lo que hay en el objeto.


Código:
' se recibe y se devuelve el vector una vez ordenado.
public Sub OrdenaVectorAscendente(ByRef V() as Integer)


Segundo ejemplo.
    Se crea el vector.
    Se crea el objeto, pero no se le pasa nada.
    El vector solo está en el programa principal.
    Al usar el método VerVector hay que enviarle el vector que ha de visualizarse.
    Al usarse el método OrdenaVectorAscendente, como no hay vector en el objeto hay que enviarlo.
    Y además lo recibimos ordenado para otros usos posteriores, como es el visualizarlo ordenado.


En pocas palabras el vector va y viene de un lado para otro.
Pero se puede enfocar de muchas otras formas.

1.5.4 Búsqueda.
La búsqueda no es más que la utilización de una estructura repetitiva para recorrer el array y localizar el contenido que buscamos.
Existen distintos tipos de búsquedas, unas más eficientes que otras, aplicar una u otra solo dependerá del volumen de datos a utilizar, y de las necesidades en tiempos de respuesta.

Casi siempre es necesario tener el vector ordenado, por cuestiones de eficiencia.
La búsqueda solo es necesaria cuando no es posible establecer una relación entre el dato y su posición como es el caso de los meses del año, los días de la semana, etc..

Hay una búsqueda muy lógica y sencilla, que es leer el vector hasta que se encuentra o hasta el final.
Código:
Public Function BuscarDato(ByVal Que) As Integer
   Dim X As Integer = 0
   Dim Pos As Integer = -1 ' si no se encuentra devuelve -1
   While X < V.Length And Pos < 0
      If V(X) = Que Then Pos = X ' localizado y se asigna la posición
         X = X + 1 ' incremento
   End While
   BuscarDato = Pos ' si no se ha encontrado devolverá -1
End Function


Este es el método que se puede añadir a la clase anterior para realizar la búsqueda, si lo encuentra devuelve la posición y en caso contrario devuelve un valor negativo.

Poco eficiente y mejorable, si se le envía el vector ordenado.
Hay otras más eficientes, pero no es el fin de este tema.

El main para ésta opción sería el siguiente.
Código:
Sub Main()
  Dim Objeto As New ClaseVector(10)
  Dim Posic As Integer

  Objeto.GeneraVector()
  Objeto.VerVector()
  Posic = Objeto.BuscarDato(25)

  Select Case Posic
     Case Is > 0
        Console.WriteLine("Encontrado en la pósición {0} ", Posic)
     Case Else
        Console.WriteLine("No existe ")
  End Select

  Console.ReadKey()
End Sub


1.5.5 Invertir.
Otra de las posibles operaciones con un array, es la de invertir el contenido del mismo, ponerlo del revés.



Para ello creamos un bucle con dos contadores uno ascendente y otro descendente.
Podemos añadir el siguiente método a la clase.
Código:
Public Sub Inversion()
   Dim W(V.Length -1) As Integer
   Dim X As Integer
   Dim Y As Integer
   
  X=0
   Y = V.Length -1
   
  While X < V.Length
      W(Y) = V(X)
      X=X+1
      Y=Y-1
   End While
   
  V=W
End Sub


El main para ésta opción sería el siguiente.
Código:
Sub Main()
  Dim Objeto As New ClaseVector(10)
  Dim Posic As Integer

  Objeto.GeneraVector()
  Objeto.VerVector()
  Objeto.Inversion()
  Objeto.VerVector()
  Console.ReadKey()
End Sub


Pero para ello también podemos utilizar uno de los tipos de colecciones vistos anteriormente.
Código:
Public Sub Inversion()
  Dim X As Integer
  ' definir la pila.
  Dim Pila As New System.Collections.Stack
 
  ' volcado del vector a la pila
  x=0
  While X < V.Length
     ' Introdución del contenido en la pila
     Pila.Push(V(X))
     X=X+1
  End While
 
  ' recuperación del contenido de la pila sobre el vector.
  x=0
  While Pila.Count <> 0
     ' extracción de un elemento de la pila
     V(X) = Pila.Pop()
     x=x+1
  End While
End Sub


Y utilizarla como lo que internamente implementa la colección, que es una pila. El principal quedaría igual que antes.

1.6 Métodos.
Hemos visto una serie de acciones que son las clásicas en un array.
Pero disponemos de una serie de métodos en VB que realizan algunas de esas tareas, vamos a nombrarlos para que se sepa de su existencia.
    Clear --> Limpia el contenido del array
    Clone --> Duplica el contenido
    Copy --> Copia un vector, o parte de él.
    GetLength --> Indica el número de elementos.
    GetLowerUbound --> Indica la primera posición
    GetUpperUbound --> Indica la última posición.
    GetType
    GetValue --> Devuelve un elemento
    IndexOf, LastIndexOf --> Indica la posición de un valor
    Reverse --> Invierte
    Sort --> Clasifica

Vamos a ver la utilidad de cada uno de los métodos existentes en cada una de las dos clases.

1.6.1 Clear
Siguiendo con el ejemplo anterior, el método Clear realiza el vaciado del contenido del vector, pero no del número de elementos, que seguirá siendo el mismo.
Código:
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido antes ")
   
    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.WriteLine("Elementos del vector {0} ", Meses.Length)

    ' Vaciado del vector
    Meses.Clear(Meses, 0, Meses.Length)
    Console.WriteLine("Visualizamos el contenido después ")
    Console.WriteLine("Elementos del vector {0} ", Meses.length)

    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(" [{0}]", Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.2 Clone
Este método lo que hace es generar una copia de un array ya existente.
Código:
Module Ejemplo
   Sub Main()
      Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
      "Mayo", "Junio", "Julio", "Agosto", _
      "Septiembre","Octubre", "Noviembre", "Diciembre"}
      Dim OtrosMeses() As String
      Dim Valor As String
      Console.WriteLine("Visualizamos el contenido ")
      Console.WriteLine("Elementos del vector {0} ", Meses.GetUpperBound(0))

      ' Visualizamos el vector
      For Each Valor In Meses
         Console.WriteLine(Valor)
      Next
   
     ' Clonamos el vector
      OtrosMeses = Meses.Clone()
      Console.WriteLine("Elementos vector {0} ", OtrosMeses.GetUpperBound(0))
      Console.WriteLine("Visualizamos el contenido ")
      
    ' Visualizamos el vector
      For Each Valor In OtrosMeses
         Console.WriteLine(Valor)
      Next
      Console.ReadLine()
   End Sub
End Module


1.6.3 ConstrainedCopy
Copia el número de elementos indicado de un array de origen a un array de destino, en la dimensión que se indica, y del número de elementos que se indique.
Código:
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}
    Dim Mesesitos(3) As String
    Dim Dato As String
    Dim DimOrigen As Integer = 0
    Dim DimDestino As Integer = 0
    Dim Cuantos As Integer = 2 ' probar con 2 y 4

    ' Contenido vector origen
    For Each Dato In Meses
       Console.WriteLine(Dato)
    Next

    ' Copia contenido de un vector en otro
    Array.ConstrainedCopy(Meses, DimOrigen, Mesesitos, DimDestino, Cuantos)

    ' Contenido vector destino
    Console.WriteLine("Visualizar el vector de destino")
    For Each Dato In Mesesitos
       Console.WriteLine("Mes de {0} ", Dato)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.4 Copy
A diferencia de Clone, Copy hace un duplicado del vector, solo del número de elementos que se indica en el argumento.
Código:
' Copia solo el número de elementos indicado,
' OtrosMeses.GetUpperBound(0) vale 5, que es el número de elementos que tiene
' Meses es el origen,
' OtrosMeses es el destino
' Meses.Copy(Meses, OtrosMeses, OtrosMeses.GetUpperBound(0))
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}

    ' Le damos cinco elementos
    Dim OtrosMeses(5) As String
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Console.WriteLine("Elementos del vector {0} ", Meses.GetUpperBound(0))

    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
 
    ' Copia solo el número de elementos indicado,
    ' OtrosMeses.GetUpperBound(0) vale 5, que es el número de elementos que tiene
    ' Meses es el origen, OtrosMeses es el destino
    Meses.Copy(Meses, OtrosMeses, OtrosMeses.GetUpperBound(0))
    Console.WriteLine("Elementos vector {0} ", OtrosMeses.GetUpperBound(0))
    Console.WriteLine("Visualizamos el contenido ")

    ' Visualizamos el vector
    For Each Valor In OtrosMeses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.5 CopyTo
Realiza la copia del Vector de origen sobre el de destino, colocando los datos a partir de la posición que se indica, se ha de controlar que hay espacio en el vector de destino.
Código:
   ' Se copia el vector Meses completo y se coloca
   ' a partir de la sexta posición en el vector de
   ' destino OtrosMeses
   Meses.CopyTo(OtrosMeses, 6)
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}

    ' Le damos 20 elementos
    Dim OtrosMeses(20) As String
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Console.WriteLine("Elementos del vector {0} ", Meses.GetUpperBound(0))

    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
 
    ' Se copia el vector Meses completo y se coloca
    ' a partir de la sexta posición en el vector de
    ' destino OtrosMeses
    Meses.CopyTo(OtrosMeses, 6)
    Console.WriteLine("Elementos del vector {0} ", OtrosMeses.GetUpperBound(0))
    Console.WriteLine("Visualizamos el contenido ")
 
    ' Visualizamos el vector
    For Each Valor In OtrosMeses
       Console.WriteLine("[ {0} ]", Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.6 CreateInstance
Crea un array a partir de la información existente en el array de origen.

Observar que en este ejemplo está activado Option Strict a Off, sin comentarios.
Código:
Option Strict Off
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}
    Dim Dato As String

    ' Contenido vector origen
    For Each Dato In Meses
       Console.WriteLine(Dato)
    Next
 
    ' Crear el vector con createinstance
    ' Dim Otro = Array.CreateInstance(Meses.GetType, Meses.Length)
    ' El formato anterior, aunque parece lógico no sirve.
    Dim Otro = Array.CreateInstance(GetType(String), Meses.Length)
 
    ' Cargarlo con datos
    Meses.CopyTo(Otro, 0)
 
    ' Contenido vector destino
    Console.WriteLine("Visualizar el vector de destino")
    For Each Dato In Otro
       Console.WriteLine("Mes de {0} ", Dato)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.7 GetLength, GetLowerBound, GetUpperBound
Estos métodos devuelven el número de elementos del vector, el primer índice y el último.
Código:
Module Ejemplo
  Sub Main()
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}
    Console.WriteLine("Visualizamos el contenido ")
    Console.WriteLine("Elementos del vector {0} ", Meses.GetLength(0))

    ' Visualizamos el vector
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next

    Console.WriteLine("Elementos del vector {0} ", Meses.GetLength(0))' 12
    Console.WriteLine("Primer índice {0} ", Meses.GetLowerBound(0))' 0
    Console.WriteLine("Ultimo índice {0} ", Meses.GetUpperBound(0))' 11
    Console.ReadLine()
  End Sub
End Module


1.6.8 GetType
Devuelve el tipo que tiene el array dentro de la clase System
Código:
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Console.WriteLine(Meses.GetType)
   
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.9 GetValue
Devuelve el contenido de la posición que indicamos en el argumento.

En el ejemplo el valor devuelto es Abril.
Pero también es válido y da también Abril.
Código:
Console.WritelLine(Meses(3))
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Console.WriteLine(Meses.GetValue(3))

    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.10 Búsqueda, IndexOf, LastIndexOf
Devuelve la posición de la primera, IndexOf, o de la última, LastIndexOf, vez que aparece el elemento indicado en el argumento.

En el ejemplo el resultado es 1 y 7.
Código:
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Febrero", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine(Meses.IndexOf(Meses, "Febrero")) ' 1
    Console.WriteLine(Meses.LastIndexOf(Meses, "Febrero")) ' 7
    Console.WriteLine("Visualizamos el contenido ")
   
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.11 Rank
Devuelve el número de dimensiones de un array.
Código:
Console.WriteLine("Meses tiene {0} dimensiones ", Meses.Rank)


1.6.12 Reverse
Invierte el contenido actual del vector.
Código:
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Meses.Reverse(Meses)
    [Array].Reverse(Meses) ' se queda como estaba

    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.13 SetValue
Establece un valor nuevo para el elemento que se indica, en el ejemplo sustituimos Noviembre por Juan.
Código:
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", _
    "Abril", "Mayo", "Junio", _
    "Julio", "Agosto", "Septiembre", _
    "Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Meses.SetValue("Juan", 10)
   
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.6.14 Sort
Este método lo que hace es clasificar el vector, que evidentemente siempre se agradece.

Hay dos sistemas en el ejemplo,
Código:
[Array].Sort(Meses)


En este se usa la clase genérica Array para usar sus métodos.
Código:
Meses.Sort(Meses)


Aquí se usa el vector, con el método sort.
Como se puede comprobar cualquiera de los dos es válido.
Código:
Module Ejemplo
  Sub Main()
    Dim X As Int16
    Dim Meses() As String = {"Enero", "Febrero", "Marzo", "Abril", _
    "Mayo", "Junio", "Julio", "Agosto", _
    "Septiembre","Octubre", "Noviembre", "Diciembre"}
    Dim Valor As String
    Console.WriteLine("Visualizamos el contenido ")
    Meses.Sort(Meses)
    [Array].Sort(Meses)
   
    For Each Valor In Meses
       Console.WriteLine(Valor)
    Next
    Console.ReadLine()
  End Sub
End Module


1.7 Ejercicios propuestos.
1. Crear un vector de 10 elementos numéricos enteros, cargarlo con datos y visualizar su contenido.
2. Crear un vector de 10 elementos alfanuméricos, cargarlo con datos y visualizar el contenido de los que están ocupando la posición par.
3. Crear una matriz de 3 x 3 numérica, cargar los datos y visualizarla dando la visión de matriz.
4. Crear una matriz de 3 x 3 numérica, cargar los datos, intercambiar los datos de la 1 fila con la tercera fila, y visualizarla dando la visión de matriz.
5. Tenemos un Vector V de cincuenta elementos, generar un vector P de cincuenta elementos de forma que:
Código:
P(1) = V(1)
P(2) = V(1)+V(2)
P(3) = V(1)+V(2)+V(3) .. / ..
P(50) = V(1) ...V(50)

6. Introducir diez números y luego visualizarlos en orden inverso, al de entrada.
7. Introducir veinte números entre uno y cincuenta, y luego indicar cuales de esos cincuenta son los que se han utilizado.
8. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados y el numero de veces que se ha usado cada numero.
9. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados, el numero de veces que se ha usado cada numero, y el que más y el que menos se ha utilizado.
10. Introducir una fecha en tres variables, numéricas, día, mes y año. A esa fecha hay que sumarle 90 días reales, y visualizar la fecha resultante en el formato dia_en_letra de mes_en_letra de 20XX.

1.8 Soluciones a los ejercicios propuestos.
Para la solución de los ejercicios se ha creado una clase en la que se admite que se pueda crear el vector fuera de la clase y la reciba como argumento o en caso contrario se crea un vector por defecto de veinte elementos.
Código:
Public Class Vectores
  Dim V() As Long
  Dim Cuantos As Integer = 20
  Private Sub New() ' se genera un vector por defecto
     ReDim V(Cuantos)
   End Sub

  ' Sobrecarga para un número determinado de elementos
   Public Sub New(ByVal Elementos As Integer)
    Select Case Elementos <> 0
      Case True
        ReDim V(Elementos)
      Case Else
        MsgBox("El número de elementos no es correcto", MsgBoxStyle.Critical)
    End Select
 
    Cuantos = Elementos
  End Sub
End Class


Para facilitar la prueba de los ejercicios se ha creado un método que genera valores aleatorios de forma automática.
Código:
Public Sub Genera()
  Dim X As Integer
 
  ' Inicializa el generador de números aleatorios
  Randomize()
  While X <> V.Length
     ' Genera un valor aleatorio entre 1 0 50
     V(X) = CInt(Int((50 * Rnd()) + 1))
     X=X+1
  End While


El control de los bucles se podría haber realizado con
Código:
While X <> V.Length


O bien con
Código:
While X <= Ubound(V)


El método Length devuelve un cual es el número de elementos del vector.
La función Ubound devuelve cual es el valor del índice del último elemento del vector.
    Para un DIM V(10)
    Length devuelve once.
    Ubound(V) devuelve diez.


1. Crear un vector de 10 elementos numéricos enteros, cargarlo con datos y visualizar su contenido.
Código:
Public Class Vectores
  Dim V() As Long
  Dim Cuantos As Integer = 20
  Private Sub New() ' se genera un vector por defecto
     ReDim V(Cuantos)
  End Sub
 
  ' Sobrecarga para un número determinado de elementos
  Public Sub New(ByVal Elementos As Integer)
     Select Case Elementos <> 0
        Case True
           ReDim V(Elementos)
        Case Else
           MsgBox("El número de elementos no es correcto", MsgBoxStyle.Critical)
     End Select
     Cuantos = Elementos
  End Sub

  Public Sub Genera()
     Dim X As Integer
     ' Inicializa el generador de números aleatorios
     Randomize()
     While X <> V.Length
        ' Genera un valor aleatorio entre 1 0 50
        V(X) = CInt(Int((50 * Rnd()) + 1))
        X=X+1
     End While
  End Sub
 
  Public Sub Visualiza()
     Dim X As Integer
     While X <> V.Length
        Console.WriteLine("Posición {0} Contenido {1}", X, V(X))
        X=X+1
     End While
  End Sub
End class


El programa principal.
Código:
Module Tema_34
   Sub Main()
      Dim Objeto As Vectores = New Vectores(10)
      Objeto.Genera()
      Objeto.Visualiza()
      Console.Read()
   End Sub
End Module


2. Crear un vector de 10 elementos alfanuméricos, cargarlo con datos y visualizar el contenido de los que están ocupando la posición par.
A la clase anterior añadimos el método que se puede ver en la solución.
Código:
Public Sub VisualizaPosicion(ByVal PosicionMultiplo As Integer)
  Dim X As Integer
 
  While X <> V.Length
     Select Case X Mod PosicionMultiplo = 0
        Case True
           Console.WriteLine("Posición {0} Contenido {1}", X, V(X))
     End Select
     X=X+1
  End While
End Sub


Al hacer está pregunta, podemos visualizar cualquier posición múltiplo de un valor x, y si su valor es uno, visualiza todos los elementos del array.
El programa principal
Código:
Module Tema_34
  Sub Main()
    Dim Objeto As Vectores = New Vectores(10)
    Objeto.Genera()
    Objeto.VisualizaPosicion(2)
    Console.Read()
  End Sub
End Module


3. Crear una matriz de 3 x 3 numérica, cargar los datos y visualizarla dando la visión de matriz.
Código:
Private Sub GeneraMatriz(ByVal M(,) As Integer)
  Dim X As Integer
  Dim Y As Integer
  Dim Filas As Integer = UBound(M, 1) ' M.GetLength(0) ' M.GetUpperBound(0)
  Dim Columnas As Integer = UBound(M, 2) ' M.GetLength(1) ' M.GetUpperBound(1)
  Randomize() ' inicializar el generador de números aleatorios

  ' generar la matriz
  X=0
  Do
     Y=0
     Do
        M(X, Y) = CInt(Int((6 * Rnd()) + 1))
        Y=Y+1
     Loop Until Y > Columnas ' M.GetUpperBound(1) ' UBound(M, 2)
     X=X+1
  Loop Until X > Filas ' M.GetUpperBound(0) ' Ubound(M, 1)
End Sub

Private Sub VisualizaMatrizDetalle(ByVal M(,) As Integer)
  Dim X As Integer
  Dim Y As Integer
  Dim Filas As Integer = UBound(M, 1)
  Dim Columnas As Integer = UBound(M, 2)
  Console.WriteLine("Visualizamos el contenido")

  ' Mostramos lo valores en detalle
  X=0
  Do
    Y=0
    Do
      Console.WriteLine("Fila {0} Columna {1} Valor {2} ", X, Y, M(X, Y))
      Y=Y+1
    Loop Until Y > Columnas
    X=X+1
    Console.WriteLine()
  Loop Until X > Filas
End Sub

Private Sub VisualizaMatriz(ByVal M(,) As Integer)
  Dim X As Integer
  Dim Y As Integer
  Dim Filas As Integer = UBound(M, 1)
  Dim Columnas As Integer = UBound(M, 2)

  ' Mostramos lo valores
  X=0
   Do
     Y=0
     Do
        Console.Write(" " & M(X, Y))
        Y=Y+1
     Loop Until Y > Columnas
     X=X+1
     Console.WriteLine()
  Loop Until X > Filas
End Sub


El programa principal sería
Código:
Module Tema_34
  Private Sub Main()
    ' Declaración e inicialización
    Dim M(2, 2) As Integer
    GeneraMatriz(M)
    VisualizaMatrizDetalle(M)
    VisualizaMatriz(M)
    Console.ReadLine()
  End Sub
End Module


4. Crear una matriz de 3 x 3 numérica, cargar los datos, intercambiar los datos de la 1 fila con la tercera fila, y visualizarla dando la visión de matriz.
Código:
Private Sub Intercambio(ByVal M(,) As Integer, ByVal F1 As Integer, ByVal F2 As Integer)
   Dim Y As Integer
   Dim Columnas As Integer = UBound(M, 2)
   Dim Aux As Integer
   ' Intercambio
   Y=0
   Do
      Aux = M(F2, Y)
      M(F2, Y) = M(F1, Y)
      M(F1, Y) = Aux
      Y=Y+1
   Loop Until Y > Columnas
   Console.WriteLine()
End Sub


El programa principal sería
Código:
Module Tema_34
   Private Sub Main()
      ' Declaración e inicialización
      Dim M(2, 2) As Integer
      GeneraMatriz(M)
      VisualizaMatriz(M)
      Intercambio (M,0,2)
      VisualizaMatriz(M)
      Console.ReadLine()
   End Sub
End Module


5. Tenemos un Vector V de cincuenta elementos, generar un vector P de cincuenta elementos de forma que:
Código:
P(1) = V(1)
P(2) = V(1)+V(2)
P(3) = V(1)+V(2)+V(3) .. / ..
P(50) = V(1) ...V(50)


A la clase anterior le podemos añadir este método
Código:
Public Sub Quinto(ByVal P() As Integer)
   ReDim P(V.Length -1)
   Dim X As Integer
   X=1
   P(0) = V(0)
   While X < V.Length
      P(X) = P(X -1) + V(X)
      X=X+1
   End While
   V=P
End Sub


Como cada elemento es la suma del anterior más el nuevo, empezamos en la posición uno, pero hay que :
Código:
P(0) = V(0)


Para disponer de anterior.
Código:
P(X) = P(X -1) + V(X)


Al final de la ejecución asignamos el nuevo vector al de la clase, así podemos utilizar los métodos ya escritos.
Código:
V=P


El programa principal sería:
Código:
Sub Main()
   Dim Objeto As New Vectores(10)
   Dim P(10) As Integer
   Objeto.GeneraVector()
   Objeto.VerVector()
   Objeto.Quinto(P)
   Objeto.VerVector()
   Console.ReadKey()
End Sub


6. Introducir diez números y luego visualizarlos en orden inverso, al de entrada. A la clase anterior podemos añadir el siguiente método.
Código:
Public Sub VisualizaInverso()
   Dim X As Integer = V.Length
   While X > 0
      X=X-1
      Console.WriteLine(V(X))
   End While
End Sub


Y el Main quedaría
Código:
Sub Main()
   Dim Objeto As New Vectores(10)
   Dim P(10) As Integer
   Objeto.GeneraVector()
   Objeto.VerVector()
   Objeto.VisualizaInverso()
   Objeto.VerVector()
   Console.ReadKey()
End Sub


7. Introducir veinte números entre uno y cincuenta, y luego indicar cuales de esos cincuenta son los que se han utilizado.
Podemos resolver el ejercicio con este procedimiento.
El vector a utilizar es del tipo bolean, solo nos piden cuales han sido usados.
Código:
Sub Main()
   Dim V(51) As Boolean
   Dim X As Integer
   Dim Numero As Integer
   
  ' Carga de números
   While X < 20
      Numero = CInt(Console.ReadLine)
      Select Case Numero
         Case 1 To 50
            V(Numero) = True
      End Select
      X=X+1
   End While
   ' Visualizar números
   X=0
   While X < 51
      Select Case V(X)
         Case True
            Console.WriteLine("El número {0} ha sido utilizado ", X)
      End Select
      X=X+1
   End While
End Sub


8. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados y el numero de veces que se ha usado cada numero.
Este ejercicio es igual que el anterior, pero en lugar de visualizar cuales además pide cuantas veces, pero el cambio es mínimo, en lugar de marcar número usado, contamos las veces que cada número ha sido usado.

Por lo tanto el vector no podrá ser de tipo booleano, si no que tendrá que ser entero, al menos.
Código:
V(Numero) = V(Numero) + 1


Y después el que sea mayor que cero, es el que ha sido usado.
Código:
Select Case V(X) > 0


Veamos el ejercicio.
Código:
Sub Main()
   Dim V(11) As Integer
   Dim X As Integer
   Dim Numero As Integer
   
  ' Carga de números
   While X < 10
      Numero = CInt(Console.ReadLine)
      Select Case Numero
         Case 1 To 10
            V(Numero) = V(Numero) + 1
      End Select
      X=X+1
   End While

   ' Visualizar números
   X=0
   While X < 11
      Select Case V(X) > 0
         Case True
            Console.WriteLine("El número {0} ha sido utilizado {1} veces ", X, V(X))
      End Select
      X=X+1
   End While
'
End Sub


9. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados, el numero de veces que se ha usado cada numero, y el que más y el que menos se ha utilizado.
Código:
Private Sub Noveno()
   Dim V(11) As Integer
   Dim X As Integer
   Dim Numero As Integer
   Dim Mas As Integer
   Dim Menos As Integer

   ' Carga de números
   While X < 10
      Numero = CInt(Console.ReadLine)
      Select Case Numero
         Case 1 To 10
            V(Numero) = V(Numero) + 1
      End Select
      X=X+1
   End While

   ' Visualizar números
   X=0
   Mas = 0
   Menos = 1
   While X < 11
      Select Case V(X) > 0
         Case True
            If V(Mas) < V(X) Then Mas = X
            If V(Menos) > V(X) Then Menos = X
            Console.WriteLine("El número {0} ha sido utilizado {1} veces ", X, V(X))
      End Select
      X=X+1
   End While

   Console.WriteLine()
   Console.WriteLine("El número {0} es el más usado {1} veces ", Mas, V(Mas))
   Console.WriteLine("El número {0} es el menos usado {1} veces",Menos, V(Menos))
End Sub


10. Introducir una fecha en tres variables, numéricas, día, mes y año. A esa fecha hay que sumarle 90 días reales, y visualizar la fecha resultante en el formato dia_en_letra de mes_en_letra de 20XX.

Código:
Sub Main()
   Dim Dia As Integer
   Dim Mes As Integer
   Dim Year As Integer
   Dim NvoDia As Integer
   Dim Dias As Integer
   Dim Y As Integer

   ' Creación y carga de vectores
   Dim M() As Integer = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
   Dim DiaLet() As String = {"", "UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO","DIECINUEVE","VEINTE","VEINTIUNO", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE", "TREINTA", "TREINTA Y UNO"}
   Dim MesLet() As String = {"", "ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE"}
   Console.WriteLine("Sumarle 90 días reales, y visualizar la fecha en el formato dia_en_letra de mes_en_letra de XXXX")
   
  ' INTRODUCCION DE FECHA
   Dia = CInt(Console.ReadLine())
   Mes = CInt(Console.ReadLine())
   Year = CInt(Console.ReadLine())

   ' Fecha a dias
   Y=0
   Dias = 0
   If Year Mod 4 = 0 Then M(2) = 29 Else M(2) = 28
   While Y <> Mes -1 ' Los dias del mes actual se suman al final
      Y=Y+1
      Dias = Dias + M(Y)
   End While
   Dias = Dias + Dia + 90 ' Dias + 90 + Dias del mes actual.

   ' Dias a fecha
   Y=0
   NvoDia = 0
   While NvoDia + M(Y + 1) < Dias
      Y = Y + 1 ' Contar los meses desde el principio
      NvoDia = NvoDia + M(Y)
      If Y = 12 Then ' Por el posible cambio de año
         Y=0
         Year = Year + 1
         If Year Mod 4 = 0 Then M(2) = 29 Else M(2) = 28
      End If
   End While
   
  ' Fecha final
   Dia = Dias -NvoDia
   Mes = Y + 1
   Console.WriteLine("Nueva fecha {0} de {1} de {2} ", DiaLet(Dia),
   MesLet(Mes), Year)
End Sub


Los array se han definido con una posición en vacío al principio para forzar a que "Uno" esté en la posición uno, etc..
Código:
Dim DiaLet() As String = {"", "UNO",


De esa forma la posición cero queda salvada.
La validación de año bisiesto es circunstancial, es más compleja que dividir por cuatro.
La estructura del ejercicio es poco adecuada, como mínimo debería haberse utilizado una función para la conversión de las fechas en días.

Conviene probar al menos en un par de ejercicios estas opciones, para captar sus diferencias.
Código:
UBound(V) V.GetLength(0) V.GetUpperBound(0)




Autor del curso: casiopea


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Curso de PHP-WordPress avanzado

wordpressadict PHP 1 Domingo 27 Nov 2016 19:59 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Duda arrays

jamatbar JavaScript 1 Jueves 06 Oct 2016 13:09 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Curso fundamentos de programación

Yaser Programación en general 0 Miércoles 18 May 2016 00:28 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Curso de Desarrollo en Inteligencia Artificial

JL Iglesias Feria Programación de juegos o videojuegos 7 Miércoles 02 Dic 2015 18:20 Ver último mensaje
El foro no contiene ningún mensaje nuevo

SQL Express 2005 Base de datos dañada necesita ...

ramonmerin Programación en general 0 Miércoles 28 Oct 2015 12:22 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,