Archivo del febrero de 2008

Microsoft se abre a la competencia ¿? ¿? ¿?

Microsoft ha dado la segunda campanada en menos de un mes. Tras el por ahora frustrado asalto a Yahoo! a golpe de talonario, el gigante de la informática anunció ayer que permitirá el acceso a información hasta ahora secreta de sus programas para hacerlos más compatibles y facilitar el desarrollo de ‘software’ tanto independiente como comercial.

Los responsables de la compañía explicaron en rueda de prensa en Redmond (EE UU) que la información será gratis para quienes creen programas no comerciales, mientras que quienes quieran hacer negocio tendrán que «hacer un pequeño pago». Objetivo

«Nuestro objetivo es favorecer una mayor interoperabilidad (compatibilidad entre productos de diferentes fabricantes) y una mayor posibilidad de elección para nuestros clientes y para los desarrolladores (de ‘software’Wink, haciendo nuestros productos más transparentes y compartiendo más información sobre nuestras tecnologías», dijo Steve Ballmer, primer ejecutivo de Microsoft. La compañía se regirá para ello por cuatro principios: asegurar las conexiones abiertas, promover la portabilidad de datos, aumentar el apoyo para el establecimiento de estándares y tener una relación más abierta con los clientes y la industria, incluidas las comunidades de código abierto, formadas por programadores que desarrollan y distribuyen sus productos libremente.

Traducido al lenguaje del lego, la firma pretende resituarse en el mercado para mantener su posición dominante sin ser considerada un monopolio y zanjar así el enfrentamiento que mantiene la Comisión Europea, que los estándares internacionales de documentos acaben siendo sus formatos y ganarse a los programadores no comerciales.

Visual Basic .Net: Programacion Orientada a Objetos un ejemplo de la clase direccionip

Crear la clase DireccionIP con las siguientes características:

 Atributos: guardará los cuatro octetos que forman una IP (los numéricos que hay entre los punticos). Serán de tipo Byte.

 Propiedades: hacer una propiedad para cada uno de los cuatro octetos para poder modificarlo. El valor tendrá que estar entre 0 y 255.

 Constructores:

o Al primero le pasas 4 variables de tipo byte y te crea la IP.

o Al segundo le pasas una cadena con la dirección: “239.113.0.2″ y te rellena los 4 octetos.

 Métodos:

o ClaseIP que nos dice a qué clase pertenece la IP.

Primer número IP

Clase

Máscara de IP

0-127

A

255.0.0.0

128-191

B

255.255.0.0

192-223

C

255.255.255.0

224-239

D

0.0.0.0

240-255

E

0.0.0.0

Class direccionip
    Private ip1 As Byte
    Private ip2 As Byte
    Private ip3 As Byte
    Private ip4 As Byte

    Private Property pip1() As Byte
        Get
            Return ip1
        End Get
        Set(ByVal value As Byte)
            If value >= 0 Or value <= 255 Then
                ip1 = value
            Else
                ip1 = 0
            End If
        End Set
    End Property

    Private Property pip2() As Byte
        Get
            Return ip2
        End Get
        Set(ByVal value As Byte)
            If value >= 0 Or value <= 255 Then
                ip2 = value
            Else
                ip2 = 0
            End If
        End Set
    End Property

    Private Property pip3() As Byte
        Get
            Return ip3
        End Get
        Set(ByVal value As Byte)
            If value >= 0 Or value <= 255 Then
                ip3 = value
            Else
                ip3 = 0
            End If
        End Set
    End Property

    Private Property pip4() As Byte
        Get
            Return ip4
        End Get
        Set(ByVal value As Byte)
            If value >= 0 Or value <= 255 Then
                ip4 = value
            Else
                ip4 = 0
            End If
        End Set
    End Property

    Sub New(ByVal a As Byte, ByVal b As Byte, ByVal c As Byte, ByVal d As Byte)
        Me.ip1 = a
        Me.ip2 = b
        Me.ip3 = c
        Me.ip4 = d

    End Sub

    Sub New(ByVal ip As String)
        Dim pospyc As Integer

        pospyc = ip.IndexOf("."Wink
        Me.ip1 = ip.Substring(0, pospyc)
        ip = ip.Remove(0, pospyc + 1)

        pospyc = ip.IndexOf("."Wink
        Me.ip2 = ip.Substring(0, pospyc)
        ip = ip.Remove(0, pospyc + 1)

        pospyc = ip.IndexOf("."Wink
        Me.ip3 = ip.Substring(0, pospyc)
        ip = ip.Remove(0, pospyc + 1)

        Me.ip4 = ip

    End Sub

    Public Function claseip() As String
        Dim r As String = Nothing
        Select Case ip1
            Case 0 To 127
                r = "A"
            Case 128 To 191
                r = "B"
            Case 192 To 223
                r = "C"
            Case 224 To 239
                r = "D"
            Case 240 To 255
                r = "D"

        End Select
        Return r
    End Function

    Public Function mascarared() As String
        Dim r As String = "255"
        Select Case ip1
            Case 0 To 127
                r = "255.0.0.0"
            Case 128 To 191
                r = "255.255.0.0"
            Case 192 To 223
                r = "255.255.255.0"
            Case 224 To 239
                r = "0.0.0.0"
            Case 240 To 255
                r = "0.0.0.0"

        End Select
        Return r
    End Function

    Public Shared Operator And(ByVal a As direccionip, ByVal b As direccionip) As direccionip
        Dim r As direccionip = New direccionip(a.ip1, a.ip2, a.ip3, a.ip4)
        r.ip1 = a.ip1 And b.ip1
        r.ip2 = a.ip2 And b.ip2
        r.ip3 = a.ip3 And b.ip3
        r.ip4 = a.ip4 And b.ip4
        Return r

    End Operator

    Public Shared Operator Or(ByVal a As direccionip, ByVal b As direccionip) As direccionip
        Dim r As direccionip = New direccionip(a.ip1, a.ip2, a.ip3, a.ip4)
        r.ip1 = a.ip1 Or (255 - b.ip1)
        r.ip2 = a.ip2 Or (255 - b.ip2)
        r.ip3 = a.ip3 Or (255 - b.ip3)
        r.ip4 = a.ip4 Or (255 - b.ip4)
        Return r

    End Operator

    Public Function direccionred(ByVal a As direccionip, ByVal b As direccionip) As String
        Dim r As direccionip
        Dim s As String = ""
        r = a And b
        s = r.ip1.ToString + "." + r.ip2.ToString + "." + r.ip3.ToString + "." + r.ip4.ToString
        Return s
    End Function

    Public Function direccionbroadcast(ByVal a As direccionip, ByVal b As direccionip) As String
        Dim r As direccionip
        Dim s As String = ""
        r = a Or b
        s = r.ip1.ToString + "." + r.ip2.ToString + "." + r.ip3.ToString + "." + r.ip4.ToString
        Return s
    End Function

End Class

Module Module1

    Sub Main()
        Dim ip As direccionip = New direccionip("192.168.1.100"Wink
        Dim mascara As direccionip

        Console.WriteLine("Supongamos que tenemos esta ip: 192.168.1.100"Wink
        mascara = New direccionip("255.255.255.192"Wink
        Console.WriteLine("Mascara de la ip: {0} de base.", ip.mascarared)
        mascara = New direccionip("255.255.255.192"Wink

        Console.WriteLine("Clase de la ip: " & ip.claseip)
        Console.WriteLine("Supongamos que tiene esta mascara de red: 255.255.255.192"Wink
        Console.WriteLine("Direccion de red: " & ip.direccionred(ip, mascara))
        Console.WriteLine("Direccion de broadcast: " & ip.direccionbroadcast(ip, mascara))
        Console.ReadKey()
    End Sub

End Module

El fin del HD DVD

Toshiba anunció ayer de manera oficial que abandona la fabricación y el desarrollo de grabadores y reproductores de su HD DVD de alta definición. La compañía también advirtió que seguirá ofreciendo servicio posventa a los clientes que hayan adquirido equipos apoyados en este sistema. Bien por ellos.

Era vox pópuli que Toshiba había perdido la guerra de los DVD de alta definición frente a su rival Sony, que ha impuesto tras dos años de batalla comercial su tecnología Blu-ray. Pero fue ayer cuando el presidente y consejero delegado de Toshiba, Atsutoshi Nishida, decidió hacer público en Tokio, tras una reunión con sus directivos, que suspenden su negocio HD DVD.

El directivo aseguró que han evaluado ‘cuidadosamente’ los efectos a largo plazo de continuar la denominada guerra de formatos de DVD de alta definición, ‘y hemos llegado a la conclusión que una rápida decisión es la mejor forma de ayudar al desarrollo del mercado y no perjudicar a los consumidores’, sentenció.

El presidente de Toshiba, que reconoció ‘estar decepcionado por lo que supone para la empresa y, aún más, para el consumidor’, apuntó que su compañía continuará proporcionando soporte y servicios a todos los propietarios de un HD DVD de la firma japonesa. También avanzó que Toshiba comenzará a reducir las entregas de pedidos de reproductores y grabadores de HD DVD al canal de distribución minorista, con el objetivo de cesar este negocio a finales de marzo de 2008.

Visual Basic .net: Una funciona para hacer mas bonitas las aplicaciones tipo consola

Aqui teneis un codigo con el que se consigue hacer mucho mas bonitas las aplicaciones de tipo consola, en visual basic .net

 Private Function Menu(ByRef op As String(), ByVal x As Integer, ByVal y As Integer) As Integer

        '' Krnl64 08
        '' Se le pasa un array de string que son las opciones del menu
	'' Se maneja con los cursores y enter. Devuelve la opcion seleccionada

        Dim j As Integer
        Dim vertical As Integer
        Dim tmp As Integer
        Dim k As ConsoleKeyInfo

                Console.Clear()
                Console.SetCursorPosition(x, y)
                Console.BackgroundColor = ConsoleColor.DarkGreen
                Console.ForegroundColor = ConsoleColor.Yellow
                Console.WriteLine(op(0))                          '' Situo el cursor y pinto el titulo y su color
                Console.ResetColor()

                vertical = y + 1 '' Espacio +1

                    For j = 1 To UBound(op)

                        Console.SetCursorPosition(x, vertical + j) '' Pinto las opciones del menu
                        Console.WriteLine(op(j))

                    Next

                tmp = vertical
                j = 2

                Console.SetCursorPosition(x, vertical + 1)          '' Situo el cursor en la 1º opcion...
                Console.ForegroundColor = ConsoleColor.Yellow
                Console.BackgroundColor = ConsoleColor.DarkMagenta
                Console.WriteLine(op(1))                            '' la coloreo
                Console.SetCursorPosition(x, vertical + 1)          '' vuelvo a colocar el cursor en la 1º opcion

                Do

                    k = Console.ReadKey(True)

                        Select Case k.Key

                                Case ConsoleKey.DownArrow '' Flecha abajo...

                                        If j = op.Length Then '' Si es la ultima opcion

                                             vertical += 1

                                             Console.SetCursorPosition(x, vertical)
                                             Console.ResetColor()
                                             Console.WriteLine(op(j - 1))                         '' Pinto con color normal la ultima opcion

                                             vertical = tmp
                                             j = 1

                                             Console.SetCursorPosition(x, vertical + 1)          '' Situo el cursor en la 1º opcion...
                                             Console.ForegroundColor = ConsoleColor.Yellow
                                             Console.BackgroundColor = ConsoleColor.DarkMagenta
                                             Console.WriteLine(op(j))                            '' la coloreo
                                             Console.SetCursorPosition(x, vertical + 1)          '' vuelvo a colocar el cursor en la 1º opcion

                                             j += 1

                                        Else

                                             vertical += 1

                                             Console.ResetColor()
                                             Console.SetCursorPosition(x, vertical)
                                             Console.WriteLine(op(j - 1))                          '' Pinto la opción actual sin color...

                                             Console.SetCursorPosition(x, vertical + 1)
                                             Console.ForegroundColor = ConsoleColor.Yellow
                                             Console.BackgroundColor = ConsoleColor.DarkMagenta
                                             Console.WriteLine(op(j))                              '' Coloreo la siguiente opcion

                                             j += 1                                                '' Incremento indices...

                                        End If

                                Case ConsoleKey.UpArrow

                                        If j = 2 Then   '' Si es la 1º opcion...

                                             Console.ResetColor()
                                             Console.SetCursorPosition(x, vertical + 1)          '' Pinto la opcion actual normal
                                             Console.WriteLine(op(j - 1))

                                             vertical = tmp + UBound(op)

                                             Console.SetCursorPosition(x, vertical)             '' Me voy a la ultima opcion
                                             Console.ForegroundColor = ConsoleColor.Yellow
                                             Console.BackgroundColor = ConsoleColor.DarkMagenta
                                             Console.WriteLine(op(UBound(op)))

                                            j = op.Length
                                            vertical -= 1

                                        Else

                                            vertical += 1

                                            Console.ResetColor()
                                            Console.SetCursorPosition(x, vertical)
                                            Console.WriteLine(op(j - 1))                          '' Pinto la opción actual sin color

                                            j -= 2

                                            Console.SetCursorPosition(x, vertical - 1)
                                            Console.ForegroundColor = ConsoleColor.Yellow
                                            Console.BackgroundColor = ConsoleColor.DarkMagenta    '' Pinto la opcion de arriba coloreada
                                            Console.WriteLine(op(j))

                                            vertical -= 2
                                            j += 1

                                        End If

                                Case ConsoleKey.Enter

                                        Console.ResetColor()
                                        Return (j - 1)

                        End Select

                Loop While k.Key <> ConsoleKey.Escape

    Return (-1)
    End Function

Visual Basic .NET: Programacion Orientada a Objetos Crear la clase Conjunto de enteros

Crear la clase Conjunto de enteros, que será parecido a una lista sólo que no pueden existir elementos repetidos y da igual el orden en el que estén colocados los elementos. Tendrá las siguientes características:

- Atributos: una lista que contendrá los elementos que existen en el conjunto.
- Propiedades: el número de elementos que hay en el conjunto y una variable booleana que nos diga si está vacío o no.
- Métodos:
o Definir el operador + que será la unión de dos conjuntos.
o Definir el operador / que será la intersección de dos conjuntos.
o Definir el operador – que será la resta de conjuntos (los elementos del primer conjunto menos los que estén en el segundo conjunto).
o El método Vaciar que nos deja el conjunto vacío.
o El método Insertar que nos inserta un nuevo elemento en el conjunto.
o El método Borrar que nos borra un elemento del conjunto.
o El método Contiene que nos dice si el conjunto contiene ya el elemento en cuestión.

Class conjunto
    Private lista As New List(Of Integer)

    Public ReadOnly Property nelementos() As Integer
        Get
            Return (lista.Count)
        End Get

    End Property

    Public ReadOnly Property estavacio() As Boolean
        Get
            If Me.lista Is Nothing Then
                Return False
            Else
                Return True
            End If

        End Get
    End Property

    Public Sub New(ByVal lista As List(Of Integer))
        Me.lista = lista
    End Sub

    Public Sub New()

    End Sub

    Public Shared Operator +(ByVal a As conjunto, ByVal b As conjunto) As conjunto

        Dim nlista As New List(Of Integer)
        Dim n As Integer
        Dim s As New conjunto
        For Each n In a.lista
            s.lista.Add(n)
        Next

        For Each n In b.lista
            If Not nlista.Contains(n) Then
                s.lista.Add(n)
            End If
        Next
        Return s
    End Operator

    Public Shared Operator -(ByVal a As conjunto, ByVal b As conjunto) As conjunto

        Dim nlista As New List(Of Integer)
        Dim n, m As Integer
        Dim s As New conjunto
        n = 0
        m = 0
        While n <= a.lista.Count - 1
            While m <= b.lista.Count - 1
                If a.lista.Item(n) = b.lista.Item(m) Then
                    a.lista.Remove(n)
                    Exit While
                End If
                m += 1
            End While
            n += 1
            m = 0
        End While
        s.lista = a.lista
        Return s
    End Operator

    Public Shared Operator /(ByVal a As conjunto, ByVal b As conjunto) As conjunto

        Dim nlista As New List(Of Integer)
        Dim n, m As Integer
        Dim s As New conjunto
        For Each n In a.lista
            For Each m In b.lista
                If n = m Then
                    s.lista.Add(n)
                End If
            Next
        Next

        Return s
    End Operator

    Public Sub vaciar_conjunto()
        Me.lista.Clear()
    End Sub

    Public Sub inserta_elemento_conjunto(ByVal elemento As Integer)
        Me.lista.Add(elemento)
    End Sub

    Public Sub borrar_elemento_conjunto(ByVal elemento As Integer)
        Dim n As Integer = 0

        While n < Me.nelementos
            If Me.lista(n) = elemento Then
                Me.lista.RemoveAt(n)
            End If
            n += 1
        End While

    End Sub

    Public Function contiene_elemento_conjunto(ByVal elemento As Integer) As Boolean
        Dim n As Integer
        Dim r As Boolean = False
        For Each n In Me.lista
            If n = elemento Then
                r = True
                Exit For
            End If
        Next
        Return r
    End Function

End Class

Module Module1

    Sub Main()
        Dim l1 As New List(Of Integer)
        Dim i As Integer
        For i = 1 To 10
            l1.Add(i)
        Next

        Dim l2 As New List(Of Integer)
        For i = 2 To 32
            l2.Add(i)
        Next

        Dim c1 As conjunto = New conjunto(l1)
        Dim c2 As conjunto = New conjunto(l2)
        Dim c3 As conjunto = New conjunto
        Console.WriteLine("Conjunto A tiene {0} elementos.", c1.nelementos)
        Console.WriteLine("Conjunto B tiene {0} elementos.", c2.nelementos)
        c3 = c1 + c2
        Console.WriteLine("Suma de los 2 conjuntos: {0} elementos.", c3.nelementos)
        c3 = Nothing
        c3 = c1 / c2
        Console.WriteLine("Interseccion de los 2 conjuntos: {0} elementos.", c3.nelementos)
        'vemos si contiene el elemento 8
        Console.WriteLine("Vemos si contiene el elemento 8: " & c3.contiene_elemento_conjunto(8))

        If Not c3.estavacio Then
            Console.WriteLine("Borra el elemento 3 del conjunto."Wink
            c3.borrar_elemento_conjunto(3)
        End If
        Console.WriteLine("Ahora vaciamos un conjunto C. Que tiene {0} elementos.", c3.nelementos)
        c3.vaciar_conjunto()
        Console.WriteLine("Ahora comprobamos el conjunto C. Que tiene {0} elementos.", c3.nelementos)

        Console.WriteLine()
        Console.Write("Resta de conjunto A-B."Wink
        c3 = c1 - c2
        Console.Write(" Resultado: {0} elementos.", c3.nelementos)
        Console.WriteLine()

        Console.ReadKey()

    End Sub

End Module

Visual Basic .NET: Programacion Orientada a Objetos Crear la clase Fracción

1. Crear la clase Fracción con las siguientes características:

- Atributos: numerador y denominador (privados)
- Propiedades: Numerador y Denominador y ValorDecimal (de sólo lectura, nos da el valor en número con decimales de la fracción).
- Constructores: dos, el primero recibe el numerador y el denominador para hacer la fracción y la segunda recibe un número con decimales que convertirá en fracción.
- Métodos:
o Definir los operadores +, -, *, /
o Sobreescribir la función ToString para que nos pinte la fracción
o Escribir la función Simplifica que nos simplifica la función.

Class fraccion
    Private inumerador As Integer
    Private idenominador As Integer
    Private ivalordecimal As Decimal = 0.0

    Public ReadOnly Property numerador() As Integer
        Get
            Return (inumerador)
        End Get

    End Property

    Public ReadOnly Property denominador() As Integer
        Get
            Return idenominador
        End Get

    End Property

    Public ReadOnly Property valordecimal() As Decimal
        Get
            Me.ivalordecimal = numerador / denominador
            Return (ivalordecimal)
        End Get
    End Property

    Public Sub New(ByVal numerador As Integer, ByVal denominador As Integer)
        simplifica(numerador, denominador)
    End Sub

    Public Sub New(ByVal valordecimal As Decimal)
        Me.ivalordecimal = valordecimal
    End Sub

    Public Shared Operator +(ByVal a As fraccion, ByVal b As fraccion) As String
        Dim resultadoa As Integer = 0

        resultadoa = (a.numerador * b.denominador) + (b.numerador * a.denominador)
        Dim resultadob As Integer = 0
        resultadob = a.denominador * b.denominador
        Dim cad As String = ""
        cad = (a.numerador & "/" & a.denominador & " + " & b.numerador & "/" & b.denominador & "=" & resultadoa & "/" & resultadob)

        Return (cad)

    End Operator

    Public Shared Operator -(ByVal a As fraccion, ByVal b As fraccion) As String
        Dim resultadoa As Integer = 0

        resultadoa = (a.numerador * b.denominador) - (b.numerador * a.denominador)
        Dim resultadob As Integer = 0
        resultadob = a.denominador * b.denominador
        Dim cad As String = ""
        cad = (a.numerador & "/" & a.denominador & " - " & b.numerador & "/" & b.denominador & "=" & resultadoa & "/" & resultadob)

        Return cad

    End Operator

    Public Shared Operator *(ByVal a As fraccion, ByVal b As fraccion) As String
        Dim resultadoa As Integer = 0

        resultadoa = (a.numerador * b.numerador)
        Dim resultadob As Integer = 0
        resultadob = a.denominador * b.denominador
        Dim cad As String = ""

        cad = (a.numerador & "/" & a.denominador & " * " & b.numerador & "/" & b.denominador & "=" & resultadoa & "/" & resultadob)

        Return (cad)

    End Operator

    Public Shared Operator /(ByVal a As fraccion, ByVal b As fraccion) As String
        Dim resultadoa As Integer = 0

        resultadoa = (a.numerador * b.denominador)
        Dim resultadob As Integer = 0
        resultadob = a.denominador * b.numerador
        Dim cad As String = ""
        'Me.ivalordecimal = resultadoa / resultadob
        cad = (a.numerador & "/" & a.denominador & " / " & b.numerador & "/" & b.denominador & "=" & resultadoa & "/" & resultadob)

        Return (cad)

    End Operator

    Public Overrides Function ToString() As String
        Dim cad As String = ""
        cad = Me.inumerador & " / " & Me.idenominador

        Return (cad)
    End Function

    Private Function mcd(ByVal a As UInteger, ByVal b As UInteger) As UInteger
        Dim t As UInteger
        While a > 0
            t = a
            a = b Mod a
            b = t
        End While
        Return b
    End Function

    Private Sub simplifica(ByVal a As UInteger, ByVal b As UInteger)
        Dim v1 As UInteger = mcd(a, b) 'v1 es el factor maximo de division
        Me.inumerador = a
        Me.idenominador = b
        Me.inumerador = inumerador / v1
        Me.idenominador = idenominador / v1
        Me.ivalordecimal = Me.inumerador / Me.denominador

    End Sub

End Class

Module Module1

    Sub Main()
        Dim i, j As fraccion
        Dim a, b As Integer
        Console.Clear()
        Console.Write("Dame numerador Fraccion 1: "Wink
        a = Console.ReadLine
        Console.Write("Dame denominador Fraccion 1: "Wink
        b = Console.ReadLine
        Console.WriteLine()
        i = New fraccion(a, b)
        Console.Write("Dame numerador Fraccion 2: "Wink
        a = Console.ReadLine
        Console.Write("Dame denominador Fraccion 2: "Wink
        b = Console.ReadLine

        j = New fraccion(a, b)
        Console.WriteLine()
        Console.WriteLine(i)
        Console.WriteLine(j)

        Console.WriteLine("Suma de Fracciones: " & i + j & "=> " & (i.valordecimal + j.valordecimal))
        Console.WriteLine("Resta de Fracciones: " & i - j & "=> " & (i.valordecimal - j.valordecimal))
        Console.WriteLine("Multiplicacion de Fracciones: {0}", i * j & "=> " & (i.valordecimal * j.valordecimal))
        Console.Write("Division de Fracciones: "Wink
        Console.Write(i / j & "=> " & (i.valordecimal / j.valordecimal))
        Console.ReadKey()
    End Sub

End Module

Funcion Aleatorios Sin Repeticion

Pos na aqui teneis una pequeña funcioncilla que genera un array de aleatorios sin repeticion.
Codigo escrito para visual basic .net

Private Function RP(ByVal valores As Integer, ByVal max As Integer) As Integer()

''Krnl64 08

'' valores es la cantidad de nº a generar
'' max es el valor máximo

'' v()=RP(20,100) llenara v de 20 enteros aleatorios sin repeticion entre 1 100

Randomize()
Dim i As Integer
Dim j As Integer
Dim z As Integer
Dim v() As Integer
Dim v2() As Integer

ReDim v(valores - 1)
ReDim v2(max - 1)

For i = 0 To max - 1
v2(i) = i + 1
Next

For i = 0 To UBound(v)

z = CInt(Rnd() * UBound(v2))
v(i) = v2(z)

For j = z To UBound(v2) - 1
v2(j) = v2(j + 1)
Next

ReDim Preserve v2(UBound(v2) - 1)

Next

Return (v)
End Function