Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Bazooka en Abril 19, 2011, 08:04:06 am
-
Hola amigos tengo esta rutina de ordenamiento que me funciona perfecto le paso una array como referencia separado con coma (,) como este:
9,1,6,13,11,21,39,31,38,48,57,54,63,79,65
y me devuelve esto:
1\6\9\11\13\21\31\38\39\48\54\57\63\65\79
que estaría perfecto para algunos casos Ahora necesito modificar esa rutina para que me ordene de forma progresiva de a decenas pero de manera aleatoria por los numeros de cada decena, (complicado de explicar) vamos a un ejemplo:
necesitaria que me devuelva algo como esto :
1\9\6\13\11\21\38\31\39\48\54\57\63\65\79
o
9\6\1\11\13\21\31\38\39\48\54\57\63\65\79
o
6\1\9\11\13\21\31\38\39\48\54\57\63\65\79
Ordenados en grupos de decenas pero mezclados dentro de cada decena!!!!
Esta es el procedimiento que estoy usando!
Public Sub OrdenarArray(ByRef pvarArray As Variant, Optional ByVal plngLeft As Long, Optional ByVal plngRight As Long)
Dim lngFirst As Long
Dim lngLast As Long
Dim varMid As Variant
Dim lngIndex As Long
Dim varSwap As Variant
Dim a As Long
Dim b As Long
Dim c As Long
If plngRight = 0 Then
plngLeft = LBound(pvarArray)
plngRight = UBound(pvarArray)
End If
lngFirst = plngLeft
lngLast = plngRight
lngIndex = plngRight - plngLeft + 1
a = Int(lngIndex * Rnd) + plngLeft
b = Int(lngIndex * Rnd) + plngLeft
c = Int(lngIndex * Rnd) + plngLeft
If CByte(pvarArray(a)) <= CByte(pvarArray(b)) And CByte(pvarArray(b)) <= CByte(pvarArray(c)) Then
lngIndex = b
Else
If CByte(pvarArray(b)) <= CByte(pvarArray(a)) And CByte(pvarArray(a)) <= CByte(pvarArray(c)) Then
lngIndex = a
Else
lngIndex = c
End If
End If
varMid = pvarArray(lngIndex)
Do
Do While CByte(pvarArray(lngFirst)) < CByte(varMid) And CByte(lngFirst) < CByte(plngRight)
lngFirst = lngFirst + 1
Loop
Do While CByte(varMid) < CByte(pvarArray(lngLast)) And CByte(lngLast) > CByte(plngLeft)
lngLast = lngLast - 1
Loop
If lngFirst <= lngLast Then
varSwap = CByte(pvarArray(lngFirst))
pvarArray(lngFirst) = CByte(pvarArray(lngLast))
pvarArray(lngLast) = CByte(varSwap)
lngFirst = lngFirst + 1
lngLast = lngLast - 1
End If
Loop Until lngFirst > lngLast
If (lngLast - plngLeft) < (plngRight - lngFirst) Then
If plngLeft < lngLast Then OrdenarArray pvarArray, plngLeft, lngLast
If lngFirst < plngRight Then OrdenarArray pvarArray, lngFirst, plngRight
Else
If lngFirst < plngRight Then OrdenarArray pvarArray, lngFirst, plngRight
If plngLeft < lngLast Then OrdenarArray pvarArray, plngLeft, lngLast
End If
End Sub
desde yá muchas gracias!!! :)
-
parece complicada la cosa nadie me tira una piola.....
-
io si te entendi que es lo que quieres!! pero la verdad!! no le encuentro sentido!! si tienes la cadena desordenada es para ordenarla no para medio ordenarla!! aparte que no muxo tengo experiencia con vectores y matrices pero deja investigo un poco y hago uno q otro ejercicio y a ver si te puedo ayudar
-
Gracias wolf_kof puede parecer sin sentido por que no conoces el contecto en el que se aplica. pero es así tal como lo plantee al ejercicio es como si tendrias 10 cajas una por cada decena y debo ordenar las cajas pero no los numeros que estan dentro de ellas.
-
No se lo que quieres hacer XD
Pero yo crearía un procedimiento que recorra la matriz con un for y que coja los datos de 3 en 3 y que luego los cambie al modo que quieres.
seria algo asi:
Seleccionardatos()
dim m as integer
dim primerdato as integer
dim segundodato as integer
dim tercerdato as integer
for m = 0 to matriz(indexdelultimodato) step 3
primerdato= matriz(m)
segundodato = matriz (m+1)
tercerdato= matriz(m+2)
OrdenarComotuQuieres(primerdato,SegundoDato,tercerDato)
next m
Y luego el procedimeinto OrdenarComoTuquieres(dato1 as integer,dato2 asinteger, dato3 as integer)
no lo he probado porke no se exactamente lo que quieres(de hecho lo he escrito directamente en el post.
Espero haberte ayudado.
Juan Luis
-
Hola antes que nada acá te presento una idea que te podría ayudar.
Si lo que quieres es separar los datos en decenas puedes hacer un ciclo sobre tu arreglo y hacer una división entera sobre cada dato en tu arreglo esto te dará la decena a la que pertenece por ejemplo 0,1,2,3,4,5,6,7,8,9 pertenecen ala "decena" 0 ya que cualquier 0-9 \ 10 =0. lastima que en vb6 no tienes matrices asociativas ( no se si existan) pero quizás puedas usar las estructuras de datos para hacerlo =) y hacer extender el limite ya que el código que te pongo esta limitado a ordenarte números del 0-109 tomando como criterio a que decena pertenecen
Este código te pongo es para ejemplificar como puede ser una solución. no he leído el código que tu pones así que si suena esto incoherente ya sabemos por que =) utilizo una arreglo de string (a falta de diseñar una estructura de datos) para ir guardando los números que si te das cuenta no son ordenados ni aleatorios mas bien se van agregando conforme su lugar en el arrreglo, pero teniendo por decenas ya puedes implementar otro algoritmo que los mueva aleatoriamente.
Private Sub Form_Load()
Dim ordenados(10) As String
Dim numero(10) As Integer
numero(0) = 9
numero(1) = 6
numero(2) = 12
numero(3) = 1
numero(4) = 3
numero(5) = 5
numero(6) = 17
numero(7) = 25
numero(8) = 15
numero(9) = 23
numero(10) = 2
For i = 0 To 10
decena = numero(i) \ 10
ordenados(decena) = ordenados(decena) + Str(numero(i)) + ", "
Next i
For i = 0 To 10
If ordenados(i) <> "" Then
MsgBox ordenados(i)
End If
Next i
End Sub
Saludos espero te sirva y me gustaría mucho pusieras en contexto para que es que sirve esto en la vida practica por favor :P.