elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]  (Leído 3,182 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
[SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« en: 5 Julio 2010, 12:31 pm »

Hola chicos, esta es mi ultima funcion que sirve para simplificar arrays numéricos.
En realidad es un reto que me puso mi maestro BlackZer0X! :P

Añadir mi clase cCollectionEx.cls

Código
  1. '=========================================================
  2. ' º Function : Abbreviate_Numeric_Array
  3. ' º Author   : Mr. Frog ©
  4. ' º Mail     : vbpsyke1@mixmail.com
  5. ' º Recommended Websites :
  6. '       http://blog.visual-coders.com.ar/
  7. '       http://InfrAngeluX.Sytes.Net/
  8. '=========================================================
  9. Option Explicit
  10. Option Base 0
  11.  
  12. Rem Añadir mi clase cCollectionEx.cls
  13.  
  14. Public Function Abbreviate_Numeric_Array(ByRef vNumberList() As Variant) As cCollectionEx
  15. If (Not vNumberList) = -1 Then Exit Function
  16. Dim cExTemp                                         As New cCollectionEx
  17. Dim lActualNumber                                   As Variant
  18. Dim lToTalNumbers                                   As Long
  19. Dim Q                                               As Long
  20. Dim W                                               As Long
  21.    lToTalNumbers = UBound(vNumberList())
  22.    If lToTalNumbers > 2 Then
  23.        Do While Q <= lToTalNumbers
  24.            lActualNumber = vNumberList(Q)
  25.            W = 0
  26.            If (Q < lToTalNumbers) Then
  27.                Do While (vNumberList(Q) + 1 = vNumberList(Q + 1)) Or _
  28.                         (vNumberList(Q) = vNumberList(Q + 1))
  29.                    Q = Q + 1
  30.                    W = W + 1
  31.                Loop
  32.            End If
  33.            With cExTemp
  34.                If W > 1 Then
  35.                    .Add lActualNumber & "~" & vNumberList(Q)
  36.                Else
  37.                    .Add lActualNumber
  38.                End If
  39.            End With
  40.            If Not (W = 1) Then Q = Q + 1
  41.        Loop
  42.        Set Abbreviate_Numeric_Array = cExTemp
  43.    End If
  44. End Function

Ejemplo:

Código
  1. Private Sub Form_Load()
  2. Dim Q                                   As Long
  3. Dim dArray()                            As Variant
  4. Dim sResult                             As String
  5.  
  6.    dArray() = Array(1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 65, 345, 4545, 4546, 4547, 9999999, 9999999999#)
  7.  
  8.    With Abbreviate_Numeric_Array(dArray)
  9.        For Q = 1 To .Count
  10.            sResult = sResult & .Item(Q) & "|"
  11.        Next Q
  12.    End With
  13.  
  14.    Debug.Print sResult
  15. End Sub

Obtengo esto:
Citar
1~7|65|345|4545~4547|9999999|9999999999|



Ahora mi funcion para desabreviar... :P

Código
  1. '=========================================================
  2. ' º Function : DeAbbreviate_Numeric_Array
  3. ' º Author   : Mr. Frog ©
  4. ' º Mail     : vbpsyke1@mixmail.com
  5. ' º Recommended Websites :
  6. '       http://blog.visual-coders.com.ar/
  7. '       http://InfrAngeluX.Sytes.Net/
  8. '=========================================================
  9. Option Explicit
  10. Option Base 0
  11.  
  12. Public Function DeAbbreviate_Numeric_Array(ByRef sNumbersItems() As String) As cCollectionEx
  13. If (Not sNumbersItems) = -1 Then Exit Function
  14. Dim cExTemp                                         As New cCollectionEx
  15. Dim sActualItem                                     As String
  16. Dim sNumbers()                                      As String
  17. Dim lToTalItems                                     As Long
  18. Dim Q                                               As Long
  19. Dim W                                               As Long
  20.    lToTalItems = UBound(sNumbersItems())
  21.    If lToTalItems > 2 Then
  22.        For Q = 0 To lToTalItems
  23.            sActualItem = sNumbersItems(Q)
  24.            If sActualItem Like "*~*" Then
  25.                sNumbers() = Split(sActualItem, "~")
  26.                For W = CDbl(sNumbers(0)) To CDbl(sNumbers(1))
  27.                    cExTemp.Add W
  28.                Next W
  29.            Else
  30.                cExTemp.Add sActualItem
  31.            End If
  32.        Next Q
  33.        Set DeAbbreviate_Numeric_Array = cExTemp
  34.    End If
  35. End Function

Un ejemplo:

Código
  1. Private Sub Form_Load()
  2. Dim sArray()                    As String
  3. Dim Q                           As Long
  4.  
  5.    sArray() = Split("1|2|8|9|34|56~58|9999~10002|", "|")
  6.    With DeAbbreviate_Numeric_Array(sArray())
  7.        For Q = 1 To .Count
  8.            Debug.Print .Item(Q)
  9.        Next Q
  10.    End With
  11. End Sub

Me da esto:
Citar
1
2
8
9
34
56
57
58
9999
10000
10001
10002

DoEvents! :P


« Última modificación: 21 Noviembre 2010, 00:40 am por Mr. Frog © » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #1 en: 5 Julio 2010, 13:11 pm »

Es un muy buen ejercicio para pillar conceptos de lógica.

Muy bueno y gracias por compartir ;)

Saludos


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #2 en: 5 Julio 2010, 13:42 pm »

Me ha gustado :D, ahora falta que hagas la funcion que des-abrevia :P, si no esto no tiene utilidad :xD
Seria interesante que tambien pudiese detectar series de multiples por ejemplo...

Lo unico que no me gusta es que abusas de hacer las cosas en una linea, por ejemplo:
Código
  1. If lActualNumber + c = lNumberList(n) Then n = n + 1: c = c + 1 Else Exit Do
A me me gusta mucho mas asi, se ve mejor la logica:
Código
  1. If lActualNumber + c = lNumberList(n) Then
  2.       n = n + 1
  3.       c = c + 1
  4. Else
  5.       Exit Do
  6. End If

Saludos ;)
« Última modificación: 5 Julio 2010, 13:47 pm por Karcrack » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #3 en: 5 Julio 2010, 13:56 pm »

Gracias! ;D
Si, lo de las series multiples era una de las cosas a implementar, buena idea lo de "des-abreviar"... :laugh: (Lo metere tambien, buena idea) ;)
En cuanto lo de las lineas es pura costumbre, auque tienes razon que es mas "entendible" como me has puesto... :silbar:
En unos dias posteo la nueva :P

