Página 1 de 1

[VB6] cSet by Slek (Orientación a objetos)

Publicado: 31 May 2012, 19:36
por Slek
Buenas, después de unos meses, vuelvo a la carga :P
Aquí os dejo una clase (cSet) que simula los conjuntos (de números en este caso, pero puede ser de cualquier objeto comparable). Seguro que muchos no lo saben, pero VB6 está orientado a objetos (más o menos), y aunque es una mierda (porque no permite herencia ni polimorfismo) algo se puede hacer :P
Esta clase es muy simple, y nos puede ahorrar bastante código, simplemente se trata de un array en el que puedes añadir los elementos de una forma mucho más sencilla, él solito se encarga de las redimensiones y de llevar la cuenta. Además, si un elemento ya está incluido, no lo vuelve a incluir :P

Código: Seleccionar todo

Option Explicit

'cSet by Slek, for Indetectables.net
'31/5/2012

'Nota:  Es un conjunto de Integer (puede ser modificado)
'       It's an Integer's Set (can be modified)

Dim Arr()   As Integer          'Array of elements
Dim s       As Integer          'Number of elements included

Private Sub Class_Initialize()
'Initialize with 0 elements

    s = 0
    
End Sub

Public Sub Add(ByVal n As Integer)
'Include n

    If Not Contains(n) Then
        ReDim Preserve Arr(s)
        Arr(s) = n
        s = s + 1
    End If
    
End Sub

Public Function Size() As Integer
'Return number of elements
    
    Size = s
    
End Function

Public Function Contains(ByVal n As Integer) As Boolean
'Returns if n has already been included

    Dim i As Integer
    
    For i = 0 To (s - 1)
    
        If Arr(i) = n Then
            Contains = True
            Exit Function
        End If
        
    Next i
    
    Contains = False
    
End Function

Public Function toArray() As Integer()
'Return Array

    toArray = Arr
    
End Function
Ejemplo de uso:

Código: Seleccionar todo

Dim c As New cSet
Dim a() As Integer

Call c.Add(1)

MsgBox c.Contains(1)

Call c.Add(1)
Call c.Add(30)

MsgBox c.Size

a = c.toArray
P.D: Está explicado en inglés, pero la verdad, no hay mucho que explicar xD

Saludos!!

Re: [VB6] cSet by Slek (Orientación a objetos)

Publicado: 31 May 2012, 20:47
por xxxPoseidonxxx
Que grande Slek! eres un buen coder

Saludos

Re: [VB6] cSet by Slek (Orientación a objetos)

Publicado: 31 May 2012, 21:07
por Slek
Se me olvidó el método Remove :P aquí lo dejo jeje

Código: Seleccionar todo

Public Sub Remove(ByVal n As Integer)
'Exclude n

    Dim i   As Integer
    Dim b   As Boolean
    
    For i = 0 To (s - 2)
    
        If Arr(i) = n Then b = True
        
        If b Then Arr(i) = Arr(i + 1)
        
    Next i
    
    s = s - 1
    ReDim Preserve Arr(s - 1)
    
End Sub
Saludos!!

Re: [VB6] cSet by Slek (Orientación a objetos)

Publicado: 01 Jun 2012, 00:46
por noobhack
no tengo muy claro para que sirve, de todas formas muchas gracias por el aporte

Re: [VB6] cSet by Slek (Orientación a objetos)

Publicado: 01 Jun 2012, 18:55
por Slek
Es una clase que permite un uso simplificado (y mejorado) de los array en VB6.
Ventajas:
No necesitas redimensionar, eso ya lo hace él solo.
Si quieres añadir un elemento, simplemente usas el método add.
Si un elemento ya se encuentra almacenado, no lo vuelve a incluir.
Para eliminar un elemento, simplemente usando el método remove, él se encarga de dejarlo todo como debería.
Es decir, tú le pasas el valor que quieres eliminar, no el índice (para añadir y eliminar).
Además, usando la función toArray() permite obtener un array del objeto, para trabajar sobre él a la hora de leer los datos.
Desventajas:
Cada vez que se añade o elimina un elemento, se redimensiona todo el array, por lo que, con grandes cantidades de datos, puede consumir bastantes recursos (hablando de conjuntos de String, pero siendo Integer no supone tanto problema).

Tengo un par de ideas para contrarrestar esa desventaja, sería usando un constructor que cree el array con un tamaño inicial, y cuando se pase ir redimensionando, y a la hora de eliminar, no redimensionar. O bien usando trucos de memoria para almacenar los datos...

Dentro de unos días postearé un solucionador de sudokus, que implementa esta clase, a modo de ejemplo de uso.

Saludos!

Re: [VB6] cSet by Slek (Orientación a objetos)

Publicado: 01 Jun 2012, 21:15
por noobhack
:O Bastante interesante, muchas gracias por la explicacion ^^