IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

calcul boucle while


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 48
    Points : 15
    Points
    15
    Par défaut calcul boucle while
    Bonjour, je travaille sur un logiciel permettant de dimensionner des ouvrages hydrauliques à l'aide de la formule de Caquot. On a construit un datagridview pour rentrer les données (pente, longueur, etc), j'ai mis en place un bouton "Calcul" qui permet d'afficher les résultats, c'est-à-dire des débits:

    Voici mon programme, dans ce cas, il n'y a pas de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Private Sub ButtonCalcul2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcul2.Click
            If Verification() Then
                Me.LabelQmax1.Text = "Q1 = " & CalculCaquot(1).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax2.Text = "Q2 = " & CalculCaquot(2).ToString("0.0#") & " litres par seconde"
     
            Else
                Me.erreur2.Visible = True
            End If
        End Sub
     
     
     
        Function Verification() As Boolean
            Dim Bon As Boolean = True
            If Me.Labela2.Text Is Nothing Or Not IsNumeric(Me.Labela2.Text) Then
                MessageBox.Show("Entrez une valeur numérique pour a")
                Bon = False
            Else
                Select Case CType(Me.Labela2.Text, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour a")
                        Bon = False
                End Select
            End If
            If Me.Labelb2.Text Is Nothing Or Not IsNumeric(Me.Labelb2.Text) Then
                MessageBox.Show("Entrez une valeur numérique pour b")
                Bon = False
            Else 
                Select Case CType(Me.Labelb2.Text, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour b")
                        Bon = False
     
                    Case Is > 1
                        MessageBox.Show("Entrez une valeur entre 0 et 1 pour b")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour S")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour S")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("longueur").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("longueur").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour L")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("longueur").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour L")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour C")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour C")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("pente").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("pente").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour p")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("pente").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour p")
                        Bon = False
                End Select
            End If
            Return Bon
        End Function
     
        Function CalculCaquot(ByVal i) As Double
            Dim a2 As Double = Convert.ToDouble(Me.Labela2.Text)
            Dim b2 As Double = Convert.ToDouble(Me.Labelb2.Text)
            Dim LabelQmaxi As Double
            Dim ValeurSi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Surfacetotale").Value)
            Dim ValeurLi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("longueur").Value)
            Dim ValeurCi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Coefficientimpermeabilisation").Value)
            Dim ValeurPi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("pente").Value)
     
            i = 1
            While i < 100
                LabelQmaxi = ((((a2 / 60) / 6.6) * (0.28 * (ValeurLi / 100) ^ 0.84 * (ValeurSi / 10000) ^ -0.42) ^ -b2) ^ (1 / (1 - 0.287 * b2))) * (ValeurCi ^ (1 / (1 - 0.287 * b2))) * ((ValeurPi / 100) ^ (0.41 * b2 / (1 - 0.287 * b2))) * ((ValeurSi / 10000) ^ ((0.95 - 0.507 * b2) / (1 - 0.287 * b2))) * 1000
                i += 1
            End While
            Return LabelQmaxi
     
        End Function
    Lorsque je veux calculer plus de valeurs, voici mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     Private Sub ButtonCalcul2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcul2.Click
            If Verification() Then
                Me.LabelQmax1.Text = "Q1 = " & CalculCaquot(1).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax2.Text = "Q2 = " & CalculCaquot(2).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax3.Text = "Q3 = " & CalculCaquot(3).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax4.Text = "Q4 = " & CalculCaquot(4).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax5.Text = "Q5 = " & CalculCaquot(5).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax6.Text = "Q6 = " & CalculCaquot(6).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax7.Text = "Q7 = " & CalculCaquot(7).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax8.Text = "Q8 = " & CalculCaquot(8).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax9.Text = "Q9 = " & CalculCaquot(9).ToString("0.0#") & " litres par seconde"
                Me.LabelQmax10.Text = "Q10 = " & CalculCaquot(10).ToString("0.0#") & " litres par seconde"
     
            Else
                Me.erreur2.Visible = True
            End If
        End Sub
     
     
     
        Function Verification() As Boolean
            Dim Bon As Boolean = True
            If Me.Labela2.Text Is Nothing Or Not IsNumeric(Me.Labela2.Text) Then
                MessageBox.Show("Entrez une valeur numérique pour a")
                Bon = False
            Else
                Select Case CType(Me.Labela2.Text, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour a")
                        Bon = False
                End Select
            End If
            If Me.Labelb2.Text Is Nothing Or Not IsNumeric(Me.Labelb2.Text) Then
                MessageBox.Show("Entrez une valeur numérique pour b")
                Bon = False
            Else 
                Select Case CType(Me.Labelb2.Text, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour b")
                        Bon = False
     
                    Case Is > 1
                        MessageBox.Show("Entrez une valeur entre 0 et 1 pour b")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour S")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("Surfacetotale").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour S")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("longueur").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("longueur").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour L")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("longueur").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour L")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour C")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("Coefficientimpermeabilisation").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour C")
                        Bon = False
                End Select
            End If
            If Me.DataGridView1.Rows(0).Cells("pente").Value Is Nothing Or Not IsNumeric(Me.DataGridView1.Rows(0).Cells("pente").Value) Then
                MessageBox.Show("Entrez une valeur numérique pour p")
                Bon = False
            Else
                Select Case CType(Me.DataGridView1.Rows(0).Cells("pente").Value, Double)
                    Case Is < 0
                        MessageBox.Show("Entrez une valeur positive pour p")
                        Bon = False
                End Select
            End If
            Return Bon
        End Function
     
        Function CalculCaquot(ByVal i) As Double
            Dim a2 As Double = Convert.ToDouble(Me.Labela2.Text)
            Dim b2 As Double = Convert.ToDouble(Me.Labelb2.Text)
            Dim LabelQmaxi As Double
            Dim ValeurSi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Surfacetotale").Value)
            Dim ValeurLi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("longueur").Value)
            Dim ValeurCi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("Coefficientimpermeabilisation").Value)
            Dim ValeurPi As Double = Convert.ToDouble(Me.DataGridView1.Rows(i - 1).Cells("pente").Value)
     
            i = 1
            While i < 100
                LabelQmaxi = ((((a2 / 60) / 6.6) * (0.28 * (ValeurLi / 100) ^ 0.84 * (ValeurSi / 10000) ^ -0.42) ^ -b2) ^ (1 / (1 - 0.287 * b2))) * (ValeurCi ^ (1 / (1 - 0.287 * b2))) * ((ValeurPi / 100) ^ (0.41 * b2 / (1 - 0.287 * b2))) * ((ValeurSi / 10000) ^ ((0.95 - 0.507 * b2) / (1 - 0.287 * b2))) * 1000
                i += 1
            End While
            Return LabelQmaxi
     
        End Function

    il n'y a pas de problème à la compilation, mais une fois que je lance mon calcul, cette erreur s'affiche:

    L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
    Nom du paramètre : index
    Je ne comprends pas l'erreur, pourriez-vous m'aider?

  2. #2
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    ne serait-il pas plus simple de regarder en mode debug la ligne à laquelle il plante?

    cdlt,

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Cette erreur indique que tu essayes d'acceder à un tableau de quelque chose à un index n'existant pas. Exemple : tu as un tableau possedant 10 entrées et le premier item se situe à l'index 0, si tu accedes à ton tableau de l'index 1 à 9, pas de probleme, au dela, ca te genere cette erreur.

    Donc soit c'est dans ce tableau : CalculCaquot(1) soit c'est là dessus DataGridView1.Rows(0).

    Donc en effet, en mode debug tu sauras sur quelle ligne ca plante et tu sauras quel tableau est en faute

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 48
    Points : 15
    Points
    15
    Par défaut
    j'ai finalement trouvé une autre solution. Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/06/2015, 20h59
  2. Calcul automatique et boucle while
    Par angejudicael dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 18/06/2013, 11h00
  3. [MySQL] Calcul d'un taux à partir d'une boucle while
    Par zana74 dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 14/08/2006, 19h16
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo