Ir para conteúdo
Fórum Script Brasil
  • 0

Ordenação De Valores


Guest Darknnez

Pergunta

Guest Darknnez

Opa, e aí galera?

O negócio é seguinte:

Estou com uma grande dúvida mais especificamente em lógica de programação e não nescessariamente na linguagem Visual Basic.

Partindo do princípio, o que eu pretendo é construir um jogo do estilo manager, para colocar em prática o meu aprendizado em VB6, nada muito sério.

Mas bati de frente com um problema.

Não consigo ordenar valores.

Por exemplo:

No "jogo" teria um form com aproximadamente 20 Labels.

Cada Label.Caption retornaria um valor diferente definido por variáveis.

Vou tentar ser mais específico.

Seria um jogo manager de F1.

Para gerar a corrida, eu teria que definir qual piloto chegou em qual posição.

As posições são representadas por cada um dos Labels.

Então.... como eu faria?

Por que a única maneira com que eu sei trabalhar, seria a seguinte:

(suponham que são apenas 4 Labels e 4 variáveis, para não dar muito trabalho)

Dim a As Integer

Dim b As Integer

Dim c As Integer

Dim d As Integer

Private Sub Command1_Click()

Randomize

a = Int(20 * Rnd) + 1

b = Int(15 * Rnd) + 1

c = Int(10 * Rnd) + 1

d = Int(5 * Rnd) + 1

If (a > B) And (a > c) And (a > d) And (b >c) And (b > d) And (c > d) Then

lbl1.Caption = "valor1"

lbl2.Caption = "valor2"

lbl3.Caption = "valor3"

lbl4.Caption = "valor4"

Endif

E assim vai...

End Sub

Mas agora, imaginem se eu tivesse que fazer isso para cada uma das 20 variáveis que seriam necessárias (lembrando que no exemplo acima eu só usei 4 para facilitar).

Daria um trabalho imenso, certo?

Portanto, eu gostaria de saber se alguém poderia me ensinar aplicar algum algoritmo de ordenação no programa.

Mas que por favor, seja bastante específico de como aplicar, para que eu possa entender.

Espero que possam me ajudar.

Obrigado.

Darknnez

Link para o comentário
Compartilhar em outros sites

  • Respostas 299
  • Created
  • Última resposta

Top Posters For This Question

Top Posters For This Question

Posted Images

Posts Recomendados

  • 0

opa. mas passou ae ou não??

da uma olhada nessa parte do codigo:

                            If (nMotor(j) - 2) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 2).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 2).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 2).custo
nMotor(j) = nMotor(j) - 2
Else
If (nMotor(j) - 3) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 3).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 3).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 3).custo
nMotor(j) = nMotor(j) - 3
Else
[/codebox]

deixando um pouco mais buntininho ela seria tipo assim:

[code]If (nMotor(j) - 2) < 0 Then
                                h(j) = 0
                            ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 2).custo Then
                                xEquipe(j).Motor = xMotor(nMotor(j) - 2).nome
                                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 2).custo
                                nMotor(j) = nMotor(j) - 2
                            ElseIf (nMotor(j) - 3) < 0 Then
                                h(j) = 0
                            ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 3).custo Then
                                xEquipe(j).Motor = xMotor(nMotor(j) - 3).nome
                                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 3).custo
                                nMotor(j) = nMotor(j) - 3
                            End If[/code]
note então q essa parte:
[code]If (nMotor(j) - 2) < 0 Then
                                h(j) = 0
                            ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 2).custo Then
                                xEquipe(j).Motor = xMotor(nMotor(j) - 2).nome
                                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 2).custo
                                nMotor(j) = nMotor(j) - 2[/code]
e essa:
[code]ElseIf (nMotor(j) - 3) < 0 Then
                                h(j) = 0
                            ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 3).custo Then
                                xEquipe(j).Motor = xMotor(nMotor(j) - 3).nome
                                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 3).custo
                                nMotor(j) = nMotor(j) - 3
                            End If[/code]
são exatamente iguais. com a unica diferenca q na de cima aparece o numero 2 e na de baixo o numero 3. então, em vez de fazer 22 codigos iguais com apenas um numero variando entre ele, porque não fazer apenas 1 codigo trocando esse numero por uma variavel?? ai pra passar pelos 22 numeros, simplesmente ponha dentro dum For. ai por exemplo, se ele executar o codigo do numero 2, pra não executar o 3, o 4, e os demais, ponha um Exit For. tipo assim:
[code]For v = 2 To 3
                            If (nMotor(j) - v) < 0 Then
                                h(j) = 0
                                Exit For
                            ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - v).custo Then
                                xEquipe(j).Motor = xMotor(nMotor(j) - v).nome
                                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - v).custo
                                nMotor(j) = nMotor(j) - v
                                Exit For
                            End If
                        Next[/code]

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz prova pra 5 vestibulares, passei em 3.

Infelizmente não passei exatamente nos dois que queria passar.

Na UFMG, minha primeira opção, eu fiz nota acima da nota de corte, mas como tirei 1 em química, acabei não passando.

