Javascript : Suite de nombre dans une variable non reconnue

Résolu/Fermé
WakawaRider Messages postés 16 Date d'inscription lundi 10 février 2014 Statut Membre Dernière intervention 14 février 2014 - 10 févr. 2014 à 13:04
WakawaRider Messages postés 16 Date d'inscription lundi 10 février 2014 Statut Membre Dernière intervention 14 février 2014 - 14 févr. 2014 à 12:42
Bonjour,
J'ai très peu de connaissance en informatique.
Je tente pour la première fois de créer une fonction pour calculer la moyenne des précipitations sur les 20 dernières années et l'année en cours pour un mois de l'année.
Les données sont obtenues avec une station météo amateur et le logiciel WsWIn32 par des tags de type %pluie_du_mois_X% envoyant une valeur numérique que je transforme en variable dans un fichier Javascript.
La variable est écrite sur 3 lignes car WsWin32 ne permet que 10 tags sur une même ligne.
La première valeur est celle de l'année en cours; elle est nulle si le mois n'est pas commencé.
Les suivantes sont les valeurs des années précédentes (n-1, n-2, ... jusqu'à n-20).
La station météo est en place depuis 2007 donc les années n-8 et suivantes sont inexistantes pour l'instant et remplacées par "--"
Voici où j'en suis :
var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
			"64.0,--,--,--,--,--,--,"+
			"--,--,--,--,--,--,--";
  function moyenne_pluie(pluie) {
	  pluie = pluie.substring(0,pluie.indexOf("-")-1);
if (pluie.substring(0,pluie.indexOf(",")) == "0.0")
{
	var pluie = pluie.substring(4);
};
 var n = pluie.length;
        var somme = 0;
        for(i=0; i<n; i++)
                somme += pluie[i];
        return somme/n;
  };
alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" )

J'ai droit à un superbe NaN que je n'arrive pas à résoudre.
Pourriez-vous corriger mes erreurs, soit sur la construction de la variable, soit sur la fonction elle-même ... voire les deux !...
Cordialement

1 réponse

[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
Modifié par [Dal] le 10/02/2014 à 14:40
Salut WakawaRider,

Tu peux faire comme cela :

var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
   "64.0,--,--,--,--,--,--,"+
   "--,--,--,--,--,--,--";
function moyenne_pluie(pluie) {
  // suppression du 0.0 initial éventuel
  pluie = pluie.replace(/^0\.0,/,"");
  // capture des chiffres
  var myRe = /(\d+\.\d+)/g;
  var myArray = pluie.match(myRe);
  // calcul de la moyenne des précipitations
  // contenues dans le tableau myArray
  var moyenne = 0;
  for (var i=0; i<myArray.length; i++)
  {
    moyenne = moyenne  + Number(myArray[i]);
  }
  moyenne = moyenne / myArray.length;
  return moyenne;
}
alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" ) 



Dal
2
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
10 févr. 2014 à 15:03
Il faudrait rajouter un
if (myArray.length > 0)
juste avant le
moyenne = moyenne / myArray.length
pour bien faire, histoire d'éviter les divisions par 0 :)
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
10 févr. 2014 à 15:23
oui, merci
0
WakawaRider Messages postés 16 Date d'inscription lundi 10 février 2014 Statut Membre Dernière intervention 14 février 2014
10 févr. 2014 à 15:54
Merci de cette réponse rapide.

J'ai intégré dans la fonction la remarque de Reivax962 ainsi que l'arrondi à1 chiffre après la virgule ce qui est suffisant pour cette valeur.
Est-ce correct comme ça ?
var pluies_de_janvier = "0.0,86.6,42.0,28.0,51.0,26.6,74.6,"+
   "64.0,--,--,--,--,--,--,"+
   "--,--,--,--,--,--,--";
function moyenne_pluie(pluie) {
  // suppression du 0.0 initial éventuel
  pluie = pluie.replace(/^0\.0,/,"");
  // capture des chiffres
  var myRe = /(\d+\.\d+)/g;
  var myArray = pluie.match(myRe);
  // calcul de la moyenne des précipitations
  // contenues dans le tableau myArray
  var moyenne = 0;
  for (var i=0; i<myArray.length; i++)
  {
	  if (myArray.length > 0) {
    moyenne = moyenne  + Number(myArray[i]);
	  }
  }
  moyenne = (moyenne / myArray.length).toFixed(1);
  return moyenne;
}
alert ("Moyenne de janvier : "+moyenne_pluie(pluies_de_janvier)+" mm" )

Puisque j'ai la chance d'avoir affaire à des interlocuteurs visiblement très compétents, je vous demande comment intégrer deux choses de plus dans cette fonction :
- comment tenir compte du fait qu'il est possible qu'il ne pleuve pas cette année et les suivantes pendant le mois en cours, donc intégrer cette valeur nulle à la moyenne ?
-Comment modifier la moyenne en ne tenant compte de la variable du mois en cours qu'à partir de la fin du mois seulement (disons le 28 du mois pour simplifier) pour ne pas fausser le résultat ?
Merci par avance
Cordialement
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
10 févr. 2014 à 16:21
Le if (myArray.length > 0) n'est pas au bon endroit !
  for (var i=0; i<myArray.length; i++)
  {
    moyenne = moyenne  + Number(myArray[i]);
  }
if (myArray.length > 0) {
   moyenne = (moyenne / myArray.length).toFixed(1);
}
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
10 févr. 2014 à 16:28
Bonjour,

Dans le code "0.0" n'est ignoré dans le calcul que s'il est la première valeur sur la ligne. Dès lois, je ne comprends pas bien ce que tu veux faire.

Le if (myArray.length > 0) devrait être placé autrement et avec un code d'erreur utile permettant à la fonction appelante de savoir que quelque chose s'est mal passé car on ne dispose d'aucun chiffre pour calculer la moyenne (par exemple en renvoyant -1).

  // calcul de la moyenne des précipitations
  // contenues dans le tableau myArray
  var moyenne = 0;
  if (myArray.length > 0) {
    for (var i=0; i<myArray.length; i++) {
      moyenne = moyenne  + Number(myArray[i]);
    }
    moyenne = (moyenne / myArray.length).toFixed(1);
  } else {
    // erreur, aucune précipitation détectée
    moyenne = -1;
  }
  return moyenne;


Dal
0