Probleme de condition dans un calcul automatique

Signaler
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
-
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
-
Bonjour,

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

Auriez vous la gentillesse de m'eclairer

Merci bien

5 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut
pas clair

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
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
non ce n'est pas encore au point

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 
           ValY = math.abs(difference) +  Convert.ToDouble(VALX.Text ) 
         Next
                        
                
Messages postés
66
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 juillet 2013

bonsoir

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...!

Lez-J
Messages postés
66
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 juillet 2013

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.

Lez-J
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut Attila

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.

GRENIER Alain