E no dia da prova da PUC, segunda opção, eu passei muito mal de nervosismo e calor, e não fui bem.

Ano que vem to estudando denovo hahaha.

Mas bem, valeu pela ajuda.

Deu mais ou menos certo.

Para você entender melhor o que eu fiz, vou explicar desde o início.

Primeiro eu defini a condição financeira de cada equipe e o custo de cada piloto:


For j = 0 To UBound(xEquipe)
If xEquipe(j).finanças <= 1000 Then
xEquipe(j).situação = 2
ElseIf xEquipe(j).finanças <= 3000 Then
xEquipe(j).situação = 3
ElseIf xEquipe(j).finanças <= 5000 Then
xEquipe(j).situação = 4
ElseIf xEquipe(j).finanças <= 7000 Then
xEquipe(j).situação = 5
ElseIf xEquipe(j).finanças <= 10000 Then
xEquipe(j).situação = 6
ElseIf xEquipe(j).finanças <= 15000 Then
xEquipe(j).situação = 7
ElseIf xEquipe(j).finanças <= 20000 Then
xEquipe(j).situação = 8
ElseIf xEquipe(j).finanças > 20000 Then
xEquipe(j).situação = 9
End If
Next

For i = 0 To UBound(xPiloto)
If xPiloto(i).salário = 100 Then
xPiloto(i).situação = 0
ElseIf xPiloto(i).salário = 150 Then
xPiloto(i).situação = 1
ElseIf xPiloto(i).salário = 200 Then
xPiloto(i).situação = 2
ElseIf xPiloto(i).salário = 250 Then
xPiloto(i).situação = 3
ElseIf xPiloto(i).salário = 300 Then
xPiloto(i).situação = 4
ElseIf xPiloto(i).salário = 350 Then
xPiloto(i).situação = 5
ElseIf xPiloto(i).salário = 400 Then
xPiloto(i).situação = 6
ElseIf xPiloto(i).salário = 450 Then
xPiloto(i).situação = 7
ElseIf xPiloto(i).salário = 500 Then
xPiloto(i).situação = 8
End If
Next
[/codebox]

Assim eu posso comparar as duas e fazer com que equipes pobres não contratem pilotos caros.

Aí fiz a lógica de acordo com a sua dica, que de fato simplifica muito as coisas.

[code]For j = 0 To UBound(xEquipe)         If xEquipe(j).nome <> xJogador.equipe Then             For i = 0 To UBound(xPiloto)                 For v = 0 To 21                     If i - v >= 0 Then                         If xEquipe(j).situação >= xPiloto(i - v).situação Then                             If xEquipe(j).contrato(0) = False Then                                 If xPiloto(i - v).contrato = False Then                                     xEquipe(j).piloto(0) = xPiloto(i - v).nome                                     xPiloto(i - v).equipe = xEquipe(j).nome                                     xEquipe(j).contrato(0) = True                                     xPiloto(i - v).contrato = True                                         Exit For                                 End If                             End If                         End If                     End If                 Next             Next         End If     Next          For j = 0 To UBound(xEquipe)         If xEquipe(j).nome <> xJogador.equipe Then             For i = 0 To UBound(xPiloto)                 For v = 0 To 21                     If i - v >= 0 Then                         If xEquipe(j).situação >= xPiloto(i - v).situação Then                             If xEquipe(j).contrato(1) = False Then                                 If xPiloto(i - v).contrato = False Then                                     xEquipe(j).piloto(1) = xPiloto(i - v).nome                                     xPiloto(i - v).equipe = xEquipe(j).nome                                     xEquipe(j).contrato(1) = True                                     xPiloto(i - v).contrato = True                                     Exit For                                 End If                             End If                         End If                     End If                 Next             Next         End If     Next[/code]

Mas por algum motivo, depois que acabou a temporada (que é quando o código é lido), e no começo da outra, apareceu quie a equipe McLaren contratou 3 pilotos enquanto a equipe Honda contratou apenas 1.

Foi o único erro aparente, e eu não achei o motivo.

O que tem de errado no código?

Se quiser, te passo o projeto todo.

Valeu, mais uma vez.

Até mais.

Edit:

Testando aqui mais uma vez, não deu nada errado.

Dessa vez cada equipe contratou 2 pilotos.

Não tenho idéia do que pode ter dado errado da primeira vez, não mudei nada no código.

Edit2:

Em alguns casos, a equipe Ferrari, por exemplo, contratou 4 pilotos, a McLaren 3 pilotos, numa mesma temporada, enquanto outras equipes contrataram apenas 1 piloto.

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

caraio passou em 3?? e não vai fazer nenhum??

Edit2:

Em alguns casos, a equipe Ferrari, por exemplo, contratou 4 pilotos, a McLaren 3 pilotos, numa mesma temporada, enquanto outras equipes contrataram apenas 1 piloto.

ta, eu não entendo dessas coisas, mas se não me engano, o erro é q cada uma devia contratar 2, é isso??

quer então mandar o codigo la??

Link para o comentário
Compartilhar em outros sites

  • 0

O foda é que essas 3 que eu passei são particulares.

Então não vale a pena entrar em uma delas, ficar um ano inteiro pagando caro, pra no final do ano mudar para UFMG ou PUC.

Quanto ao jogo, vou te passar o projeto todo por MP.

E sim, cada equipe, ao final da temporada, deve contratar exatamente dois pilotos, nem mais nem menos.

E não é isso que está acontecendo. E obviamente, todos os pilotos tem que ser contratados, não pode sobrar nenhum.

Se for testar, é só não escolher nenhuma equipe para treinar no início do jogo, e roda-lo com velocidade 'Muito Rápido', pra facilitar as coisas. Se quiser também, pode reduzir o número de etapas totais de uma temporada. Assim não precisa rodar 18 corridas pra ver o erro:

If etapa = 18 Then

Só tem que reduzir esse número, que está no form PontosCorridaEquipe.

Ah! E pra ver o erro, quando acabar a temporada, no Menu de Equipes, é só clicar em 'Classificação de Pilotos', e aí vai ver que a Label de cada piloto está colorida de acordo com as cores da equipe. Portanto, se tem mais de duas Labels com cores idênticas, incluindo o ForeColor, é por que deu erro.

Deu pra entender?

É isso aí, vou te passar o projeto.

Valeu.

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

uma dica. dentro desse For, você pode por uns Exit For aqui:

    For j = 0 To UBound(xEquipe)
If xEquipe(10 - j).nome <> xJogador.equipe Then
For i = 0 To UBound(xPiloto)
For v = 0 To 21
If i - v >= 0 Then
If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then
If xEquipe(10 - j).contrato(1) = False Then
...
...
Else
Exit For 'POE AQUI
End If
End If
End If
Next
If xEquipe(10 - j).contrato(0) Then Exit For 'POE AQUI
Next
End If
Next[/codebox]

assim ele não precisa ler todos os outros pilotos depois de ter fechado o contrato.

agora não entendi porque esses dois Fors e o If depois:

[code]For i = 0 To UBound(xPiloto)
                For v = 0 To 21
                    If i - v >= 0 Then[/code]
não seria só fazer um primeiro for (só com o i) e depois usar só o i como indice?? desse jeito ele le o negocio todo 21 vezes mais. bom, mas pelo q vi aqui o problema ta nessa linha aqui:
[code]If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then[/code]

quando é pra fazer o contrato do segundo piloto, tem algumas equipes q tem a situacao menor do q a de todos os pilotos disponiveis e ai ela acaba não contratando nenhum.

depois do form da classificacao, pode aparecer alguma equipe com mais de dois pilotos porque como o contrato do piloto não é refeito, você não muda os dados dele então ele continua com a equipe da ultima temporada (a propriedade Equipe dele continua a mesma, por isso aparece a mesma cor), mas ele não tem contrato (a propriedade contrato esta False).

alias, pra q serve essa propriedade situacao??

EDITADO:

ou mas PUC não é particular tb??

Editado por kuroi
pq eu quis
Link para o comentário
Compartilhar em outros sites

  • 0
uma dica. dentro desse For, você pode por uns Exit For aqui:

    For j = 0 To UBound(xEquipe)
If xEquipe(10 - j).nome <> xJogador.equipe Then
For i = 0 To UBound(xPiloto)
For v = 0 To 21
If i - v >= 0 Then
If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then
If xEquipe(10 - j).contrato(1) = False Then
...
...
Else
Exit For 'POE AQUI
End If
End If
End If
Next
If xEquipe(10 - j).contrato(0) Then Exit For 'POE AQUI
Next
End If
Next[/codebox]

assim ele não precisa ler todos os outros pilotos depois de ter fechado o contrato.

Entendi, valeu.

agora não entendi porque esses dois Fors e o If depois:

[code]For i = 0 To UBound(xPiloto)                 For v = 0 To 21                     If i - v >= 0 Then[/code]
não seria só fazer um primeiro for (só com o i) e depois usar só o i como indice?? desse jeito ele le o negocio todo 21 vezes mais.
Olha, não sei se to pensando direito, mas se eu fizesse apenas um único For (com o i), não conseguiria fazer com que as equipes começassem 'verificando' os pilotos do mais forte até o mais fraco, por que o índice teria valor igual. Deu pra entender? Assim as equipes vão tentar contratar os pilotos mais fortes primeiro, e se não conseguirem, passam ao próximo piloto, mais fraco que o anterior.
bom, mas pelo q vi aqui o problema ta nessa linha aqui:
[code]If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then[/code]

quando é pra fazer o contrato do segundo piloto, tem algumas equipes q tem a situacao menor do q a de todos os pilotos disponiveis e ai ela acaba não contratando nenhum.

depois do form da classificacao, pode aparecer alguma equipe com mais de dois pilotos porque como o contrato do piloto não é refeito, você não muda os dados dele então ele continua com a equipe da ultima temporada (a propriedade Equipe dele continua a mesma, por isso aparece a mesma cor), mas ele não tem contrato (a propriedade contrato esta False).

alias, pra q serve essa propriedade situacao??

A propriedade situação é para evitar que as equipes mais pobres contratem pilotos com salário muito alto, para que na temporada seguinte não vão à falência. Ou seja, as equipes só contratam pilotos que tiverem em situação igual ou inferior à ela.

O problema agora é que eu tenho que corrigir esse erro que tá dando, e não sei muito bem como.

Será que se eu fizer com que as equipes que não conseguiram contratar um piloto, contratem qualquer piloto que ainda não tiver sido contratado, verificando do mais fraco ao mais forte, vai dar certo? Acho que sim.

Bem, vou tentar aqui.

Valeu mesmo kuroi.

EDITADO:

ou mas PUC não é particular tb??

A PUC também é particular, como as outras que eu passei, a diferença é que o curso dela é muito melhor que a das outras, sendo pior apenas que o curso da UFMG.

Feliz Natal atrasado, e um bom ano novo pra você.

Até mais.

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0
agora não entendi porque esses dois Fors e o If depois:

For i = 0 To UBound(xPiloto)
                For v = 0 To 21
                    If i - v >= 0 Then[/code] não seria só fazer um primeiro for (só com o i) e depois usar só o i como indice?? desse jeito ele le o negocio todo 21 vezes mais. Olha, não sei se to pensando direito, mas se eu fizesse apenas um único For (com o i), não conseguiria fazer com que as equipes começassem 'verificando' os pilotos do mais forte até o mais fraco, por que o índice teria valor igual. Deu pra entender? Assim as equipes vão tentar contratar os pilotos mais fortes primeiro, e se não conseguirem, passam ao próximo piloto, mais fraco que o anterior. entendi. os pilotos tão ordenados pela classificacao, é isso?? ai você quer pegar do indice menor (ultimo colocado) pro menor (primero), é isso?? se for é só fazer isso ó:
[code]For i = UBound(xPiloto) To 0 Step -1
com o Step -1 ele soma -1 em vez de somar 1. você pode por qualquer numero q quiser no lugar no -1. tipo isso aqui:
For i = 0 To UBound(xPiloto)
é o mesmo q
For i = 0 To UBound(xPiloto) Step 1

ou seja, pra fazer o contrario, é só comecar do maior e ir tirando 1 ate cehgar em 0.

A propriedade situação é para evitar que as equipes mais pobres contratem pilotos com salário muito alto, para que na temporada seguinte não vão à falência. Ou seja, as equipes só contratam pilotos que tiverem em situação igual ou inferior à ela.

O problema agora é que eu tenho que corrigir esse erro que tá dando, e não sei muito bem como.

Será que se eu fizer com que as equipes que não conseguiram contratar um piloto, contratem qualquer piloto que ainda não tiver sido contratado, verificando do mais fraco ao mais forte, vai dar certo? Acho que sim.

sim, então depois q acabar o For, verifica q sela não fechou o contrato. se não tiver fechado, procure o piloto disponivel com a menor situacao e contrate ele.

EDITADO:

ou mas PUC não é particular tb??

A PUC também é particular, como as outras que eu passei, a diferença é que o curso dela é muito melhor que a das outras, sendo pior apenas que o curso da UFMG.

hum, e q curso foi q você presto??

Link para o comentário
Compartilhar em outros sites

  • 0
entendi. os pilotos tão ordenados pela classificacao, é isso?? ai você quer pegar do indice menor (ultimo colocado) pro menor (primero), é isso??

se for é só fazer isso ó:

For i = UBound(xPiloto) To 0 Step -1
com o Step -1 ele soma -1 em vez de somar 1. você pode por qualquer numero q quiser no lugar no -1. tipo isso aqui:
For i = 0 To UBound(xPiloto)
é o mesmo q
For i = 0 To UBound(xPiloto) Step 1

ou seja, pra fazer o contrario, é só comecar do maior e ir tirando 1 ate cehgar em 0.

É isso mesmo!

Entendi. Vai simplificar bastante o código.

Valeu.

Só uma coisa que não ficou muito claro.

No seu post passado, você me aconselhou colocar Exit For da seguinte maneira:

    For j = 0 To UBound(xEquipe)
If xEquipe(10 - j).nome <> xJogador.equipe Then
For i = 0 To UBound(xPiloto)
For v = 0 To 21
If i - v >= 0 Then
If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then
If xEquipe(10 - j).contrato(1) = False Then
...
...
Else
Exit For 'POE AQUI
End If
End If
End If
Next
If xEquipe(10 - j).contrato(0) Then Exit For 'POE AQUI
Next
End If
Next[/codebox]

Mas não entendi direito que If é esse no final.

E não sei também, agora, se tenho que colocar um Exit For aqui:

[codebox] For j = 0 To UBound(xEquipe)
If xEquipe(10 - j).nome <> xJogador.equipe Then
For i = 0 To UBound(xPiloto)
For v = 0 To 21
If i - v >= 0 Then
If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then
If xEquipe(10 - j).contrato(1) = False Then
...
...
Exit For 'AQUI TAMBÈM?
Else
Exit For 'POE AQUI
End If
End If
End If
Next
If xEquipe(10 - j).contrato(0) Then Exit For 'POE AQUI
Next
End If
Next