Salu2 y Gracias a ambos! :-* :laugh:
En línea

Dreamaker

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #4 en: 5 Julio 2010, 14:33 pm »

A mi también me ha gustado y estoy de acuerdo con eso con Karcrack, hay que hacer el código un poco más legible..(y hasta aunque sea para uno mismo)

Buen trabajo ;)
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #5 en: 5 Julio 2010, 14:38 pm »

He hecho la funcion de desabreviar :P
Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.    Dim vItem       As Variant
  5.  
  6.    For Each vItem In DeAbbreviate("1|2|8|9|34|56~58|9999~10002|")
  7.        Debug.Print vItem;
  8.    Next vItem
  9. End Sub
  10.  
  11. Public Function DeAbbreviate(ByVal sString As String) As Double()
  12.    Dim bvTemp()    As String
  13.    Dim i           As Long
  14.    Dim n           As Long
  15.    Dim w           As Long
  16.    Dim dFir        As Double
  17.    Dim dLas        As Double
  18.    Dim bvResult()  As Double
  19.  
  20.    bvTemp = Split(sString, "|")
  21.  
  22.    For i = LBound(bvTemp) To UBound(bvTemp)
  23.        If bvTemp(i) Like "*~*" Then
  24.            dFir = Val(Split(bvTemp(i), "~")(0))
  25.            dLas = Val(Split(bvTemp(i), "~")(1))
  26.            ReDim Preserve bvResult(0 To (n + (dLas - dFir)))
  27.            For n = n To (n + (dLas - dFir))
  28.                bvResult(n) = dFir + w
  29.                w = w + 1
  30.            Next n
  31.            w = 0
  32.            n = n - 1
  33.        ElseIf bvTemp(i) <> vbNullString Then
  34.            ReDim Preserve bvResult(0 To n)
  35.            bvResult(n) = bvTemp(i)
  36.        End If
  37.        n = n + 1
  38.    Next i
  39.  
  40.    DeAbbreviate = bvResult
  41. End Function
  42.  
Supongo que se podria acortar un poco, pero creo que asi queda muy claro lo que hace :D

Saludos ;)
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #6 en: 5 Julio 2010, 14:40 pm »

@Karcrack
Te odio!!! :laugh: :laugh:
Queria hacerlo yo antes... :¬¬
No obstante no voy a mirar tu code, y publicare mi alternativa, despues mirare el tuyo... :P

JAJAJAJA :xD

Salu2! ;)
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #7 en: 5 Julio 2010, 19:23 pm »

Bueno como habeis visto, he posteado la funcion de desabreviar  ;-)
Tambien he quitado algunos ":" para que la funcion sea mas legible (siguiendo vuestro consejo ;) )
Voy a ver tu funcion Karcrack, aunque debo de admitir que hay cosas que no entiendo, las buscare y si tengo dudas pregunto... :D

Salu2 y Gracias! :P
« Última modificación: 5 Julio 2010, 19:26 pm por *PsYkE1* » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #8 en: 5 Julio 2010, 21:53 pm »


Aun le falta...!¡.

Código:

Dim tt(100) As Double
tt(0) = 6
tt(1) = 8
tt(2) = 9
tt(3) = 10
tt(4) = 11
tt(5) = 12
tt(6) = 12
tt(7) = 12
tt(8) = 13
tt(9) = 14
tt(10) = 15
tt(11) = 16
tt(12) = 17
tt(13) = 18
tt(14) = 19
tt(15) = 19
tt(16) = 19
tt(17) = 20
tt(18) = 20
tt(19) = 21
tt(20) = 21
tt(21) = 22
tt(22) = 23
tt(23) = 24
tt(24) = 24
tt(25) = 25
tt(26) = 25
tt(27) = 25
tt(28) = 27
tt(29) = 28
tt(30) = 29
tt(31) = 31
tt(32) = 33
tt(33) = 34
tt(34) = 34
tt(35) = 35
tt(36) = 35
tt(37) = 37
tt(38) = 37
tt(39) = 38
tt(40) = 39
tt(41) = 40
tt(42) = 43
tt(43) = 43
tt(44) = 44
tt(45) = 44
tt(46) = 45
tt(47) = 45
tt(48) = 46
tt(49) = 47
tt(50) = 48
tt(51) = 48
tt(52) = 48
tt(53) = 49
tt(54) = 50
tt(55) = 50
tt(56) = 52
tt(57) = 54
tt(58) = 56
tt(59) = 56
tt(60) = 56
tt(61) = 57
tt(62) = 59
tt(63) = 60
tt(64) = 61
tt(65) = 62
tt(66) = 63
tt(67) = 64
tt(68) = 65
tt(69) = 66
tt(70) = 66
tt(71) = 67
tt(72) = 69
tt(73) = 70
tt(74) = 70
tt(75) = 72
tt(76) = 73
tt(77) = 74
tt(78) = 75
tt(79) = 75
tt(80) = 76
tt(81) = 76
tt(82) = 77
tt(83) = 80
tt(84) = 81
tt(85) = 85
tt(86) = 87
tt(87) = 88
tt(88) = 88
tt(89) = 89
tt(90) = 89
tt(91) = 91
tt(92) = 92
tt(93) = 92
tt(94) = 94
tt(95) = 94
tt(96) = 95
tt(97) = 95
tt(98) = 96
tt(99) = 96
tt(100) = 97


Resultado:

Código:

6|8~12|12|12~19|19|19|20|20|21|21~24|24|25|25|25|27~29|31|33|34|34|35|35|37|37~40|43|43|44|44|45|45~48|48|48~50|50|52|54|56|56|56|57|59~66|66|67|69|70|70|72~75|75|76|76|77|80|81|85|87|88|88|89|89|91|92|92|94|94|95|95|96|96|97|


Sangriento Infierno Lunar!¡.
En línea

The Dark Shadow is my passion.
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] Abbreviate_Numeric_Array [by *PsYkE1]
« Respuesta #9 en: 5 Julio 2010, 21:56 pm »

Si si Black! :)
Ya dije que faltaba eso aun... :P
Lo corrigo en estos dias...

Salu2! ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines