J'ai une listbox appelée listA dans un log
celle ci contient des valeurs allant de 0.00 à -2.00 par centiemes dans cet ordre :
0.00; -0.01; -0.02 .......-1.00; -1.01 .....;-2.00
J'ai une textbox X qui contient une valeur de référence fixe
J'ai une fonction calculdanslistA tout a fait operationnelle
ce que je fais de facon automatique :
Je choisis un nombre dans listA
je lui applique calculdanslistA
j'affiche le resultat dans une Textbox Y
Je compare la valeur de Textbox X avec celle de Textox Y
SI VALX = VALY alors
ListA.TopIndex = i
ListA.SelectedIndex = i
et je sors de ma boucle FOR
For i = 0 To ListA.Items.Count - 1
nombre = Convert.ToDouble(ListA.Items(i).ToString)
CalculdanslistA()
If VALX.Text = VALY.Text Then
ListA.TopIndex = i
ListA.SelectedIndex = i
Exit For
End If
Next
Hélas, J'ai oublié un paramètre essentiel qui me génére de grosses erreurs :
Si après le balayage de toutes les valeurs de la listA, aucune valeur ne me permets d'avoir VALX.Text = VALY.Text, je voudrais que VALY soit la valeur inférieure ou supérieure la plus proche possible de VALX
Je suppose que cela doit se traduire par quelque chose du genre :
For i = 0 To ListA.Items.Count - 1
nombre = Convert.ToDouble(ListA.Items(i).ToString)
CalculdanslistA()
If VALX.Text = VALY.Text Then
ListA.TopIndex = i
ListA.SelectedIndex = i
Exit For
Else
If
'Si après le balayage de toutes les valeurs de la listA, aucune valeur ne me
'permets d'avoir VALX.Text = VALY.Text,
Then
'je voudrais que VALY soit la valeur inférieure ou supérieure la plus proche
'possible de VALX
Exit For
End If
Next
Mais je ne vois pas comment traduire ce qu'il y a entre le else et le End If en VB.NET
j'affiche le resultat dans une Textbox Y
Je compare la valeur de Textbox X avec celle de Textox Y
c'est plutot le contraire non
ValY est le resultat de CalculdanslistA
Je compare la valeur de TextboxY avec celle de TextoxX /quote
2 il peut avoir deux valeurs proches
par ex
0.01 aussi proche de 0.02
comme 0.03 de 0.02
essaye
dim difference as double
dim lastdifference as double
For i = 0 To ListA.Items.Count - 1
nombre = Convert.ToDouble(ListA.Items(i).ToString)
CalculdanslistA()
if i = 0 then
difference = Convert.ToDouble(VALY.Text ) - Convert.ToDouble(VALX.Text )
end if
lastdifference = Convert.ToDouble(VALY.Text ) - Convert.ToDouble(VALX.Text )
If lastdifference = 0 Then
ListA.TopIndex = i
ListA.SelectedIndex = i
Exit For
end if
if lastdifference <difference then
difference = lastdifference
end if
Next
dim difference as double
dim lastdifference as double
For i = 0 To ListA.Items.Count - 1
nombre = Convert.ToDouble(ListA.Items(i).ToString)
CalculdanslistA()
if i = 0 then
difference = Convert.ToDouble(VALY.Text ) - Convert.ToDouble(VALX.Text )
end if
lastdifference = Convert.ToDouble(VALY.Text ) - Convert.ToDouble(VALX.Text )
If lastdifference = 0 Then
ListA.TopIndex = i
ListA.SelectedIndex = i
Exit For
end if
if lastdifference <difference then
difference = lastdifference
end if
ValY = math.abs(difference) + Convert.ToDouble(VALX.Text )
Next
voilà moi je pense que c'est un peu plus simple si on considère qu'une liste n'est rien d'autre qu'un tableau dynamique. ce que je veux dire c'est que dans le cas où x # y, le moyen que je pense être bon pour retourner les valeurs directement supérieures ou inférieures est de tester les valeurs de la liste en les comparant avec y, ou x je sais plus!
en algo çà donnerait quelque chose comme çà:
pour i<-1 a N faire
si(valx = liste[0])alors
valSup<-list[i+1]
valInf<-nil
sortir
fsi
si(valx = liste[N])alors
valSup<-nil
valInf<-list[N-1]
sortir
fsi
si(valx > liste[0] et valx < liste[N])alors
si(valx = liste[i])alors
valSup<-liste[i+1]
valInf<-liste[i-1]
sortir
sinon
si(valx > liste[i+1] et valx < liste[i+2])alors
valSup<-liste[i+2]
valInf<-liste[i+1]
sortir
fsi
fsi
fsi
fpr
en sachant qu'en algo le 1er élément est en position 1 et le dernier en position N donc à remplacer par 0 et N-1,
avec N listeA.items.count et nil null. enfin, en sortant tu n'oublies pas de tester si valSup est null ou si valInf est null pour savoir directement si t'as une ou deux valeurs à prendre en compte.
je pense que c'est une piste à explorer sinon, tu fais une recherche dichotomique dans la liste en divisant à chaque fois la liste en 2 et en cherchant la valeur tu testes si tu trouve la valeur; si tu la trouves pas, tu testes l'intervalle entre les valeurs qui l'encadrent. Si tu te retrouves avec un encadrement direct, comme ce que j'ai essayé de faire plus haut, alors je pense que tu auras trouvé tes valeurs inférieures et supérieures les plus proches(enfin...je crois). que la force soit avec toi...!
attends, je crois que j'ai loupé un détail..; il s'agit d'une liste box je croyais que c'était une liste. bref, le problème est le même si tu veux traiter çà facilement mets tes valeurs dans un tableau et les données seront plus faciles à manipuler.
Soit ListQ la listBox
Soient ValX et ValY les deux TextBox
ValX contient une valeur constante
Valy contient la valeur issue de la Sub CalculdanslistQ()
Private Sub Automatique()
Dim i As Integer, trouve As Boolean
Dim ecartqfmin As Double ' plus petit écart
Dim ecartqfactuel As Double ' ecart actuel
Dim indexecart As Integer ' index de l'écart dans ListQ
ListQ.Visible = False
trouve = False
For i = 0 To ListQ.Items.Count - 1
nombre = Convert.ToDouble(ListQ.Items(i).ToString)
CalculdanslistQ()
If ValX.Text = ValY.Text Then
trouve = True
ListQ.TopIndex = i
ListQ.SelectedIndex = i
Exit For
Else
' on calcule l'écart entre ValX et ValY
If i = 0 Then
' on calcule l'écart actuel en valeur absolue. Comme c'est le premier écart il est automatiquement l'écart minimum
ecartqfmin = Math.Abs(Convert.ToDouble(ValX.Text) - Convert.ToDouble(ValY.Text))
indexecart = 0
Else
' on calcule l'écart actuel en valeur absolue
ecartqfactuel = Math.Abs(Convert.ToDouble(ValX.Text) - Convert.ToDouble(ValY.Text))
' si ecartqfactuel < ecartqfmin alors ecartqfactuel devient ecartqfmin
If ecartqfactuel < ecartqfmin Then
ecartqfmin = ecartqfactuel
indexecart = i
End If
End If
End If
Next
If trouve = False Then
' on n'a pas trouvé ValX = ValY donc on prend au plus proche
ListQ.TopIndex = indexecart
ListQ.SelectedIndex = indexecart ' index de ListQ ayant donné le calcul au plus proche
End If
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.