sim, então depois q acabar o For, verifica q sela não fechou o contrato. se não tiver fechado, procure o piloto disponivel com a menor situacao e contrate ele.

Isso mesmo que eu vou fazer.

hum, e q curso foi q você presto??

Prestei pra Ciência da Computação.

Link para o comentário
Compartilhar em outros sites

  • 0
Mas não entendi direito que If é esse no final.

é a mesma coisa q isso ó:

If xEquipe(10 - j).contrato(0) = True Then
    Exit For
End If[/code]

só q antes eu fiz simplificado, ve se agora da pra entender.

E não sei também, agora, se tenho que colocar um Exit For aqui:

[codebox] For j = 0 To UBound(xEquipe)
If xEquipe(10 - j).nome <> xJogador.equipe Then
For i = 0 To UBound(xPiloto)
For v = 0 To 21
If i - v >= 0 Then
If xEquipe(10 - j).situação >= xPiloto(i - v).situação Then
If xEquipe(10 - j).contrato(1) = False Then
...
...
Exit For 'AQUI TAMBÈM?
Else
Exit For 'POE AQUI
End If
End If
End If
Next
If xEquipe(10 - j).contrato(0) Then Exit For 'POE AQUI
Next
End If
Next[/codebox]

é verdade, pode por sim e veja se da certo.

Prestei pra Ciência da Computação.

você mora em minas mesmo?? se por acaso você for aqui de sp, presta ciencia na unesp de bauru, acho q é um dos melhor curso do estado (e é de graca).

quando eu morava la, prestei la mas passei longe.

Link para o comentário
Compartilhar em outros sites

  • 0

Moro em Belo Horizonte/MG.

Por enquanto PUC e UFMG são as melhores opções, mas talvez mais tarde eu faça em outro estado.

E pelo o que eu saiba, o curso da UFMG também é um dos melhores do país, o 2º melhor se não me engano.

Eu queria te pedir um favor.

Tem como me mandar o link com o projeto todo da última MP que eu te mandei?

To viajando e consegui achar uma rede aqui perto, por isso nem sei se vou conseguir entrar sempre. haha

Por isso também nem testei o código do seu último post.

É isso aí.

Valeu.

EDIT:

Será que pode dar algum erro se eu continuar trabalhando no projeto, só que no VB2008?

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

Valeu.

Nem precisei do VB2008, consegui o VB6 aqui.

To com uma dúvida.

Na hora que eu ordeno as equipes na função ClassificaçãoEquipes2, os motores, pneus e combustíveis estão sendo ordenados juntos, certo? Só que eu preciso que eles não ordenem, ou seja, mantenham sempre na mesma ordem.

Pra isso, eu alterei a função da seguinte forma:

Public Function ClassificaçãoEquipe2(ByRef Vetor() As equipe, tam)
    Dim i, j, h, k
    Dim Min
    Dim aux As equipe
    Dim aux1, aux2, aux3 As Variant

    For i = 0 To tam
        Min = i
            For j = i + 1 To tam
                If Vetor(j).desempate < Vetor(Min).desempate Then Min = j
            Next j

            aux = Vetor(i)
            Vetor(i) = Vetor(Min)
            Vetor(Min) = aux
            
    '____________________MOTORES____________________
    
    xMotor(7).nome = "Ferrari"
    xMotor(7).potencia = 100
    xMotor(7).custo = 10000
    xMotor(6).nome = "Mercedes"
    xMotor(6).potencia = 95
    xMotor(6).custo = 9000
    xMotor(5).nome = "Renault"
    xMotor(5).potencia = 85
    xMotor(5).custo = 7000
    xMotor(4).nome = "Honda"
    xMotor(4).potencia = 80
    xMotor(4).custo = 6000
    xMotor(3).nome = "Toyota"
    xMotor(3).potencia = 70
    xMotor(3).custo = 4500
    xMotor(2).nome = "BMW"
    xMotor(2).potencia = 60
    xMotor(2).custo = 3500
    xMotor(1).nome = "Ford"
    xMotor(1).potencia = 45
    xMotor(1).custo = 2000
    xMotor(0).nome = "Supertec"
    xMotor(0).potencia = 30
    xMotor(0).custo = 1000
    

    '____________________PNEUS____________________
    
    xPneu(2).nome = "Bridgestone"
    xPneu(2).custo = 2000
    xPneu(2).força = 50
    xPneu(1).nome = "Michelin"
    xPneu(1).custo = 1500
    xPneu(1).força = 45
    xPneu(0).nome = "Firestone"
    xPneu(0).custo = 500
    xPneu(0).força = 25
    
    
    '____________________COMBUSTÍVEIS____________________
    
    xCombustível(4).nome = "Petrobrás"
    xCombustível(4).custo = 3000
    xCombustível(4).força = 50
    xCombustível(3).nome = "Shell"
    xCombustível(3).custo = 2500
    xCombustível(3).força = 45
    xCombustível(2).nome = "Texaco"
    xCombustível(2).custo = 1500
    xCombustível(2).força = 35
    xCombustível(1).nome = "Sasol"
    xCombustível(1).custo = 1000
    xCombustível(1).força = 30
    xCombustível(0).nome = "Esso"
    xCombustível(0).custo = 500
    xCombustível(0).força = 25
            
    Next i
    
