Calcul Moyenne Visual Basin

Résolu
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014 - 9 nov. 2011 à 20:06
 acive - 11 nov. 2011 à 19:26
Bonjour à tous, j'ai un peu honte de poser cette question, mais ça fait un bout de temps que j'ai pas travaillé sur VB...je suis + habitué à C/C++:

Voila, truc tout bête, je veux calculer une moyenne/note max/note min sur une entrée de diverses notes de controles...en terminant la saisie par une note >20:
bref, voila mon code :

Sub Macro2()

'dimensionnement des variables
Dim som As Single
Dim y As Single

Dim min As Single
Dim max As Single
Dim x As Single
Dim moy As Single

'initialisation des variables
moy = 0
som = 0
min = 20
max = 0
y = 0

'entrée des données

Do While x <= 20

x = InputBox("entrez les notes des éleves, terminez votre série de note par une valeur supérieure à 20")


If x < min Then
min = x

End If

If x > max Then
max = x

End If

som = som + x
y = y + 1
moy = som / y


Loop



'Résultats
MsgBox (" note minimum=" & min)
MsgBox ("note maximum=" & max)
MsgBox ("moyenne des notes=" & moy)
MsgBox (" merci de m'avoir utilisé !")

End Sub

bon, rien de bien méchant, mais j'ai completement zappé comment faire en sorte que la derniere valeur ( ne remplissant pas la condition <=20) ne soit pas prise en compte ...

actuellement si j'entre : 10, 11, 1000, j'ai note min:10, note max 1000 et moy= 340.333...

quelles instruction utiliser pour ne pas prendre en compte les notes >20 ? en C aucun probleme mais en VB je bloque betement :/

Merci pour votre aide ;)
Axel
A voir également:

55 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 22:38
Là si jmet 10 11 30 jobtiens pas une somme de 21 mais de 51 !
DONC je veux pas que la note >20 soit prise en compte !!

Avec TON code, ami,
Pas avec MON code !
Allez ! bonne nuit !

____________________
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
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014
9 nov. 2011 à 22:40
au temps pour moi : faute de frappe :

if x<min then
min=x
end if
if x>max then
max=x
end if

c'est exactement ce que j'ai mi
0
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014
9 nov. 2011 à 22:46
oh désolé on parlait de ton code ! jcroyais que je demandais l'instruction qui ne prenait pas en compte la valeur >20 de MON code...
au temps pour moi, sincerement.
0
Utilisateur anonyme
9 nov. 2011 à 22:53
D'ailleurs tu peux remplacer :
Do While x <= 20


par :

Do
0

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

Posez votre question
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014
9 nov. 2011 à 22:53
merci banana 32, désolé d'avoir pu paraitre agacé.

Mais ta solution ne fonctionne toujours pas

ca ne change rien du tout :

DO WHILE x<=20
et if x>20 then exit do
ne signifient pas la meme chose ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 22:55
pas trop vite, Banana32 (on vien de m'appeler au téléphone et je ne me suis donc pas encore couché )
Le diablotin que je suis frappe "a" dans ton inputbox et "envoie tout en l'air" avec un splendide plantage
Mais pas seulement ainsi
Ah ! les garde-fous !

____________________
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
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014
9 nov. 2011 à 22:55
et ton DO a la place de DO WHILE x<=20 ne change toujours rien

corde+moi=solution
0
Utilisateur anonyme
9 nov. 2011 à 23:00
ucfoutu t'as donné une solution fonctionnelle, l'as-tu testée ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 23:07
Allez ... Je veux faire de beau rêves ===>>> donc ===>>
Dim moy As Double, som As Single, min As Integer, max As Integer, y As Integer, la_note_min As Single, la_note_max As Single
  som = 0
  min = 0
  max = 20
  y = 0
  la_note_min = 500 '(et pourquoi pas ?)
  la_note_max = -100  ' je veux dormir tranquille
  Do While Val(x) <= max
    x = InputBox("entrez les notes des éleves, terminez votre série de note par une valeur supérieure à 20")
    If Val(x) <= max And Val(x) >= min And IsNumeric(x) Then
      som = som + Val(x)
      y = y + 1
      If Val(x) <la_note_min Then la_note_min Val(x)
      If Val(x) >la_note_max Then la_note_max Val(x)
    ElseIf Not IsNumeric(x) Then
    Else
      Exit Do
    End If
  Loop
  moy = som / y
  MsgBox "moyenne : " & moy & vbCrLf & "note mini : " & la_note_min & vbCrLf & "note maxi : " & la_note_max

Voilà !
Je répète maintenant ce que j'ai dit plus haut : si saisie de notes avec décimales ===>> va falloir ajouter des petites choses (peu) à cet exemple qui traite des notes "entières".
Bonne nuit (pour de bon, maintenant).


____________________
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
Utilisateur anonyme
9 nov. 2011 à 23:08
ElseIf Not IsNumeric(Val(x)) Then

Non ?
0
Axeu Messages postés 49 Date d'inscription jeudi 22 novembre 2012 Statut Membre Dernière intervention 20 juin 2014
9 nov. 2011 à 23:09
je reste perplexe

en correlation, c'est un ptit peu comme si en C++ j'avais
(1) if(i=0,i<20,i++)
qui est différent de
(2) if (i=0,i<=20,i++)

(1) une fois que la valeur est i-1, on ferme la condition
(2) iune fois que la valeur est i, on ferme la condition

Bon c'est une analogie mais dans le délire c'est un peu pareil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 23:53
ElseIf Not IsNumeric(Val(x)) Then

non, Banana32. Isnumeric ne sait pas (erreur assurée) voir si un numérique est une expression numérique. Il lui faut un string ou un variant uniquement (et il regarde alors si ce string ou variant peut exprimer un numérique) .


____________________
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_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 nov. 2011 à 02:01
Salut

Sub Macro2()

'dimensionnement des variables
Dim som As Single
Dim y As Single

Dim min As Single
Dim max As Single
Dim x As Single
Dim moy As Single

'initialisation des variables
moy = 0
som = 0
min = 20
max = 0
y = 0

'entr?e des donn'es

Do While x <= 20

x = InputBox("entrez les notes des ?leves, terminez votre s?rie de note par une valeur sup?rieure ? 20")

If x > 20 Then
Exit Do
End If
  

If x < min Then
min = x

End If

If x > max Then
max = x

End If

som = som + x
y = y + 1
moy = som / y


Loop



'R?sultats
MsgBox (" note minimum=" & min)
MsgBox ("note maximum=" & max)
MsgBox ("moyenne des notes=" & moy)
MsgBox (" merci de m'avoir utilis? !")

End Sub


testé
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 nov. 2011 à 02:16
en plus c'est le meme code que Banana32
donc je n'ai rien fait de mieux
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 nov. 2011 à 11:30
Alors ?
Je me suis quand-même amusé à pousser le bouchon, pour que notre ami puisse apprécier les qualités et l'élégance de VB6.
Ici : l'utilisateur est :
- guidé de A à Z (y compris en lui faisant savoir, dans le titre, où il en est dans ses notes valables
- obligé de saisir en utilisant le séparateur de décimales en vigueur sur sa machine
- informé si erreur
- protégé par différents garde-fous (de A à Z également, y compris si aucune note valable) :
Private Type voila
fini As Boolean
erreur As Boolean
valeur As Single
sep As String
End Type

Private Sub Command2_Click()
    Dim x As String, Numeronote As Integer, sep As String, som As Single, moy As Single
    Dim min As Single, max As Single
    Dim toto As voila
    sep = traitons("1.1").sep
    Do While toto.fini False Or toto.erreur True
      titre = "saisie des notes : Note N° " & Numeronote + 1
      msg = "          entrez cette note entre 0 et 20 inclus, s'il vous plait" & vbCrLf & "si décimale,  utiliser " & sep & " comme séparateur décimal" & vbCrLf & _
      "terminez votre série de notes par une valeur supérieure à 20"
      x = InputBox(msg, titre)
      toto = traitons(x)
      If toto.fini = True Then Exit Do
      If toto.erreur Then
         MsgBox "erreur de saisie ! " & vbCrLf & "non numérique ou note négative ou séparateur décimal (c'est " & sep & " qui est attendue) non adéquat"
      Else
        som = som + toto.valeur
        Numeronote = Numeronote + 1
        If Numeronote 1 Then min toto.valeur: max = toto.valeur
        If toto.valeur < min Then min = toto.valeur
        If toto.valeur > max Then max = toto.valeur
      End If
    Loop
    If Numeronote = 0 Then
      MsgBox "aucune note n'a été valablement attribuée ===>> je quitte donc ici"
      Exit Sub
    Else
      moy = som / Numeronote
      MsgBox "j'ai donc ici " & Numeronote & " note(s) valablement saisie(s)" & vbCrLf & _
      "la note minimum donnée est : " & min & vbCrLf & _
      "la note maximum donnée est " & max & vbCrLf & _
      "pour une moyenne générale de " & moy
    End If
End Sub

Private Function traitons(Q As String) As voila
  Static sep As String, erreur As Boolean
  If sep = "" Then
    If IsNumeric("0,1") Then
      sep = "une virgule"
    Else
      sep = "un point"
    End If
    traitons.sep = sep
    Exit Function
  End If
  If Not IsNumeric(Q) Or Val(Q) < 0 Then
    traitons.erreur = True: Exit Function
  Else
    traitons.erreur = False
    traitons.valeur = CDec(Q)
  End If
  If traitons.valeur > 20 Then traitons.fini = True
End Function


J'aurais largement pu ne pas utiliser une structure, comme je l'ai fait ici. Je n'ai choisi ce procédé que pour permettre à notre ami de saisir au passage les capacités diverses de VB6 et l'encourager à les étudier
____________________
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
10 nov. 2011 à 11:32
Ah zut : attention :
J'ai malencontreusement mal inséré mes balises ===>>
ces lignes, restées "en dehors", doivent y figurer au tout début, avant la première procédure.
Private Type voila
  fini As Boolean
  erreur As Boolean
  valeur As Single
  sep As String
End Type 



____________________
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
10 nov. 2011 à 11:43
Ah oui (oublié de le dire) : et j'ai bien entendu traité également le problème des notes éventuellement décimales (et en tenant compte de la machine de l'utilisateur)


____________________
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
Utilisateur anonyme
10 nov. 2011 à 13:17
Très intéressant ton cheminement de fabrication de code ucfoutu.
Cette fois ci, tu respectes bien les types de variables, et cerise sur le gâteau, plus de Val
0
Utilisateur anonyme
10 nov. 2011 à 13:19
Ah si, un tout petit mais qui ne se voit presque pas...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 nov. 2011 à 16:29
ce val là est volontairement laissé car moins "gourmand" !
si tu veux absolument le remplacer, ce ne sera pas surtout pas par cdec, mais ainsi :
If Not IsNumeric(Q) Or Left(Q, 1) = "-" Then

(mais inutilement plus "gourmand", même si très peu. Et je suis un avare, en plus d'être un fou )


____________________
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
Rejoignez-nous