16 - Vector - Recuperar tamaño y redimensionar


Como hemos visto cuando se define un vector indicamos entre paréntesis un valor entero que nos indica cuantos elementos podemos almacenar, a dicho valor hay que sumarle uno ya que las componentes se enumeran a partir de cero:

  Private sueldos(4) As Integer

En la línea anterior estamos definiendo un vector con 5 componentes de tipo entera.

Luego cuando tenemos que recorrer dicho vector disponemos una estructura repetitiva For:

 Public Sub Cargar()
            Dim f As Integer
            For f = 0 To 4
                Console.Write("Ingrese importe del sueldo:")
                sueldos(f) = Console.ReadLine()
            Next
        End Sub

Como vemos el For se repite mientras el contador f vale menos o igual a cuatro. Este estructura repetitiva es idéntica cada vez que recorremos el vector.
Que pasa ahora si cambiamos el tamaño del vector cuando lo definimos:

  Private sueldos(7) As Integer

Con esto tenemos que cambiar todos los For que recorren dicho vector. Ahora veremos que un vector al ser un objeto tiene un método llamada GetUpperBound que retorna el valor del último índice del vector. Luego podemos modificar todos los For con la siguiente sintaxis:

        Public Sub Cargar()
            Dim f As Integer
            For f = 0 To sueldos.GetUpperBound(0)
                Console.Write("Ingrese sueldo:")
                sueldos(f) = Console.ReadLine()
            Next
        End Sub

Cuando llamamos a GetUpperBound debemos pasar el valor cero (ya veremos más adelante con matrices y arreglos multidimensionales porque es este valor cero)

El problema completo utilizando el método GetUpperBound:

Module Module1

    Public Class PruebaVector8

        Private sueldos(4) As Integer

        Public Sub Cargar()
            Dim f As Integer
            For f = 0 To sueldos.GetUpperBound(0)
                Console.Write("Ingrese sueldo:")
                sueldos(f) = Console.ReadLine()
            Next
        End Sub

        Public Sub Imprimir()
            Dim f As Integer        
            For f = 0 To sueldos.GetUpperBound(0)
                Console.WriteLine(sueldos(f))
            Next
            Console.ReadKey()
        End Sub
    End Class

    Sub Main()
        Dim pv As New PruebaVector8()
        pv.Cargar()
        pv.Imprimir()
    End Sub

End Module

También podemos pedir al usuario que indique el tamaño del vector en tiempo de ejecución, en estos casos se hace imprescindible el empleo del método GetUpperBound.

Problema:

Se desea almacenar los sueldos de operarios. Cuando se ejecuta el programa se debe pedir la cantidad de sueldos a ingresar. Luego crear un vector con dicho tamaño.

Programa:

Module Module1

    Public Class PruebaVector8

        Private sueldos() As Integer

        Public Sub Cargar()
            Dim tam As Integer
            Console.Write("Cuantos empleados hay?")
            tam = Console.ReadLine()
            ReDim sueldos(tam - 1)
            Dim f as Ingeger
            For f = 0 To sueldos.GetUpperBound(0)
                Console.Write("Ingrese sueldo:")
                sueldos(f) = Console.ReadLine()
            Next
        End Sub

        Public Sub Imprimir()
            Dim f as Integer
            For f = 0 To sueldos.GetUpperBound(0)
                Console.WriteLine(sueldos(f))
            Next
            Console.ReadKey()
        End Sub
    End Class

    Sub Main()
        Dim pv As New PruebaVector8()
        pv.Cargar()
        pv.Imprimir()
    End Sub

End Module

Cuando declaramos el vector no indicamos tamaño:

        Private sueldos() As Integer

Luego para la creación del mismo ingresamos una variable entera y la utilizamos el comando Redim seguido del nombre del vector y entre paréntesis el índice final del vector a crear:

            Dim tam As Integer
            Console.Write("Cuantos empleados hay?")
            tam = Console.ReadLine()
            ReDim sueldos(tam - 1)

Disponemos tam-1 ya que si el operador ingresa que la empresa tiene 5 empleados luego debemos crear el vector con 5 componentes.

Luego las estructuras repetitivas las acotamos accediendo al método GetUpperBound del vector:

            For f = 0 To sueldos.GetUpperBound(0)
                Console.Write("Ingrese sueldo:")
                sueldos(f) = Console.ReadLine()
            Next

Problemas propuestos

  1. Desarrollar un programa que permita ingresar un vector de n elementos, ingresar n por teclado. Luego imprimir la suma de todos sus elementos
Solución
Module Module1

    Public Class PruebaVector9

        Private vec() As Integer

        Public Sub Cargar()
            Dim n As Integer
            Console.Write("Cuantos elementos tiene el vector:")
            n = Console.ReadLine()
            ReDim vec(n - 1)
            For f = 0 To vec.GetUpperBound(0)
                Console.Write("Ingrese elemento:")
                vec(f) = Console.ReadLine()
            Next
        End Sub

        Public Sub AcumularElementos()
            Dim suma As Integer = 0
            Dim f As Integer
            For f = 0 To vec.GetUpperBound(0)
                suma = suma + vec(f)
            Next
            Console.WriteLine("La suma de los elementos es:" & suma)
            Console.ReadKey()
        End Sub

    End Class

    Sub Main()
            Dim pv As New PruebaVector9()
            pv.Cargar()
            pv.AcumularElementos()
        End Sub

End Module

Retornar