End Function

Assim, imagino eu, sempre que eu chamar a função, os motores, pneus e combustíveis, inicialmente, irão ser ordenados de acordo com a posição das equipes, e em seguida, re-ordenados de tal forma que voltem para a ordem original, ou estou errado?

E mais uma probleminha que estou tendo.

Agora os pilotos tem salários, e as equipes patrocínios.

O primeiro problema é que o salário de cada piloto muda de acordo com sua posição na classificação final, ou seja, no final da temporada.

Mas acontece que tem piloto que não pontua durante toda a temporada, e dessa forma, a ordem nna classificação não fica correta, por que não há um critério de desempate.

O mesmo ocorre com as equipes, que de 6 em 6 corridas, tem seus patrocínios alterados de acordo com a posição na classificação. Mas da mesma forma, algumas equipes não pontuam, e ficam na ordem errada.

Tem idéia de como posso corrigir isso?

Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0
To com uma dúvida.

Na hora que eu ordeno as equipes na função ClassificaçãoEquipes2, os motores, pneus e combustíveis estão sendo ordenados juntos, certo? Só que eu preciso que eles não ordenem, ou seja, mantenham sempre na mesma ordem.

serio q ta ordenando junto?? mas acho q não precisaria ordenar... e acho q te como mudar o codigo pra não ordenar, de uma olhada ai.

o meu pc de casa foi ocupado ate o carnaval e aqui no trampo eu não tenho o seu projeto e pode ficar dificil de eu conseguir olhar quando você mandar, mas de uma olhada la no codigo q ordena... porque exatamente ta ordenando o motor junto?? ou fui q falei pra ordenar e nem lembro mais...

mas de qualquer forma esse codigo q você postou deve voltar pro estado original sim.

Mas acontece que tem piloto que não pontua durante toda a temporada, e dessa forma, a ordem nna classificação não fica correta, por que não há um critério de desempate.

O mesmo ocorre com as equipes, que de 6 em 6 corridas, tem seus patrocínios alterados de acordo com a posição na classificação. Mas da mesma forma, algumas equipes não pontuam, e ficam na ordem errada.

Tem idéia de como posso corrigir isso?

como assim não fica correta?? se tem por exemplo tres pilotos q não pontuam, os tres tem q ficar nas tres ultimas colocacoes certo?? os tres tariam empatados, nenhum taria na frente de outro.

ai você não pode fazer um salario baseado na pontuacao?? ai você especifica um salario pra quem não tiver ponto.

Link para o comentário
Compartilhar em outros sites

  • 0
serio q ta ordenando junto?? mas acho q não precisaria ordenar... e acho q te como mudar o codigo pra não ordenar, de uma olhada ai.

o meu pc de casa foi ocupado ate o carnaval e aqui no trampo eu não tenho o seu projeto e pode ficar dificil de eu conseguir olhar quando você mandar, mas de uma olhada la no codigo q ordena... porque exatamente ta ordenando o motor junto?? ou fui q falei pra ordenar e nem lembro mais...

mas de qualquer forma esse codigo q você postou deve voltar pro estado original sim.

Na verdade eu falei errado. Os motores, combustíveis e pneus não estão sendo ordenados juntos.

Mas olha o que acontece:

Eu defini no início do projeto que o motor da Equipe(0) é o Motor(3), por exemplo. E o da Equipe(1) é o Motor(2).

Quando a corrida acaba, as equipes são ordenadas de acordo com a pontuação total delas, certo? Então quando isso acontece, se a Equipe(0) passa para o 2º lugar do campeonato, ela passa a ser a Equipe(1), e portanto seu motor passa a ser o Motor(2). Ficou confuso?

como assim não fica correta?? se tem por exemplo tres pilotos q não pontuam, os tres tem q ficar nas tres ultimas colocacoes certo?? os tres tariam empatados, nenhum taria na frente de outro.

ai você não pode fazer um salario baseado na pontuacao?? ai você especifica um salario pra quem não tiver ponto.

Imagine a situação:

Um PilotoX termina todas as corridas do campeonato em 10º lugar, e um PilotoY termina todas em 20º lugar.

Como apenas os 8 primeiros pontuam na corrida, nenhum dos dois pontuou, certo?

Teoricamente, o PilotoX foi muito melhor que o PilotoY no decorrer do campeonato, já que terminou sempre na frente, e seu salário deveria ser maior.

Mas o que acontece é que, se por acaso o PilotoY, na última corrida, terminar na frente do PilotoX, na ordem da tabela de classificação, o PilotoY fica na frente do PilotoX, e assim seu salário será maior. Esse é o erro.

