Signe d'une opération en paramètre ?

Bonjour,

Dans le cadre de mon boulot (prof de math), je suis en train de créer une page html avec un peu de javascript.
Cette page étant pour le niveau 5ème, je leur fait faire des additions et soustractions sur les nombres relatifs (moins facile qu’il n’y parait pour un petit jeune)

J’ai donc créé deux fonctions de vérifications, une pour l’addition (voir ci-dessous), l’autre pour la soustraction.
Ce que j’aimerais faire, c’est n’en avoir qu’une seule et passer le signe de l’opération en paramètre, ce qui pourrais me servir par la suite pour d’autres opérations…

function donne_reponse_add(i) {
	var resultat, rep;
	
	resultat = parseInt(document.getElementsByName("a")[i].value,10) + parseInt(document.getElementsByName("b")[i].value,10);
	rep = document.getElementsByName("r")[i].value;

	if ((resultat == rep) & (rep.length>0)) {
		document.img[i].src = 'on.gif';
	}
	else {document.img[i].src = 'off.gif'}
}

Edité le 24/07/2008 à 11:54

Si tu veux quelque chose de vraiment générique, tu peux utiliser la fonction “Eval”, qui exécute le code Javascript passé en paramètre. Ca donnerait donc quelque chose du genre :


function donne_reponse(i, signe) {
	var resultat, rep;
	
        eval('resultat = parseInt(document.getElementsByName("a")[i].value,10) ' + signe + ' parseInt(document.getElementsByName("b")[i].value,10)');
	
	rep = document.getElementsByName("r")[i].value;

	if ((resultat == rep) & (rep.length>0)) {
		document.img[i].src = 'on.gif';
	}
	else {document.img[i].src = 'off.gif'}
}


Pas testé, donc peut être quelques ajustements à faire…

Tu n’as plus qu’à appeler ta fonction comme avant en ajouter le signe en second paramètre, genre donne_reponse(3, ‘+’).

Mais le mieux et le plus propre reste quand même de faire un test sur le signe et exécuter le code en conséquence :


function donne_reponse(i, signe) {
	var resultat, rep;
      
if (signe == '+')
{	
        resultat = parseInt(document.getElementsByName("a")[i].value,10)  + parseInt(document.getElementsByName("b")[i].value,10)
}else if (signe == '-')
{
        resultat = parseInt(document.getElementsByName("a")[i].value,10) - parseInt(document.getElementsByName("b")[i].value,10)
}
//Etc...
	
	rep = document.getElementsByName("r")[i].value;

	if ((resultat == rep) & (rep.length>0)) {
		document.img[i].src = 'on.gif';
	}
	else {document.img[i].src = 'off.gif'}
}


Edité le 24/07/2008 à 12:29

Au lieu de passer le signe de l’opération en paramètre, tu passes 1 ou -1, et tu en fais le produit par ta deuxième valeur récupérée avant de faire ta somme

Petite remarque: utilise l’attribut id et document.getElementById :

Et ainsi: parseInt(document.getElementById(‘foobar’).value);

+1

J’ai effectivement oublié que ça se limitait à l’addition et la soustraction :slight_smile:

A termes, peut-être pas, mais j’ai commencé par ces deux là, qui sont techniquement les plus compliquées.
Pour la multiplication, la règle est plutôt très simple ; je trouve qu’il n’est pas très pertinent de proposer ce genre d’exercice.[quote=“Sans-Nom”]
Petite remarque: utilise l’attribut id et document.getElementById :

Et ainsi: parseInt(document.getElementById(‘foobar’).value);
[/quote]
Le problème c’est que j’ai mis 5 calculs sur la page, que je fais remplir aléatoirement.
Le getlEmentsByName me permet d’additionner deux vecteurs colonnes coordonnées par coordonnées et de comparer à celle du vecteur résultat.

Sinon : quelle est la différence fondamentale entre getElementBy Id et getElementsByName ?

Hé bien la différence est simple : dans un cas (getElementsByName) tu récupère tous les éléments qui pour nom (name) sous forme de tableau, alors que dans l’autre tu ne récupère qu’un seul élément identifié de manière unique (foobar dans mon exemple)

mais si je comprend bien ton cas, tu as un tableau de plusieurs éléments, donc ton utilisation est peut-être bonne. mais si tu n’as qu’un seul élément, getElementById est mieux.

Pourquoi pas une fonction de la forme
donne_reponse_add(operande1, operande2, operateur) ?

Voici la page en question, c’est mieux qu’un long discours d’explications.

C’est sûr qu’il doit y avoir plusieurs manières d’aboutir au même résultat.
J’ai trouvé cette solution (les cours de C++ de la fac sont un peu loin, alors je fais avec mes souvenirs :icon_biggrin:)

Moi je propose mieux, et objet:

var Operator = {
  Add: {eval : function (a, b) {return a + b;}},
  Substract: {eval : function (a, b) {return a - b;}},
  Multiply: {eval : function (a, b) {return a * b;}},
  Divide: {eval : function (a, b) {return a / b;}}
};

function donne_reponse(i, op) {
   var a = parseInt(document.getElementsByName("a")[i].value,10);
   var b = parseInt(document.getElementsByName("b")[i].value,10);
   var resultat = op.eval(a, b);
   var rep = document.getElementsByName("r")[i].value; // pense bien à la logique si tu fais un parseInt plus haut, faut le faire ici.
   if ((resultat == rep) & (rep.length>0)) {
     document.img[i].src = 'on.gif';
  }   else {document.img[i].src = 'off.gif'}
}

Et à l’appel:

donne_reponse(1, Operator.Add);

etc;

Frimeur :o

Je garde ça sous la main, c’est beau :clap: