Bonjour tous le monde,
j'ai question a posé:
Est ce qu'on pourrai calculer une moyenne d'une chaîne qui est composée de 56 données ( les données sont des nombre)?
Merci d'avance.
Bonjour tous le monde,
j'ai question a posé:
Est ce qu'on pourrai calculer une moyenne d'une chaîne qui est composée de 56 données ( les données sont des nombre)?
Merci d'avance.
Salut,
oui, tu peux récupérer les différentes valeurs de ta chaîne avec la fonction Split suivant un caractère de séparation.
Plus je connais de langages, plus j'aime le C.
Bonjour,
Oui j'ai utilisé Split avec un espace entre les valeurs, et j'ai utiliser le programme suivant:
mais il m'affiche que Take n'est pas un membre de 'Integer'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Dim convelements As Integer ' la j'ai converti elements qui est un string en integer convelements = val(elements) Dim moyenne = moyenne.Take(10).average() cosole.write(moyenne)
merci pour votre réponse.
Voilà comment je voyais ça :
- on split la string,
- on parcourt les items ; pour chacune : on cast la valeur en int qu'on ajoute à une variable,
- on divise le tout par le nombre d'éléments de la chaine splitée
Dans ton code, à part Console.Write() (mal orthographié) je ne comprends pas grand chose.
Plus je connais de langages, plus j'aime le C.
je m'explique un peu plus,
J'ai (elements) comme un String (chaine).
J'ai déclaré (convelements) comme integer pour convertir ma chaine en integer.
puis j'ai tenter de calculer la moyenne des 10 valeurs que j'ai en utilisant convelements.Take(10).Average()
Et à quel moment tu split ? ...
De plus, et après recherche, la fonction val() ne semble plus exister en VB.NET.
Je te mets un bout de code en C# qui fait le taff, après je te laisse y réfléchir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 string elements = "12 13 14 15 87 96 364"; int total = 0; double moyenne = 0.0; string[] vals = elements.Split(' '); if (vals.Length > 0) { foreach (string val in vals) total += int.Parse(val); moyenne = 1.0 *total / vals.Length; }
Plus je connais de langages, plus j'aime le C.
Voila je vous partage le bout de code que j'ai fait:
il m'affiche toujours l'erreur suivante: error BC30456: 'Take' n'est pas un membre de 'Integer'.
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 Dim Split As String() = Data.Split(New [Char]() {" "c, ","c, CChar(vbTab)}) For Each s As String In Split If s.Trim() <> "" Then Dim i As Integer For Each elements As String In s.Split(" ") If i > 20 And i < 28 Or i > 31 And i < 39 Or i > 42 And i < 50 Or i > 53 And i < 61 Or i > 64 And i < 72 Or i > 75 And i < 83 Or i > 86 And i < 94 Or i > 97 And i < 105 Then ' Traitement de chaques éléments récupérés: 'Console.Write(elements & " ") 'découper elements Split = elements.Split(New [Char]() {" "c, ","c, CChar(vbTab)}) For Each j As String In Split If j.Trim() <> "" Then Dim numbers As Integer = (j) Dim average As Double = numbers.Take(3).Average() End If Console.Write(j & " ") Next j End If i = i + 1 Next End If Next s
merci bien de me débloquer.
Evite de nommer tes variables avec des noms utilisés par le langage comme split
Si tu écris
pourquoi écrire dans ta boucle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim Split As String() = Data.Split(New [Char]() {" "c, ","c, CChar(vbTab)})
tu écris
Code : Sélectionner tout - Visualiser dans une fenêtre à part For Each elements As String In s.Split(" ")
If i > 20...
où dans le code as tu assigné une valeur à i ?
Peux tu expliquer ce que dois faire ton code ?
Merci pour votre réponse,
Dans le code, j'ai découpé Data qui est un string de 128 valeurs avec Split et j'ai supprimer les valeurs dont je n'ai pas besoin, j'ai récupérer les données que je veux dans elements qui comporte 56 valeurs, et là je veux faire une moyenne sur chaque 7 valeurs qui se suit par exemple la moyenne de la première valeurs jusqu'a la 7 et de la 8ieme jusqu'à la 14 ieme et ainsi de suite. Et récupérer les moyenne a la fin.
Merci beaucoup.
À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.
Ô Saint Excel, Grand Dieu de l'Inutile.
Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.
Bonsoir,
Take() c'est pour bien précisé le nombre de valeurs pour faire la moyenne.
J'ai vu qu'il existe cette commande comme ça
Dim average As Double = numbers.Take(3).Average()
c'est pour lui donner le nombre de valeurs a moyenné (par exemple dans ce cas, il me ferra la moyenne de trois premières valeurs)
et y a aussi une autre commande:
Dim average As Double = numbers.Average()
elle me fait la moyenne de toute la chaîne.
si vous avez une autre méthode elle sera la bienvenue. Merci pour votre aide.
tel que tu as écris je suis presque sur que tu vas obtenir une erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part If i > 20 And i < 28 Or i > 31 And i < 39 Or i > 42 And i < 50 Or i > 53 And i < 61 Or i > 64 And i < 72 Or i > 75 And i < 83 Or i > 86 And i < 94 Or i > 97 And i < 105 Then
Quels sont les éléments que tu veux récuperer ?
Les 128 valeurs sont des valeurs qui changent a chaque fois que je fait l'acquisition des données d'un capteur. se sont pas des valeurs fixes. je vous donne un exemple ( 125.58 8.2584 125.325 14 258.14 125 ........)
Merci encore une autre fois.
Donc a chaque fois que je demande au capteur une acquisition de données, il me donne une chaine de 128 valeurs comme par exemple ( 125.58 8.2584 125.325 14 258.14 125 ........)
Suivant ce bout de code, j'ai récupéré une chaine Data(qui est une chaine de 128 valeurs) et j'ai fait découper ma chaine avec Split, j'ai déclaré elements comme string pour récupérer 56 valeurs des 128 de Data. et je veux calculer une moyenne pour les 56 valeurs de elements mais je doit faire une moyenne de chaque 7 valeurs qui se suit. Pour cela j'ai utiliser la fonction suivante : Dim average As Double = numbers.Take(7).Average()
avec ça il m'affiche une erreur suivante : error BC30456: 'Take' n'est pas un membre de 'Integer'
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 Dim Split As String() = Data.Split(New [Char]() {" "c, ","c, CChar(vbTab)}) For Each s As String In Split If s.Trim() <> "" Then Dim i As Integer For Each elements As String In s.Split(" ") If i > 20 And i < 28 Or i > 31 And i < 39 Or i > 42 And i < 50 Or i > 53 And i < 61 Or i > 64 And i < 72 Or i > 75 And i < 83 Or i > 86 And i < 94 Or i > 97 And i < 105 Then ' Traitement de chaques éléments récupérés: 'Console.Write(elements & " ") 'découper elements Split = elements.Split(New [Char]() {" "c, ","c, CChar(vbTab)}) For Each j As String In Split If j.Trim() <> "" Then Dim numbers As Integer = (j) Dim average As Double = numbers.Take(7).Average() End If Console.Write(j & " ") Next j End If i = i + 1 Next End If Next s
Mais dans ce bout de code je récupère les données le plus normalement et je les affiche bien avec console.Write(elements),
ce que je veux moi c'est de faire une moyenne pour les valeurs de la chaine elements.
Merci pour votre réponse.
Tu découpes ta chaine
alors pourquoi tu la découpes de nouveau ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim Split As String() = Data.Split(New [Char]() {" "c, ","c, CChar(vbTab)})
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 For Each s As String In Split If s.Trim() <> "" Then Dim i As Integer For Each elements As String In s.Split(" ")
vaut mieux écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim split As String() = data.Split(New [Char]() {" "c, ","c, Convert.ToChar(Keys.Tab)}, StringSplitOptions.RemoveEmptyEntries)
A priori les parenthèses serait inutiles (point de vue code pas point de vue lisibilité parce que là ) ; il semblerait que ce soit une suite d'intervalles donc i > min1 And i < max1 Or i > min2 And i < max2 '... fonctionnera comme souhaité.
Après ça serait encore mieux avec des AndAlso et des OrElse on zapperait ainsi tous les tests inutiles dès lors que ceux déjà effectués permettent de déjà connaitre le résultat final ; mais je serait carrément partisan d'un Select Case là même avec seulement un cas plus le Case Else, sa capacité à gérer les intervalles rendrait le tout plus lisible.
Ensuite plutôt que d'avoir un premier split ; puis un second (dont je ne comprends pas vraiment l'intérêt) des cast en nombre à l'arrache (merci Option Strict Off) remettons un peu les choses à plat.
Tu pars d'une trame et tu veux extraire ces nombres, filtrer ceux qui t'intéressent et faire les moyennes de 7 en 7 alors fais donc ça étape par étape.
- on part de la chaine "nombre_1 nombre_2 ... nombre_n" -> on la splitte ce qui nous donne un tableau de chaines [ "nombre_1", "nombre_2", ..., "nombre_n" ]
- on convertit ce tableau en tableau de nombres -> [ nombre_1, nombre_2, ..., nombre_n ] (penser à Enumerable.Select ou Array.ConvertAll) [Note: que faire en cas théorique "d'intrus" (un truc qui n'est pas un nombre) dans le tas ?)
- on transforme notre tableau de nombres en tableau de tableaux de nombres, chacun de 7 éléments -> [ [ nombre_1, nombre_2, ..., nombre_7 ], [ nombre_8, ..., nombre_n ] ] (plusieurs méthodes là, on y reviendra au besoin) [Note: que faire du dernier tableau qui peut théoriquement avoir moins de 7 éléments ?]
- on fait la moyenne de chaque "sous-tableau" -> [ moyenne_1_7, moyenne_8_n ] (a priori un Enumerable.Average devrait suffire)
- exploiter les résultats -> Enjoy
Pour l'histoire du regroupement, on peut faire ça "impérativement", on parcourt notre tableau de nombres, et on ajoute au premier sous-tableau tant qu'il n'y a pas le compte, puis on continue avec le suivant (ça reste un pseudo-code général pour pas trop griller la solution [penser au modulo et à la division entière ]
(Une autre approche, consisterait à passer par du Linq avec un petit "trick" (qui fait en gros la même chose qu'évoqué juste avant))
Comme dirait l'autre, "y'a plus qu'à"
Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
À quelle heure dormez-vous ?
Censément, quelqu'un de sensé est censé s'exprimer sensément.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager