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
Guest Visitante

Deu um problema no código acima, uma parte foi substituída por um emoticon.

O correto seria:

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

Link para o comentário
Compartilhar em outros sites

  • 0

é cara, a primeira coisa é que em vez de usar 4 variaveis, use um array. tipo, em vez de declarar a, b, c, d, declare a(3), por exemplo, e acesse a(0), a(1), a(2), a(3)

e quanto a como ordenar, usando arrays existem varios metodos já desenvolvidos, o mais famoso é o método bolha. da uma olhada nesse tópico que deve ajudar:

http://scriptbrasil.com.br/forum/index.php?showtopic=83195

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Darknnez

Eu já pesquisei esses métodos muito antes de vir aqui fazer minha pergunta.

O problema, é que, mesmo entendendo alguns, eu não sei como aplicá-los.

Eu gostaria de um exemplo básico da aplicação desses métodos.

Mas valeu, pela ajuda, vou ler este tópico que você me passou.

Darknnez

Link para o comentário
Compartilhar em outros sites

  • 0

então, da uma olhada no link da wikipedia http://pt.wikipedia.org/wiki/Algoritmo_de_...na%C3%A7%C3%A3o que tinha no otro tópico.

la tem varios metodos explicados e com exemplos de codigo. hum, o metodo bolha não tem exemplo em VB mas tem em ASP que é praticamente igual, alem de que, no google, você deve encontrar exemplos em VB de qualquer um dos metodos.

ai é so adaptar no seu codigo, não tem segredo. qualquer coisa pergunta aí.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Darknnez

Eu também já havia pesquisado nesse link que você passou.

Um método que eu achei com exemplo em VB é o Selection Sort:

Public Function SelectionSort(Vetor(), tam)

Dim i, j

Dim min, aux

For i = 0 To tam

min = i

For j = i + 1 To tam

If Vetor(j) < Vetor(min) Then min = j

Next j

aux = Vetor(i)

Vetor(i) = Vetor(min)

Vetor(min) = aux

Next i

End Function

O que eu to tentando dizer, é que eu olho esse exemplo, entendo ele, mas não sei como aplica-lo. Se fosse tão simples assim, era só copiar e colar no programa, que tudo ficava certo. Mas infelizmente não é.

O que eu vou, perguntar, novamente, é como eu aplico esse exemplo acima, ou qualquer outro método, no programa?

Como VOCÊ faria, se fosse você quem quisesse fazer o que eu pretendo?

Desculpa se parece que eu estou querendo tudo mastigado e pronto.

Mas é que todo mundo que eu pergunto me responde da mesma maneira, com os mesmos exemplos, e no final das contas, eu continuo sem conseguir fazer o que quero.

Valeu pela ajuda, mais uma vez.

Darknnez

Link para o comentário
Compartilhar em outros sites

  • 0

é o seguinte, você não precisa alterar nd nesse codigo que você pegou. ela é uma funcao que vai ordenar o vetor pra você. você deve copia-la igualzinha por seu programa.

o que ele faz?? exemplo, você cria um array com 4 posicoes. e seta valores aleatorios pra ele. tipo assim:

x(0) = 1
    x(1) = 100
    x(2) = -5
    x(3) = 44[/code] ai você chama essa funcao e passa o vetor pra ela como parametro:
[code]SelectionSort x(), 3
sendo que o primeiro parametro deve ser o vetor, e o segundo o numero do maior indice dele. depois de rodar a funcao, ele retornara o vetor ordenado assim:
x(0) = -5
    x(1) = 1
    x(2) = 44
    x(3) = 100[/code] entendeu?? é simples, você passa o vetor desordenado que ele fica ordenado. ai em vez de criar as 4 variaveis, você cria 1 so do tipo array. ai em vez de todo aquele codigo que você estava fazendo:
[code]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
você vai precisar duma unica linha
SelectionSort a(), 3

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Darknnez

Hmm... ok.

Estou tentando fazer isso.

Mas quando eu chamo a função:

Public Function SelectionSort(x(), 3)

Aparece a seguinte mensagem de erro:

"Compile error:

Expected: identifier"

Por que isso?

Link para o comentário
Compartilhar em outros sites

  • 0

não, não, não, você so vai escrever Public Function na frente quando for pra declarar. pra chamar, é so digitar o nome.

simplesmente assim, e sem parenteses:

SelectionSort x(), 3

alias, tava vendo agora, se você não alterou direto na funcao, o array que deve ser passado deve ser do tipo Variant. então na hora de declara-lo crie como Variant, ou não especifique o tipo.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Darknnez

Ok.

E ficaria assim então?

Option Explicit

Dim x(3) As Variant

Public Function SelectionSort(Vetor(), tam)

SelectionSort x(), 3

x(0) = 1

x(1) = 100

x(2) = -5

x(3) = 44

Dim i, j

Dim min, aux

For i = 0 To tam

min = i

For j = i + 1 To tam

If Vetor(j) < Vetor(min) Then min = j

Next j

aux = Vetor(i)

Vetor(i) = Vetor(min)

Vetor(min) = aux

Next i

End Function

Link para o comentário
Compartilhar em outros sites

  • 0

não não não. a funcao deve ficar separado do codigo. funcoes são tipo codigos já preparados pra serem chamados em qualquer parte do programa. o melhor é adicionar um Module no seu projeto e deixar ela la. já que o Module serve exclusivamente pra declaracao de variaveis e funcoes publicas. mas você pode por no seu proprio formulario, mas não pode ser dentro de nenhuma sub. seria tipo assim:

Option Explicit
Dim x(3) As Variant
Private Sub Command1_Click()
     Randomize
     x(0) = Int(20 * Rnd) + 1
     x(1) = Int(15 * Rnd) + 1
     x(2) = Int(10 * Rnd) + 1
     x(3) = Int(5 * Rnd) + 1

     SelectionSort x(), 3

     lbl1.Caption = x(0)
     lbl2.Caption = x(1)
     lbl3.Caption = x(2)
     lbl4.Caption = x(3)
End Sub


Public Function SelectionSort(Vetor(), tam)
     Dim i, j
     Dim min, aux

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

          aux = Vetor(i)
          Vetor(i) = Vetor(min)
          Vetor(min) = aux
     Next i
End Function[/code]

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, agora já cadastrado, vou emendar outra pergunta. :P

Voltando ao código:

lbl1.Caption = x(0)
lbl2.Caption = x(1)
lbl3.Caption = x(2)
lbl4.Caption = x(3)

Dessa forma, o maior número sempre é atribuído ao x(3), o segundo maior número ao x(2), etc.

Mas que eu queria é que, como um "jogo" de F1, cada uma das Labels representassem a posição final de cada piloto na corrida.

O problema é que se eu fizer:

PilotoX = x(3)

PilotoY = x(2)

O PilotoX sempre vai aparecer no lbl4.Caption, e o PilotoY sempre no lbl3.Caption.

Então como eu faço para fazer com que as posições de cada piloto sejam aleatorias nesse método de ordenar valores?

Só lembrando que cada piloto teria uma espécie de IA, que é o número multiplicado pelo Rnd no código. Ou seja, cada piloto teria uma chance de vencer ou perder, diferente do outro.

Valeu.

Darknnez

Link para o comentário
Compartilhar em outros sites

  • 0

a então. ai você teria que ter uma forma de vincular o piloto com o valor dele.

mas tipo, na verdade o que você quer é exibir o piloto cada vez de uma ordem diferente cada hora que o programa rodar certo?? o numero randomico na verdade não importa no caso, certo?? ai nesse caso, o melhor seria fazer como os exemplos do graymalkin nesses topicos:

http://scriptbrasil.com.br/forum/index.php?showtopic=64370

http://scriptbrasil.com.br/forum/index.php?showtopic=78756

mas tipo, se você quisesse por exemplo, calcular o tempo do piloto pra depois ordenar, ai como eu disse, você teria que ter uma forma de vincular o piloto com o valor dele.

ai o esquema seria você criar uma matriz tipo assim:

Dim x(3, 1) As Variant
ai na hora de setar você faria tipo assim:
Randomize
     x(0, 0) = Int(20 * Rnd) + 1
     x(1, 0) = Int(15 * Rnd) + 1
     x(2, 0) = Int(10 * Rnd) + 1
     x(3, 0) = Int(5 * Rnd) + 1

     x(0, 1) = "Piloto 1"
     x(1, 1) = "Piloto 2"
     x(2, 1) = "Piloto 3"
     x(3, 1) = "Piloto 4"[/code] ai você sabe que o primeiro indice pertence ao piloto 1 certo?? so que você vai ordenar o array pelo menor numero. então quando você mover o valor de indice, você tem que mover o nome do piloto junto. pra isso você teria que alterar aquela funcao. ela ficaria tipo assim:
[code]Public Function SelectionSort(Vetor(), tam)
     Dim i, j
     Dim min, aux

     For i = 0 To tam
          min = i
          For j = i + 1 To tam
               If Vetor(j, 0) < Vetor(min, 0) Then min = j
          Next j

          aux = Vetor(i, 0)
          Vetor(i, 0) = Vetor(min, 0)
          Vetor(min, 0) = aux
          
          aux = Vetor(i, 1)
          Vetor(i, 1) = Vetor(min, 1)
          Vetor(min, 1) = aux
     Next i
End Function
desse jeito, assim que o numero for calculado ele vai estar associado com o piloto agora se por exemplo, você quisesse guardar outros dados, como o carro do piloto. você também teria que associar todos os dados dele ao mesmo indice do array. ai o melhor seria você criar uma classe, ou um type e criar um array desse tipo. bom, esse parte não sei se você ta entendendo, qualquer coisa fala ai. mas o esquema seria você criar um type tipo:
Type piloto
    nome As String
    carro as String
    valor As Integer
End Type[/code] ai você declarava assim:
[code]Dim y(3) As piloto

e ai você pode mudar td junto de lugar. so teria que fazer umas pequenas adaptacoes naquela funcao.

mano num sei se to ajudano ou se to complicando mais ahahahha. mas ve ai o que você entende, o que você consegue fazer e qualquer coisa pergunta aí

Link para o comentário
Compartilhar em outros sites

  • 0

Complicando?

Cara, você não sabe o quanto ta me ajudando.

O mais interessante, é que eu estudei isso tudo, menos a parte do Type, mas eu não conseguiria pensar nisso sozinho.

Acho que ainda falta prática, sei lá.

Depois que eu consegui entender como ordenar valores, fiquei um tempão pensando em como fazer pra resolver esse problema com os pilotos, e não consegui. Aí tive que recorrer novamente à sua ajuda. E parece tão óbvio!

Mais tarde vou me preocupar em aprender o que é Type.

Agora eu vou "brincar" um pouco com esse esquema que você me passou.

haha

Valeu cara.

Darknnez

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

  • 0

bom, basicamente esse negocio de type é so um esquema pra criar o seu proprio tipo.

exemplo, no type piloto que eu criei, você declarando assim:

Dim x as piloto
você poderia acessar as propriedades assim:
piloto.nome = "Piloto 1"
piloto.carro = "carro 1"[/code]

e por poder guardar mais dados mais organizados e bunitinhos, nem preciso falar que seria bem mais eficaz do que o exemplo que te passei da matriz. alem de que o codigo ficaria menor.

Link para o comentário
Compartilhar em outros sites

  • 0
E depois no form:

piloto.nome = "piloto1"

Mas quando eu mando rodar o programa, aparece uma mensagem de erro:

"Invalid outside procedure"

Por que?

a mas em que parte do form você coloca isso?? não pode estar jogado em qualquer canto, tem que estar dentro duma sub ou function.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, consegui aqui, valeu!

Mais uma dúvida. :rolleyes:

Como eu faço pra que os pilotos ganhem pontos por chegar em determinada posição?

Por exemplo:

Na F1, os 8 primeiros pilotos pontuam no campeonato.

E como fazer para que a cada corrida essa pontuação seja somada em um form diferente?

Darknnez

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

  • 0

bom, o melhor a fazer é adicionar um campo Pontos no seu Type piloto. ai você declara o seu array no module como Public. desse modo ele vai valer pra todos os formularios, qualquer alteracao que você fizer no array em um formulario, quando você abrir o outro ele vai continuar alterado.

agora pra somar os pontos, você ve pelo indice do array. o array vai estar ordenado por ordem de chegada certo?? então é so somar pros 8 primeiros indices do array. exemplo (não assisto formula 1 (alias, é muito chato ahhaha, zuera), então não sei quanto os pilotos ganham, os valores ai são de exemplo):

piloto(0).pontos = piloto(0).pontos + 20
piloto(1).pontos = piloto(1).pontos + 15
piloto(2).pontos = piloto(2).pontos + 12
...
...
...
piloto(6).pontos = piloto(6).pontos + 2
piloto(7).pontos = piloto(7).pontos + 1[/code]

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,1k
    • Posts
      651,9k
×
×
  • Criar Novo...