O mesmo acontece com as equipes que não pontuam.

Ou seja, aquela que termina na frente na última corrida do campeonato, terá o salário maior, mesmo tendo sido pior que uma determinada equipe durante toda a temporada.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu defini no início do projeto que o motor da Equipe(0) é o Motor(3), por exemplo. E o da Equipe(1) é o Motor(2).

Quando a corrida acaba, as equipes são ordenadas de acordo com a pontuação total delas, certo? Então quando isso acontece, se a Equipe(0) passa para o 2º lugar do campeonato, ela passa a ser a Equipe(1), e portanto seu motor passa a ser o Motor(2). Ficou confuso?

entendi, mas você não precisa mexer no xMotor. não to lembrado agora, como você sabe q o motor da equipe 0 é o 3?? tipo, onde você guarda?? você não tem um type equipe?? não é la q você guarda?? se for, quando você ordenar a equipe, o motor vai junto.

Um PilotoX termina todas as corridas do campeonato em 10º lugar, e um PilotoY termina todas em 20º lugar.

Como apenas os 8 primeiros pontuam na corrida, nenhum dos dois pontuou, certo?

Teoricamente, o PilotoX foi muito melhor que o PilotoY no decorrer do campeonato, já que terminou sempre na frente, e seu salário deveria ser maior.

Mas o que acontece é que, se por acaso o PilotoY, na última corrida, terminar na frente do PilotoX, na ordem da tabela de classificação, o PilotoY fica na frente do PilotoX, e assim seu salário será maior. Esse é o erro.

O mesmo acontece com as equipes que não pontuam.

Ou seja, aquela que termina na frente na última corrida do campeonato, terá o salário maior, mesmo tendo sido pior que uma determinada equipe durante toda a temporada.

a é verdade nesse caso então tem q ter sim algum esquema de desempate. alias, já não tinha um engocio desse, ou era só pra equipe??

Link para o comentário
Compartilhar em outros sites

  • 0
entendi, mas você não precisa mexer no xMotor. não to lembrado agora, como você sabe q o motor da equipe 0 é o 3?? tipo, onde você guarda?? você não tem um type equipe?? não é la q você guarda?? se for, quando você ordenar a equipe, o motor vai junto
É assim:

xEquipe(0).Motor = xMotor(6).nome
xEquipe(10).Motor = xMotor(0).nome

No final da corrida, somando os pontos de cada piloto, a ordem das equipes é alterada de acordo com a classificação.

Ou seja, a primeira equipe da classificação se torna a xEquipe(10), e a última se torna a xEquipe(0).

Com isso, a xEquipe(0) que tinha o xMotor(6), passa a ter o xMotor(0), e esse é o problema.... ou não?

a é verdade nesse caso então tem q ter sim algum esquema de desempate. alias, já não tinha um engocio desse, ou era só pra equipe??

Era só para a equipe, mas apenas no form em que aparecem as pontuações de cada equipe na última corrida.

E eu não sei fazer para esse caso específico.

Tentei fazer igual e não consegui.

Link para o comentário
Compartilhar em outros sites

  • 0
xEquipe(0).Motor = xMotor(6).nome
xEquipe(10).Motor = xMotor(0).nome[/code]

No final da corrida, somando os pontos de cada piloto, a ordem das equipes é alterada de acordo com a classificação.

Ou seja, a primeira equipe da classificação se torna a xEquipe(10), e a última se torna a xEquipe(0).

Com isso, a xEquipe(0) que tinha o xMotor(6), passa a ter o xMotor(0), e esse é o problema.... ou não?

entendi, mas tem certeza q a equipe 0 fica mesmo com o motor 0?? porque se você ta usando a funcao q ordena, declarando o parametro como sendo do seu type equipe, e passa o vetor da equipe como parametro, ele vai ordenar e passar tudo junto.

por exemplo, se o motor 6 chama "Motor 6", a propriedade Motor do indice 0 ficara sendo "Motor 6". quando você mudar o indice de lugar, todos os dados de todas as propriedades vao juntos, inclusive o valor "Motor 6" q vai estar na propriedade motor.

Era só para a equipe, mas apenas no form em que aparecem as pontuações de cada equipe na última corrida.

E eu não sei fazer para esse caso específico.

Tentei fazer igual e não consegui.

você pode fazer um igual pro piloto sim, qual o problema q você ta tendo??

se precisar, some umas decimais na pontuacao, mas mostre sempre o valor inteiro.

ponha uns valores q nunca cheguem em 1.

por exemplo, não sei qual a classificacao mais q o cara não ganha ponto, mas faz de conta q é a 10.

do 10 ate o 22 são 13 pilotos. então some pro primeiro desses, 0.0012, pro segundo, some 0.0011 ate chegar no penulitmo q você somaria 0.0001 e no ultimo q você não somaria nd.

ou faca uma propriedade a mais de desempate e some os numero inteiros 13, 12, 11, ..., 1, 0 e, quando o piloto tiver 0 pontos, considere essa pontuacao.

