Ayuda con un algoritmo

Iniciado por $Edu$, 23 Octubre 2011, 03:50 AM

0 Miembros y 1 Visitante están viendo este tema.

$Edu$

La cosa es asi:

Estoy haciendo un programa para realizar torneos de futbol, el cual llego a contener 3 arrays, uno String y los otros dos Integer.

Player()   Score()   Ranking()

Player(0) = "Real Madrid"  ' nombre equipo
Score(0) = 8 ' goles total (a favor - en contra)
Ranking(0) = 6 ' puntos en la tabla de su grupo

Player(1) = "Barcelona"  ' nombre equipo
Score(1) = 12 ' goles total (a favor - en contra)
Ranking(1) = 9 ' puntos en la tabla de su grupo

............
............

Los primeros 4 equipos ( index 0 to 3) pertenecen al grupo A, los siguientes 4 (index 4 to 7) pertenecen al grupo B y todo asi..

Necesito hacer que clasifiquen 16, por lo que supongamos que los equipos sean 28 en total, clasificarian el Primero y el Segundo de cada grupo, por lo que irian 14 (28 / 2) y entonces necesito sacar el Primer Mejor Tercero y el Segundo Mejor Tercero de TODOS.

Como lo harian? porque lo veo poco profesional hacer un switch case con el maximo de Player() para saber cuantos jugadores hay y de ahi dividir ese array en otros arrays grupoA() , grupoB(), etc. para luego sacar sacar los 2 mejores de cada grupo. Esto se puede solucionar usando un bucle al Player() sabiendo que de i = 0 to 3 es el grupo A y todo asi como dije antes, pero no logro hacerlo :/

BlackZeroX

#1
.
Si quieres hacer un tipo desglose similar a el que te pongo (Por que la verdad no te entendi ni madres!¡.)...



Se lee de abajo hacia arriba donde:
* Cada numero es un usuario.
* El "-" seria un "versus".
* El numero de la parte superior seria el usuario ganador.
          5
         1-5
   1-4         5-8
1-2   3-4   5-6   7-8



* Breve Critica:
-> Hablas sobre profesionalidad pero no te haz tomado unos minutos para diseñar la ESTRUCTURA DE LOS DATOS, es decir creaste 3 arrays... pero bueno.
* Consejo
-> Sera mejor que DISEÑES las estructuras de los datos... si lo haces asi es confuso y el mantenimiento del codigo es horrendo sin mencionar que el entrelazado de datos es confuso, almenos que seas el que lo programo... pero a la larga no importa quien sea no le entendera.

Código (Vb) [Seleccionar]


Private Type tUserInfo
    sNombre     As String
    oTeam       As cTeam        '   //  Referencia a la Clase(GLOBAL) que contiene los detalles del equipo al que pertenece este usuario.
    oStatistics As cStatistics  '   //  Referencia a la Clase(UNICA) que contiene las estadisticas generales de este usuario.
End Type



Una vez hecho esto CON UN SOLO VECTOR/ARRAY de tUserInfo y dentro de oStatistics (Como seria obvio llevar una estadistica del usuario X como las rondas, ID (Index en el Vector/Array), partidas ganas Contra X persona etc.., score, etc)... no tendras ninguna dificultad de obtener la informacion o con quien competiria en X ronda.

Dulces Lunas!¡.
The Dark Shadow is my passion.

seba123neo

con una base de datos, aunque sea chica te ahorras todo eso de array y demas chapuzas y aparte lo podes hacer mas complejos , sacar estadisitcas, hacer lo que quieras con una simple consulta SQL.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

$Edu$

Perdon BlackZeroX si no me entendiste bien, y acepto tu critica, dices que en vez de usar los 3 arrays que uso, lo hubiera hecho mas profesional usando lo que comentas. Y puede ser pero ahora por falta de profesionalidad tendria q modificar mucho codigo anterior, el proyecto es largo y este problema que tengo lo tengo en el final por lo que tendria que cambiar muchas cosas para establecer bien el diseño de datos como dices.
Pero no seria lo mismo a la hora de recorrer con un bucle, revisar Player(i).Ranking que usarlos por separados? total estan al mismo nivel, es decir para Player(7) le corresponde a Ranking(7).
En fin, razon tienes razon pero bueno.


Lo que me dices seba123neo creo que lo hare cuando haga otra version ya que ahora lo necesito crear cuanto antes pero muchas gracias.

Aca les dejo un codigo para el que quiera hacer la funcion:

Código (vb) [Seleccionar]

Option Explicit

Dim Player(27) As String ' El tamaño variara en estos casos: 7 - 11 - 15 - 19 - 23 - 27 - 31
Dim Score(27) As Integer ' que son los posibles equipos que habra siempre
Dim Ranking(27) As Integer ' esto tenerlo en cuenta al hacer operaciones en la funcion a realizar


Private Sub Form_Load()

Dim i As Integer
Dim caracter As Integer
Dim Octavos() As String ' aca guardaremos los clasificados

caracter = 65

' A continuacion los bucles son para llenar los arrays con contenido como los que contendra
' en mi aplicacion original

For i = 0 To UBound(Player) ' cargamos los equipos
    Player(i) = Chr$(caracter)
    caracter = caracter + 1
Next

For i = 0 To UBound(Score) ' ponemos un score a cada uno
    Randomize Time
    Score(i) = CInt(Rnd() * 20)
Next

For i = 0 To UBound(Ranking) ' ponemos puntos a cada uno
    Randomize Time
    Ranking(i) = CInt(Rnd() * 9)
Next

'--------------------------------------------------------------
Debug.Print String(20, "#") ' Mostramos la lista de equipos con sus puntajes y goles
    For i = 0 To UBound(Player)
        Debug.Print Player(i) & " - " & Score(i) & " - " & Ranking(i)
    Next
Debug.Print String(20, "/")
'--------------------------------------------------------------

Octavos = Clasificados(Player(), Score(), Ranking()) ' guardamos los clasificados

Debug.Print "Clasificados para octavos de final: "

'For i = 0 To UBound(Octavos) ' mostrar clasificados
'Debug.Print Octavos(i)
'Next

Debug.Print String(20, "#")

End Sub

Private Function Clasificados(Player() As String, Score() As Integer, Ranking() As Integer) As String()
' Devolvera un String() con los Primeros y Segundos de cada Grupo mas en este caso
' al ser 28 equipos.. el Primer Mejor Tercero y el Segundo Mejor tercero de TODOS
Dim i As Integer
Dim Todos() As String

  ' Dim p As Long    'Aca les dejo comentado el codigo para ordenar un array
   ' Dim c As Long   ' de menor a mayor, con el metodo Burbujeo por si sirve
   ' Dim h As Long
   
   ' For p = 1 To (UBound(Ranking) - 1)
   '     For c = 1 To (UBound(Ranking) - 1)
    '        If Ranking(c) > Ranking(c + 1) Then
    '            h = Ranking(c)
    '            Ranking(c) = Ranking(c + 1)
     '           Ranking(c + 1) = h
     '       End If
     '   Next c
   ' Next p

Clasificados = Todos()

End Function



79137913

HOLA!!!

No hice exactamente lo que pedias, mi funcion te devuelve un array con todos los primeros en el indice (0,x) todos los segundos en el indice (1,x) y los terceros ordenados en el indice (2,x)
Código (vb) [Seleccionar]
Private Function Clasificados(Player() As String, Score() As Integer, Ranking() As Integer) As Long()
Dim W, X, Y, Z As Integer
Dim Todos() As Long
Dim AuxP(3) As Long
Dim AuxI(3) As Long
Dim Aux As Long
ReDim Todos(2, ((UBound(Player) + 1) / 4) - 1)

'ORDENO EN TODOS DE LA SIGUIENTE MANERA
'TODOS(0,X) = JUGADORES PRIMEROS DE CADA ZONA
'TODOS(1,X) = JUGADORES SEGUNDOS DE CADA ZONA
'TODOS(2,X) = JUGADORES TERCEROS DE CADA ZONA

For X = 0 To UBound(Player) Step 4
    For Y = 0 To 3
        AuxP(Y) = Ranking(X + Y)
        AuxI(Y) = X + Y
    Next
    For Y = 0 To 3
        For Z = 0 To 3
            If AuxP(Y) > AuxP(Z) Then
                Aux = AuxP(Y)
                AuxP(Y) = AuxP(Z)
                AuxP(Z) = Aux
                Aux = AuxI(Y)
                AuxI(Y) = AuxP(Z)
                AuxI(Z) = Aux
            End If
        Next
    Next
    For W = 0 To 2
        If AuxP(W) <> AuxP(W + 1) Then
            Todos(W, ((X + 1) / 4) - 1) = AuxI(W)
        Else
            If Score(AuxI(W)) > Score(AuxI(W + 1)) Then
                Todos(W, ((X + 1) / 4) - 1) = AuxI(W)
            Else
                Todos(W, ((X + 1) / 4) - 1) = AuxI(W + 1)
            End If
        End If
    Next
Next

'ORDENO LOS TERCEROS (POR QUE LOS OTROS NO SE NECESITAN ORDENADOS
For X = 0 To 3
    For Y = 0 To 3
        If Ranking(Todos(2, X)) > Ranking(Todos(2, Y)) Then
                Aux = Todos(2, X)
                Todos(2, X) = Todos(2, Y)
                Todos(2, Y) = Aux
        End If
    Next
Next
For X = 0 To 2
    For W = 0 To 2
        If Ranking(Todos(2, W)) = Ranking(Todos(2, W + 1)) Then
            If Score(Todos(2, W)) < Score(Todos(2, W + 1)) Then
                Aux = Todos(2, W)
                Todos(2, W) = Todos(2, W + 1)
                Todos(2, W + 1) = Aux
            End If
        End If
    Next
Next
Clasificados = Todos()
'DEVUELVE:
'TODOS: 0                          1                          2
'X    PRIMERO GRUPO X      SEGUNDO GRUPO X            TERCERO EN ORDEN


End Function


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

BlackZeroX

Cita de: $Edu$ en 23 Octubre 2011, 14:17 PM

Pero no seria lo mismo a la hora de recorrer con un bucle, revisar Player(i).Ranking que usarlos por separados? total estan al mismo nivel, es decir para Player(7) le corresponde a Ranking(7).


Si mesclas las clases con SQL es decir mezclar mi idea con la seba123neo uff, mira que se vera mas "Bonito" y entendible, claro no tendriasn que ser estructuras si no puras clases, con una clase connect... pero bueno jeje, entre mi idea y la de seba123neo ya tengo una idea para futuro!¡.

Dulces Lunas!¡.
The Dark Shadow is my passion.

$Edu$

Si BlackZeroX, cuando haga la version 2 mejorare todo el codigo, ahora simplemente quiero que funcione :P Gracias!

Y 7913.. sin palabras como siempre, no lo he probado pero por ayudarme siempre gracias y ya te aviso si me funciono ;)

$Edu$

Ya solucione, digamos que hice ordenamiento burbujeo varias veces xD

Gracias por todo!