Differenze tra le versioni di "Ordinare gli elementi di un vettore di Strutture in base ad un loro medesimo membro"

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim st1, st2, st3 As New STRUTTURA
 
   Dim st1, st2, st3 As New STRUTTURA
Riga 18: Riga 18:
 
   Dim bb As New Byte[3]
 
   Dim bb As New Byte[3]
 
    
 
    
  <FONT color=gray>' ''Vengono assegnati i valori a ciascuna variabile di tipo della Struttura "STRUTTURA",''
+
  <FONT color=gray>' ''Vengono assegnati i valori a ciascuna variabile di tipo della Struttura "STRUTTURA", si assegna ogni variabile ad un elemento del vettore di tipo della Struttura "STRUTTURA":''</font>
' ''si assegna ogni variabile ad un elemento del vettore di tipo della Struttura "STRUTTURA":''</font>
+
  With st1
  With st1
+
    .a = 0
    .a = 0
+
    .b = "st1"
    .b = "st1"
+
  End With
  End With
+
  sstt.Add(st1)
  sstt.Add(st1)
+
 
+
  With st2
  With st2
+
    .a = 5
    .a = 5
+
    .b = "st2"
    .b = "st2"
+
  End With
  End With
+
  sstt.Add(st2)
  sstt.Add(st2)
 
 
   
 
   
  With st3
+
  With st3
    .a = 3
+
    .a = 3
    .b = "st3"
+
    .b = "st3"
  End With
+
  End With
  sstt.Add(st3)
+
  sstt.Add(st3)
 
   
 
   
 
  <FONT color=gray>' ''Passa il valore del membro oggetto dell'ordinamento ad un vettore di tipo omogeneo:''</font>
 
  <FONT color=gray>' ''Passa il valore del membro oggetto dell'ordinamento ad un vettore di tipo omogeneo:''</font>
    For j = 0 To sstt.Max
+
  For j = 0 To sstt.Max
      bb[j] = sstt[j].a
+
    bb[j] = sstt[j].a
    Next
+
  Next
 
      
 
      
 
  <FONT color=gray>' ''Effettua l'ordinamento (in questo caso di tipo "discendente"):''</font>
 
  <FONT color=gray>' ''Effettua l'ordinamento (in questo caso di tipo "discendente"):''</font>
    bb.Sort(gb.Descent)
+
  bb.Sort(gb.Descent)
 
      
 
      
 
  <FONT color=gray>' ''Genera un vettore di tipo della Struttura "ST" contenente nei propri elementi le variabili del tipo Struttura "ST" "ordinati" in base al membro ".a":''</font>
 
  <FONT color=gray>' ''Genera un vettore di tipo della Struttura "ST" contenente nei propri elementi le variabili del tipo Struttura "ST" "ordinati" in base al membro ".a":''</font>
    For j = 0 To bb.Max
+
  For j = 0 To bb.Max
      For k = 0 To sstt.Max
+
    For k = 0 To sstt.Max
        If bb[j] = sstt[k].a Then
+
      If bb[j] = sstt[k].a Then
          With nova[j] = New STRUTTURA
+
        With nova[j] = New STRUTTURA
            .a = sstt[k].a
+
          .a = sstt[k].a
            .b = sstt[k].b
+
          .b = sstt[k].b
          End With
+
        End With
        Endif
+
      Endif
      Next
+
    Next
    Next
+
  Next
 
      
 
      
 
 
  <FONT color=gray>' ''Verifica del risultato:''</font>
 
  <FONT color=gray>' ''Verifica del risultato:''</font>
    For j = 0 To nova.Max
+
  For j = 0 To nova.Max
      With nova[j]
+
    With nova[j]
        Print .a
+
      Print .a
        Print .b
+
      Print .b
      End With
+
    End With
      Print
+
    Print
    Next
+
  Next
 
          
 
          
  '''End'''
+
  End
 
 
  
 
Mostriamo un altro esempio analogo, nel quale l'ordine dei nomi sarà adattato secondo l'ordine dei punteggi, corrispondente al membro di tipo ''Byte'' della Struttura:
 
Mostriamo un altro esempio analogo, nel quale l'ordine dei nomi sarà adattato secondo l'ordine dei punteggi, corrispondente al membro di tipo ''Byte'' della Struttura:
Riga 78: Riga 75:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ri As STRUTTURA
 
   Dim ri As STRUTTURA
Riga 87: Riga 84:
 
   Dim b, c As Byte
 
   Dim b, c As Byte
 
      
 
      
  nomi = ["Aaaa", "Bbbb", "Cccc", "Dddd"]
+
  nomi = ["Aaaa", "Bbbb", "Cccc", "Dddd"]
  punteggi = [15, 32, 18, 50]
+
  punteggi = [15, 32, 18, 50]
  For b = 0 To nomi.Max
+
  For b = 0 To nomi.Max
    ri = New STRUTTURA
+
    ri = New STRUTTURA
    ri.nome = nomi[b]
+
    ri.nome = nomi[b]
    ri.punt = punteggi[b]
+
    ri.punt = punteggi[b]
    rrii.Push(ri)
+
    rrii.Push(ri)
  Next
+
  Next
 +
 
 +
  With bb = New Byte[]
 +
    For b = 0 To rrii.Max
 +
      .Push(rrii[b].punt)
 +
    Next
 +
    .Sort(gb.Descent)
 +
  End With
 
    
 
    
  With bb = New Byte[]
+
  For b = 0 To bb.Max
    For b = 0 To rrii.Max
+
    For c = 0 To rrii.Max
      .Push(rrii[b].punt)
+
      If bb[b] = rrii[c].punt Then
    Next
+
        With nuova[b] = New STRUTTURA
    .Sort(gb.Descent)
+
          .nome = rrii[c].nome
  End With
+
          .punt = rrii[c].punt
 +
        End With
 +
      Endif
 +
    Next
 +
  Next
 
    
 
    
  For b = 0 To bb.Max
+
  For b = 0 To nuova.Max
    For c = 0 To rrii.Max
+
    Print nuova[b].punt, nuova[b].nome
      If bb[b] = rrii[c].punt Then
+
  Next
        With nuova[b] = New STRUTTURA
+
 
          .nome = rrii[c].nome
+
  End
          .punt = rrii[c].punt
 
        End With
 
      Endif
 
    Next
 
  Next
 
 
 
  For b = 0 To nuova.Max
 
    Print nuova[b].punt, nuova[b].nome
 
  Next
 
 
 
  '''End'''
 

Versione delle 04:17, 8 giu 2024

Il caso è quello in cui, dopo aver assegnato ad un vettore di tipo Struttura due o più variabili del tipo di quella Struttura, si procede ad effettuare un ordinamento all'interno di quel vettore sulla base di un medesimo membro delle predette variabili di tipo Struttura assegnate agli elementi del vettore.


Mostriamo di seguito un possibile codice, nel quale si procederà successivamente all'ordinamento in modalità discendente in base al primo membro della Struttura modello, che risulta essere di tipo Byte.
L'ordinamento, in vero, in questo codice non consiste in una riorganizzazione degli elementi originari del vettore di tipo Struttura, ma avviene in modo indiretto assegnando ad un nuovo vettore del tipo della Struttura utilizzata le variabili di tipo Struttura originarie, dopo aver individuato in modo discendente di ciascuna il rispettivo valore del primo membro:

Public Struct STRUTTURA
  a As Byte
  b As String
End Struct


Public Sub Main()

 Dim st1, st2, st3 As New STRUTTURA
 Dim sstt As New STRUTTURA[]
 Dim nova As New STRUTTURA[3]
 Dim j, k As Byte
 Dim bb As New Byte[3]
 
' Vengono assegnati i valori a ciascuna variabile di tipo della Struttura "STRUTTURA", si assegna ogni variabile ad un elemento del vettore di tipo della Struttura "STRUTTURA":
 With st1
   .a = 0
   .b = "st1"
 End With
 sstt.Add(st1)
 With st2
   .a = 5
   .b = "st2"
 End With
 sstt.Add(st2)

 With st3
   .a = 3
   .b = "st3"
 End With
 sstt.Add(st3)

' Passa il valore del membro oggetto dell'ordinamento ad un vettore di tipo omogeneo:
  For j = 0 To sstt.Max
    bb[j] = sstt[j].a
  Next
   
' Effettua l'ordinamento (in questo caso di tipo "discendente"):
  bb.Sort(gb.Descent)
   
' Genera un vettore di tipo della Struttura "ST" contenente nei propri elementi le variabili del tipo Struttura "ST" "ordinati" in base al membro ".a":
  For j = 0 To bb.Max
    For k = 0 To sstt.Max
      If bb[j] = sstt[k].a Then
        With nova[j] = New STRUTTURA
          .a = sstt[k].a
          .b = sstt[k].b
        End With
      Endif
    Next
  Next
   
' Verifica del risultato:
  For j = 0 To nova.Max
    With nova[j]
      Print .a
      Print .b
    End With
    Print
  Next
       
End

Mostriamo un altro esempio analogo, nel quale l'ordine dei nomi sarà adattato secondo l'ordine dei punteggi, corrispondente al membro di tipo Byte della Struttura:

Public Struct STRUTTURA
  nome As String
  punt As Byte
End Struct


Public Sub Main()
 
 Dim ri As STRUTTURA
 Dim rrii As New STRUTTURA[]
 Dim nuova As New STRUTTURA[4]
 Dim nomi As String[]
 Dim punteggi, bb As Byte[]
 Dim b, c As Byte
   
 nomi = ["Aaaa", "Bbbb", "Cccc", "Dddd"]
 punteggi = [15, 32, 18, 50]
 For b = 0 To nomi.Max
   ri = New STRUTTURA
   ri.nome = nomi[b]
   ri.punt = punteggi[b]
   rrii.Push(ri)
 Next
 
 With bb = New Byte[]
   For b = 0 To rrii.Max
     .Push(rrii[b].punt)
   Next
   .Sort(gb.Descent)
 End With
  
 For b = 0 To bb.Max
   For c = 0 To rrii.Max
     If bb[b] = rrii[c].punt Then
       With nuova[b] = New STRUTTURA
         .nome = rrii[c].nome
         .punt = rrii[c].punt
       End With
     Endif
   Next
 Next
  
 For b = 0 To nuova.Max
   Print nuova[b].punt, nuova[b].nome
 Next
 
End