Ayuda ejercicios unidad 34: Arrays en VB





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.

 

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.

 

  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

 

  While X <> V.Length

 

O bien con

 

  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.

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.

 

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.

 

  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

 

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.

  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

 

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.

  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

 

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:

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

 

  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 :

 

 P(0) = V(0)

 

Para disponer de anterior.

 

 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.

 

 V = P

 

El programa principal sería:

 

  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.

 

  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

 

  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.

 

  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.

 

   V(Numero) = V(Numero) + 1

 

Y después el que sea mayor que cero, es el que ha sido usado.

 

   Select Case V(X) > 0

 

Veamos el ejercicio.

 

  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.

  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.

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

 

 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.

 

 UBound(V)    V.GetLength(0)   V.GetUpperBound(0)

   Inicio    






Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies