A me viene in mente questo:
Public Sub Main()
Dim ii As Integer[] = [5, 1, 3, 7, 2, 6, 8, 10, 22, 9, 18]
ii.Sort(gb.Ascent)
Print "Numero più basso "; ii[0]
Print "Numero più alto "; ii[ii.Max]
End
:ciao: :ciao:
ho un vettore di interi e mi serve di capire quale elemento ha il valore piu' alto (o piu' basso).
A parte banalmente scansioare il vettore elemento per elemento .. c'e' una classe o proprieta' predefinita di qualche oggetto vettore "custom"?
A me non è venuto in mente altro che la "banale scansione" :) solo ti vorrei consigliare di assegnare il valore alla variabile iMin e iMax in questo modo, perché l'esempio (http://www.gambas-it.org/wiki/index.php?title=Conoscere_il_valore_numerico_pi%C3%B9_alto_contenuto_da_un_vettore) della wiki non mi convince:
Public Sub Main()
Dim i, iMax, iMin, iIndMax, iIndMin As Integer
Dim ii As Integer[]
ii = [106, 11, 33, 77, -89, 105, -22, 66, 44, 55, -107, 115]
iMax = ii[0]
iMin = ii[0]
For i = 0 To ii.Max
If ii[i] > iMax Then
iMax = ii[i]
iIndMax = i
Endif
If ii[i] < iMin Then
iMin = ii[i]
iIndMin = i
Endif
Next
Print "Il numero più piccolo è: "; iMin; " il cui indice è: "; iIndMin;;
Print "Il numero più grande è: "; iMax; " il cui indice è: "; iIndMax
End
:ciao: :ciao:
...
Si usare .sort distrugge la struttura. Avrei forse dovuto usare una matrice, con coppie (indice, valore), che alla creazione hanno incice di matrice uguale al contenuto indice, e dopo il .sort, andare a leggere il contenuto del primo (od ultimo) elemento .... troppo complicato :D
Volendo usare una copia...:
Public Sub Main()
Dim iMax, iMin, iIndMax, iIndMin As Integer
Dim ii, cc As Integer[]
ii = [106, 11, 33, 77, -89, 105, -22, 66, 44, 55, -107, 115]
cc = ii.Copy()
cc.Sort()
iMax = cc[cc.Max]
iMin = cc[0]
iIndMax = ii.Find(iMax)
iIndMin = ii.Find(iMin)
Print "Il numero più piccolo è: "; iMin; " il cui indice è: "; iIndMin;;
Print "Il numero più grande è: "; iMax; " il cui indice è: "; iIndMax
End
:ciao: :ciao:
Passando come valore la prima occorrenza del vettore, l'assegnazione va bene per tutti i tipi di dato numerico.
...non ho capito bene.... :-\
Mi devo ripetere, ma ora lo faccio con un esempio:
iMax = ii[0] ' va bene anche se ii è un vettore di tipo Long'
Dim iMax as Long = -2147483648 ' malfunzionamento se i valori nel vettore sono tutti minori di questo numero.
Ma se tu invece pensi che come è impostato l'esempio sia meglio perché è chiaramente sottinteso essere quello il valore più basso del tipo integer e che se cambiamo il tipo è altrettanto chiaro che va cambiato il valore, allora lascialo pure così. :)
:ciao: :ciao:
PS: Dimenticavo, c'è un refuso; la Sub si chiude con Next al posto di End.
[cut]
eh si, penso che sia l'unica Gian ... pero' il tuo metodo mi piace molto.
Si potrebbero unire le 2 soluzioni in una classe:
1) passo l'array originale come proprietà della classe
2) all'interno, ne creo una copia, la ordino e individuo i valori Min e Max
3) spazzolo l'array originale una sola volta, ed appena trovo i valori Min e Max mi memorizzo gli indici
Create Static
' Utilizzo:
' ii = [106, 11, 33, 77, -89, 125, -22, 66, 44, 55, -107, 115]
' cSortList.Lista = ii
' cSortList.Elabora
' lblMinimo.Text = "Minimo: " & cSortList.Minimo & " alla posizione " & cSortList.MinimoPos
' lblMassimo.Text = "Massimo: " & cSortList.Massimo & " alla posizione " & cSortList.MassimoPos
Private aLista As Integer[]
Private iMinimo As Integer = -1
Private iMinimoPos As Integer = -1
Private iMassimo As Integer = -1
Private iMassimoPos As Integer = -1
Property Lista As Integer[]
Property Read Minimo As Integer
Property Read MinimoPos As Integer
Property Read Massimo As Integer
Property Read MassimoPos As Integer
Private Function Lista_Read() As Integer[]
Return aLista
End
Private Function Lista_Write(aTmp As Integer[])
aLista = atmp
End
Private Function Minimo_Read() As Integer
Return iMinimo
End
Private Function Massimo_Read() As Integer
Return iMassimo
End
Private Function MinimoPos_Read() As Integer
Return iMinimoPos
End
Private Function MassimoPos_Read() As Integer
Return iMassimoPos
End
Public Sub Elabora()
Dim aTmp As Integer[]
Dim iCount As Integer
Dim iMax As Integer
iMinimo = -1
iMinimoPos = -1
iMassimo = -1
iMassimoPos = -1
iMax = alista.Count - 1
atmp = aLista.Copy()
atmp.Sort()
iMinimo = atmp[0]
iMassimo = atmp[imax]
For icount = 0 To imax
If iMinimoPos = -1 Then
If aLista[icount] = iminimo Then
iminimopos = icount
Endif
Endif
If imassimopos = -1 Then
If aLista[icount] = imassimo Then
imassimopos = icount
Endif
Endif
If iminimopos <> -1 And imassimopos <> -1 Then
Exit
Endif
Next
End
Bye by SixaM 8-]