Probleme avec case select en visual basic 2010

Résolu
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012 - 5 févr. 2012 à 19:13
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012 - 5 févr. 2012 à 22:13
c'est un programme pour calculer l'imc mais il ne donne pas les bonne réponse.

le problème est par exemple ( poids 30 et taille 250 )la réponse est 4.8 ça c'est bon mais il me dit "Obésité sévère"
au lieu de "Dénutrition ou famine".
le probleme viens de la fonction case que je dois pas très bien employé ou alors elle ne convient pas.

merci de votre aide !!!.




Private Sub calculimc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calculimc.Click

Dim sPoids As Single
Dim sTaille As Single
If Not (IsNumeric(taille.Text)) Then
MsgBox("Entrez une valeur numérique pour la taille")
Exit Sub
End If
If Not (IsNumeric(poids.Text)) Then
MsgBox("Entrez une valeur numérique pour le poids")
Exit Sub
End If
sTaille = CType(taille.Text, Single) / 100
sPoids = CType(poids.Text, Single)

If sTaille < 0.5 Or sTaille > 2.5 Then
MsgBox("Entrez une taille valide")
Exit Sub
End If
If sPoids < 20 Or sPoids > 500 Then
MsgBox("Entrez un poids valide")
Exit Sub
End If

imc.Text = (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString

Select imc.Text

Case 0 To 16.5
labelimc.Text = "Dénutrition ou famine"
labelimc.BackColor = Color.Red
Case 16.5 To 18.5
labelimc.Text = "Maigreur"
labelimc.BackColor = Color.Yellow
Case 18.5 To 25
labelimc.Text = "Corpulence normale"
labelimc.BackColor = Color.White
Case 25 To 30
labelimc.Text = "Surpoids"
labelimc.BackColor = Color.Yellow
Case 30 To 35
labelimc.Text = "Obésité modérée"
labelimc.BackColor = Color.Chocolate
Case 35 To 40
labelimc.Text = "Obésité sévère"
labelimc.BackColor = Color.OrangeRed
Case 40 To 500
labelimc.Text = "Obésité morbide ou massive"
labelimc.BackColor = Color.Red
End Select

End Sub

13 réponses

NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
5 févr. 2012 à 19:27
Bonjour,

A la place de ton Select Case utilises plutot un bloc IF/ElseIf/End If

Sinon, actives Option Strict dans les propriétés de ton projet.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 févr. 2012 à 19:47
Déjà :
un select case sur des nombres
Select imc.Text

Case 0 To 16.5 
etc ...


en lui passant des strings

imc.Text = (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString 


est pour moi on ne peut plus surprenant.!
(et j'arrête là mon "observation" d'un code non indenté et non mis entre balises code.
________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
5 févr. 2012 à 20:00
Bonjour,

Utilises plutot ElseIf plutot que ces blocs If

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 févr. 2012 à 21:55
Quand tu as des calculs à faire, il faut éviter les chaines de caractères. La chaine c'est pour de l'affichage. Les calculs se font avec des nombres.

Donc, si tu reçois tes entrées sous forme de texte, tu les converties au plus tôt en nombre (ce que tu fais d'ailleurs très bien avec taille.text et poids.text).
Ensuite tous les calculs, tu es travaille avec des nombres. Il ne faut pas reconvertir en texte pour rien. Tu ne convertis en texte que ce que tu as besoin d'afficher et uniquement au moment de l'afficher.

Exemple pour ton code :

 Private Sub calculimc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calculimc.Click

        Dim sPoids As Single
        Dim sTaille As Single
        Dim sImc As Single
        ........
        sImc=(Math.Round(sPoids / (sTaille * sTaille), 1)) 'Ici on travaille sur des nombres et on conserve le résultat en nombre
        imc.Text = sImc.ToString 'Ici on convertie le résultat en texte parce qu'on l'affiche mais on le conserve sous forme de nombre aussi 

        If sImc < 16.5 Then  'Ici puiqu'on continue les calculs, on travaille toujours sur le nombre lui-même et pas sa représentation textuelle
        ........
        If sImc > 40 Then
            labelimc.Text = "Obésité morbide ou massive"
            labelimc.BackColor = Color.Red
        End If


    End Sub


Et d'ailleurs comme ça, tu dois pouvoir reprendre ta structure avec les Select Case

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012
5 févr. 2012 à 19:55
 Private Sub calculimc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calculimc.Click

        Dim sPoids As Single
        Dim sTaille As Single
        If Not (IsNumeric(taille.Text)) Then
            MsgBox("Entrez une valeur numérique pour la taille")
            Exit Sub
        End If
        If Not (IsNumeric(poids.Text)) Then
            MsgBox("Entrez une valeur numérique pour le poids")
            Exit Sub
        End If
        sTaille = CType(taille.Text, Single) / 100
        sPoids = CType(poids.Text, Single)

        If sTaille < 0.5 Or sTaille > 2.5 Then
            MsgBox("Entrez une taille valide")
            Exit Sub
        End If
        If sPoids < 20 Or sPoids > 500 Then
            MsgBox("Entrez un poids valide")
            Exit Sub
        End If

        imc.Text = (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString

        If imc.Text < 16.5 Then
            labelimc.Text = ("Dénutrition ou famine")
            labelimc.BackColor = Color.Red
        End If

        If imc.Text < 18.5 Then
            labelimc.Text = "Maigreur"
            labelimc.BackColor = Color.Yellow
        End If

        If imc.Text < 25 Then
            labelimc.Text = "Corpulence normale"
            labelimc.BackColor = Color.White
        End If

        If imc.Text < 30 Then
            labelimc.Text = "Surpoids"
            labelimc.BackColor = Color.Yellow
        End If

        If imc.Text < 35 Then
            labelimc.Text = "Obésité modérée"
            labelimc.BackColor = Color.Chocolate
        End If

        If imc.Text < 40 Then
            labelimc.Text = "Obésité sévère"
            labelimc.BackColor = Color.OrangeRed
        End If

        If imc.Text > 40 Then
            labelimc.Text = "Obésité morbide ou massive"
            labelimc.BackColor = Color.Red
        End If


    End Sub



chrishm
0
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012
5 févr. 2012 à 20:07
     imc.Text = (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString

        If imc.Text < 16.5 Then
            labelimc.Text = ("Dénutrition ou famine")
            labelimc.BackColor = Color.Red
        ElseIf imc.Text < 18.5 Then
            labelimc.Text = "Maigreur"
            labelimc.BackColor = Color.Yellow
        ElseIf imc.Text < 25 Then
            labelimc.Text = "Corpulence normale"
            labelimc.BackColor = Color.White
        ElseIf imc.Text < 30 Then
            labelimc.Text = "Surpoids"
            labelimc.BackColor = Color.Yellow
        ElseIf imc.Text < 35 Then
            labelimc.Text = "Obésité modérée"
            labelimc.BackColor = Color.Chocolate
        ElseIf imc.Text < 40 Then
            labelimc.Text = "Obésité sévère"
            labelimc.BackColor = Color.OrangeRed
        ElseIf imc.Text > 40 Then
            labelimc.Text = "Obésité morbide ou massive"
            labelimc.BackColor = Color.Red
        End If

    End Sub


merci pour vos indication problème résolu.
chrishm
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 févr. 2012 à 20:35
Les problèmes de base demeurent.
imc.Text = (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString
....
If imc.Text < 16.5...


Prend l'habitude de travaille directement sur des nombres plutot que sur des string avec des convertions implicites hasardeuses, sources de bugs difficilement identifiables.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 févr. 2012 à 20:37
Bonjour, casy,
Pardi !
Et merci d'insister sur cet aspect fondamental.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 févr. 2012 à 20:40
Il y repensera en découvrant (le plus tôt possible serait le mieux) que "110.4" est plus petit que "2"


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 févr. 2012 à 20:43
Oui et aussi que (Math.Round(sPoids / (sTaille * sTaille), 1)).ToString s'écrit 16,5 en France par exemple et non pas 16.5


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 févr. 2012 à 20:45
En plus !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012
5 févr. 2012 à 20:48
que proposez-vous comme code ?
moi je suis novice, mais vous, vous étés des stars.
alors comment vous feriez que je sache comment m'y prendre dans le future.

chrishm
0
chrishm Messages postés 5 Date d'inscription vendredi 10 décembre 2004 Statut Membre Dernière intervention 5 février 2012
5 févr. 2012 à 22:13
ok merci beaucoup, l'explication est vraiment au top niveau. tu ma super bien éclairer, c'est le premier programme que j’essaie.
et les explication ne sont pas toujours très clair, mais la je pense avoir compris.
merci.


chrishm
0
Rejoignez-nous