Newsgroup: it.comp.lang.visual-basic
Titolo: Come identificare la variabile che contieve il valore maggiore?

Ciao, scusa se vi disturbo ancora. Ho 4 o 5 variabili che contengono dei 
valore numerici. Mi interesserebbe capire quale ha il valore più alto e 
quale viene per seconda.
Come posso fare, senza fare un numero infinito di IF e di > <?
Grazie
Thomas 

Thommino ha spiegato il 17/05/2006 :

Se le variabili sono in un array, puoi cavartela con un ciclo.
Se le variabili sono elementi indipendenti, puoi ottenere i valori 
massimo e secondo classificato, ma per capire *quale* sia la maggiore e 
la seconda, l'unica sono gli IF.
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 seconda, l'unica sono gli IF.
Le variabile sono indipendenti: A , B, C, D, E
e non conosco a priori il contenuto che contengono.
Ipotizziamo che contengano i valori: 10, 34, 5, 55, 77
Mi piacerebbe sapere che la variabile che contiene il valore più alto è la 
E, e la seconda è la D.
Avevo pensato anche io di creare un array e di copiare in prima posizione la 
varibile con il valore più alto ed in seconda posizione quella seconda. E 
poi di leggere i dati da questo array,ma non capisco bene come! 

Thommino ha pensato forte :

Se copi i dati in un array, alla fine otterrai il valore più alto, non 
'la variabile' che contiene il valore più alto.
Se a te serve avere un riferimento alla variabile col valore maggiore, 
l'unica è fare un function a cui passi Byref tutte le singole 
variabili, e questa function, con un giochetto di IF, ti restituisce 
sempre ByRef il puntatore alla variabile maggiore e alla seconda.


 ha scritto nel messaggio news:NIzag.15608$bH.1...@tornado.fastwebnet.it...

puoi usare l'algoritmo quicksort

 ha scritto nel messaggio 
news:446b14c7$1...@news.unimib.it...

Il problema è che a me non interessa sapere il valore più alto, ma la 
variabile che contiene il valore più alto.
Perchè per ora ho fatto questo:
If (DistanzaGranata < DistanzaGrigio) And (DistanzaGranata < DistanzaScuro) 
And (DistanzaGranata < DistanzaBrillante) Then
        ColoreTetto = "Tetto a Tegole"
        End If
        If (DistanzaGranata > DistanzaGrigio) And (DistanzaGrigio < 
DistanzaScuro) And (DistanzaGrigio < DistanzaBrillante) Then
        ColoreTetto = "Tetto Grigio-Grigio Scuro"
        End If
        If (DistanzaScuro < DistanzaGranata) And (DistanzaGrigio > 
DistanzaScuro) And (DistanzaScuro < DistanzaBrillante) Then
        ColoreTetto = "Tetto Molto Scuro"
        End If
        If (DistanzaGranata > DistanzaBrillante) And (DistanzaBrillante < 
DistanzaScuro) And (DistanzaGrigio > DistanzaBrillante) Then
        If DistanzaBrillante < 0.0041 Then
        ColoreTetto = "Tetto Brillante"
Ma non è elegante per nulla. E comunque non so quale sia la seconda più 
grande! 

 ha scritto nel messaggio news:BFEag.16285$bH....@tornado.fastwebnet.it...

........non ho parole, evito di pronunciarmi, potrei risultare
offensivo

 offensivo
Beh te o avevo detto che non era il massimo. Hai idee più precise? 

Se ho capito bene quello che vuoi fare....ecco un metodo...
L'agoritmo che ho usato è un Insertion Sort ( o inserction sort che dir si 
voglia :-P )
appogiato su di una struct che ti permettesse di tenere traccia anche del 
nome
Vantaggi: Funziona con un nuero di input imprecisati
Svantaggi: Funziona solo con valori superiori allo 0 (ma è superabile con 
piccole modifiche)
Ciao Giuseppe
p.s. Ora lo sò che molti del NG vorranno uccidermi per questa soluzione,
ma sono le 6 del mattino e mi è venuto solo questo :-D
---------------------------------------------------------------------------------
CODICE
--------------------------------------------------------------------------------
Private Type struttura
 nome As String
 valore As Long
End Type
Dim ordinato() As struttura
Private Sub Command1_Click()
Dim a As Long, b As Long, c As Long, d As Long, e As Long
ReDim ordinato(0)
a = 5
b = 3
c = 11
d = 1
e = 9
InsertionSort "a", a
InsertionSort "b", b
InsertionSort "c", c
InsertionSort "d", d
InsertionSort "e", e
MsgBox "Variabile :" & ordinato(1).nome & " Valore :" & ordinato(1).valore
MsgBox "Variabile :" & ordinato(2).nome & " Valore :" & ordinato(2).valore
End Sub
'Semplice algoritmo che inserisce un elemento alla volta nell'array
'scorre l'array fino a che il valore che vuole inserire non è maggiore
' del valore chesta analizzando, a quel punto shifta tutti i valori presenti
' e inserisce il nuovo valore nella posizione trovata
Function InsertionSort(val1 As String, val2 As Long)
Dim i As Integer, j As Integer
ReDim Preserve ordinato(UBound(ordinato) + 1) ' aumentiamo di 1 il nostro 
array
For i = 1 To UBound(ordinato)
    If ordinato(i).valore < val2 Then
       For j = UBound(ordinato) To i Step j - 1
            ordinato(j) = ordinato(j - 1)
       Next j
       ordinato(i).nome = val1
       ordinato(i).valore = val2
       i = UBound(ordinato) + 1 'questa si può scrivere meglio...ma sono le 
6 del mattino :-)
    End If
Next i 

 piccole modifiche)
Per questo non ci sono problemi, la distanza che calcolo è sempre 
considerata in modulo quindi....sempre positiva.
In pratica per popolare l'array devo modificare a b c d e con i valori che 
ho calcolato, giusto? Posso eventualmente passarla dalla chiamata:
Private Sub Command1_Click(a As Long, b As Long, c As Long, d As Long, e As 
Long)
E quindi poi chiamare la procedura come
Command1_Click(valore1,valore2,valore3,valore4,valore5)
oppure per far funzionare questo programma va chiamato in altro modo?

 e = 9
Non capisco cosa serve questa parte se tanto, poi dopo quando chiamo 
InsertionSort gli passo sia il nome della stringa che il suo valore! 

 nome
[cut]
Innanzitutto Grazie per quello che hai cercato di fare. Ho provato ad 
inserire il codice che mi hai dato tu nel seguente modo:
'Calcoliamo le varie distanze dai baricentri
            DistanzaGranataChiara = Abs(Sqr((BaricentroGranataChiaroR - 
RAveNorm) ^ 2 + (BaricentroGranataChiaroG - GAveNorm) ^ 2 + 
(BaricentroGranataChiaroB - BAveNorm) ^ 2))
            DistanzaGrigio = Abs(Sqr((BaricentroGrigioR - RAveNorm) ^ 2 + 
(BaricentroGrigioG - GAveNorm) ^ 2 + (BaricentroGrigioB - BAveNorm) ^ 2))
            DistanzaGranataScuro = Abs(Sqr((BaricentroGranataScuroR - 
RAveNorm) ^ 2 + (BaricentroGranataScuroG - GAveNorm) ^ 2 + 
(BaricentroGranataScuroB - BAveNorm) ^ 2))
            ReDim ordinato(0)
            InsertionSort "DistanzaGranataChiara", DistanzaGranataChiara
            InsertionSort "DistanzaGrigio", DistanzaGrigio
            InsertionSort "DistanzaGranataScuro", DistanzaGranataScuro
            MsgBox "Variabile :" & ordinato(1).nome & " Valore :" & 
ordinato(1).valore
            MsgBox "Variabile :" & ordinato(2).nome & " Valore :" & 
ordinato(2).valore
Purtroppo pero' quando mi visualizza il messaggio non mi scrive il nome 
della Variabile e nemmeno il valore (scrive 0 sempre).
Secondo te come mai?
Eppure ho copiato all'inizio di tutto il codice la definizione del dato 
struttura:
Private Type Struttura
 nome As String
 valore As Long
End Type
Dim ordinato() As Struttura
e allora fine del codice la Funzione
Function InsertionSort(val1 As String, val2 As Long)
Dim i As Integer, j As Integer
ReDim Preserve ordinato(UBound(ordinato) + 1) ' aumentiamo di 1 il nostro 
array
For i = 1 To UBound(ordinato)
    If ordinato(i).valore < val2 Then
       For j = UBound(ordinato) To i Step j - 1
            ordinato(j) = ordinato(j - 1)
       Next j
       ordinato(i).nome = val1
       ordinato(i).valore = val2
       i = UBound(ordinato) + 1
    End If
Next i
End Function

 inserire il codice che mi hai dato tu nel seguente modo:
[cut]
Mi rispondo da solo. Ho cambiato in Single il file Struct e tutto ora 
funziona bene.
Grazie Grazie 

 Grazie Grazie
Prego, figurati :-) 

Thommino says...

Leggo solo ora il tuo messaggio.
Se hai .NET si può utilizzare una funzione molto semplice che ti 
permette di non utilizzare tutti quegli orribili if...then.
System.Math.Max
Semplice e veloce.
Christian

 Christian
Grazie, ma ho già risolto! 

Christian scriveva il 25/05/2006 :

Non conosco troppo bene .Net, ma ho l'impressione che quella funzione 
restituisca il valore maggiore, e non che indichi quale variabile sia 
la maggiore.


 la maggiore.
Già, è vero.
Christian

 Christian
Ho pero' adesso un altro problema con il codice che mi avevate postato voi.
Ho infatti creato un Frm (grazie a voi) che gestisce tutte le procedure in 
modo comodo.
Purtroppo adesso non riesco a capire dove copiare il dato Type. Se infatti 
lo copio all'inizio del codice poi non me lo riconosce più aventi. Se lo 
copio dopo una sub mi dice che non posso inserire Type dopo una sub.
Vi posto il codice tagliato. Sapere indicarmi dove posizionarlo?
Private Sub Image1_Click()
End Sub
Public Sub Studio_Click()
End Sub
Private Sub CopiaCampo_D_Max_Lenght(Nome_Campo As String)
End Sub
Public Sub GetCoords_ColourAveInPoly()
.
                    SetRgbByXY R, G, b, dx, dy, pRLayer1
.
            ReDim ordinato(0)
            InsertionSort "DistanzaGranataChiara", DistanzaGranataChiara
End Sub
Public Sub SetRgbByXY(ByRef R As Integer, ByRef G As Integer, ByRef b As 
Integer, ByVal x
End Sub
Public Type Struttura
 nome As String
 valore As Single
End Type
Dim ordinato() As Struttura
Public Function InsertionSort(val1 As String, val2 As Single)
Dim i As Integer, j As Integer
ReDim Preserve ordinato(UBound(ordinato) + 1) ' aumentiamo di 1 il nostro 
array
For i = 1 To UBound(ordinato)
    If ordinato(i).valore < val2 Then
       For j = UBound(ordinato) To i Step j - 1
            ordinato(j) = ordinato(j - 1)
       Next j
       ordinato(i).nome = val1
       ordinato(i).valore = val2
       i = UBound(ordinato) + 1
    End If
Next i
End Function
Grazie
Thom