Link para o comentário
Compartilhar em outros sites

  • 0
entendi, mas tem certeza q a equipe 0 fica mesmo com o motor 0?? porque se você ta usando a funcao q ordena, declarando o parametro como sendo do seu type equipe, e passa o vetor da equipe como parametro, ele vai ordenar e passar tudo junto.

por exemplo, se o motor 6 chama "Motor 6", a propriedade Motor do indice 0 ficara sendo "Motor 6". quando você mudar o indice de lugar, todos os dados de todas as propriedades vao juntos, inclusive o valor "Motor 6" q vai estar na propriedade motor.

Se você tá dizendo então é por que tá certo.

Eu não sabia que as propriedades são alteradas juntamente com os índices.

você pode fazer um igual pro piloto sim, qual o problema q você ta tendo??

se precisar, some umas decimais na pontuacao, mas mostre sempre o valor inteiro.

ponha uns valores q nunca cheguem em 1.

por exemplo, não sei qual a classificacao mais q o cara não ganha ponto, mas faz de conta q é a 10.

do 10 ate o 22 são 13 pilotos. então some pro primeiro desses, 0.0012, pro segundo, some 0.0011 ate chegar no penulitmo q você somaria 0.0001 e no ultimo q você não somaria nd.

ou faca uma propriedade a mais de desempate e some os numero inteiros 13, 12, 11, ..., 1, 0 e, quando o piloto tiver 0 pontos, considere essa pontuacao.

Hmmm.... realmente simples.

Só uma dúvida que eu tenho: como devo declarar a variável pontos?

Se eu declarar como integer, o valor da variável é arredondado ou apenas não aparecem as casas decimais?

Link para o comentário
Compartilhar em outros sites

  • 0
Se você tá dizendo então é por que tá certo.

Eu não sabia que as propriedades são alteradas juntamente com os índices.

hum, mas ve ai se fica certo mesmo.

Só uma dúvida que eu tenho: como devo declarar a variável pontos?

Se eu declarar como integer, o valor da variável é arredondado ou apenas não aparecem as casas decimais?

declara como Single ou Double. o Double suporta valores bem gdes, acho q no seu caso pode ser Single.

Link para o comentário
Compartilhar em outros sites

  • 0

Olha só, to com um problema.

Tenho certeza que é estúpido, até mais do que eu imagino, mas não to conseguindo ver a solução nem f*****!

Eu to fazendo um Frame que mostra os vencedores e segundo-colocados de cada corrida da temporada.

E eu quero que as Labels só fiquem visíveis depois que a respectiva corrida aconteça.

Ou seja, a label do circuito 10 só aparece depois que a 10ª corrida acontecer.

Para isso, fiz:

For g = 0 To 16
    If g = (nCircuito - 1) Then
        Me.Controls("lblCircuito" & (g + 1)).Visible = True
        Me.Controls("lblVencedor" & (g + 1)).Caption = xCircuito(nCircuito - 1).vencedor
        Me.Controls("lblSegundo" & (g + 1)).Caption = xCircuito(nCircuito - 1).segundo
        
        For i(7) = 0 To UBound(xPiloto)
            For j = 0 To UBound(xEquipe)
                If xPiloto(i(7)).nome = xCircuito(nCircuito - 1).vencedor Then
                    If xPiloto(i(7)).equipe = xEquipe(j).nome Then
                        Me.Controls("lblVencedor" & (g + 1)).BackColor = xEquipe(j).Cor1
                        Me.Controls("lblVencedor" & (g + 1)).ForeColor = xEquipe(j).Cor2
                    End If
                ElseIf xPiloto(i(7)).nome = xCircuito(nCircuito - 1).segundo Then
                    If xPiloto(i(7)).equipe = xEquipe(j).nome Then
                        Me.Controls("lblSegundo" & (g + 1)).BackColor = xEquipe(j).Cor1
                        Me.Controls("lblSegundo" & (g + 1)).ForeColor = xEquipe(j).Cor2
                    End If
                End If
            Next
        Next
    End If
Next

E tá tudo certinho. Os nomes dos pilotos aparecem, o nome do circuito aparece, e as cores das equipes de cada piloto também aparecem corretamente.

O problema é que quando a 10ª corrida (por exemplo) acaba, não só as respectivas labels aparecem corretamente, como as labels da corrida passada somem, e isso não era pra acontecer. Deu pra entender mais ou menos?

Por que isso acontece?

Link para o comentário
Compartilhar em outros sites

  • 0

Vou te mandar lá.

Não precisa ter pressa.

Só tem um problema.

Não sei por que, mas quando eu compacto a pasta do jogo aqui no winrar, ta ficando com tamanho de 681Kb, enquanto quando eu compacto em casa, fica uns 40Kb.

Será por causa da versão diferente do VB?

Bem, pra ver o erro, é só rodar as corridas do jogo normalmente, e clicar no botão 'Temporada Atual' no MenuEquipe.

Aí vai ver o erro que eu falei no post passado.

Valeu.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...