1
votes

En Javascript, calculatrice simple, ne fonctionne pas

J'ai essayé d'obtenir des nombres par prompt (), ainsi que par le nom de l'action. Mais le résultat n'est pas comme prévu

Je suis nouveau dans la programmation .. code:

function add(n1, n2){   return n1 + n2;}

function sub(n1, n2){   return n1 - n2;}

function mult(n1, n2){  return n1 * n2;}

function div(n1, n2){   return n1/n2;}


function calculator(n1, n2, action){

    alert(action(n1, n2));
}

calculator(prompt("first no,"), prompt("second No"), prompt("calc"));


4 commentaires

Comment poser une bonne question? , Comment mettre en forme mes articles en utilisant Markdown ou HTML?


action doit être une fonction mais vous lui passez une chaîne (que le navigateur vous indiquera dans la console: TypeError: l'action n'est pas une fonction )


Plutôt que de faire cela, vous pouvez créer un objet ayant ces méthodes et appeler les méthodes.


où dois-je modifier ce code pour qu'il fonctionne comme prévu?


3 Réponses :


6
votes

Deux choses à faire:

  1. Analyser l'entrée comme flottant
  2. Mapper le nom de la fonction donné par l'utilisateur

function add(n1, n2) { return n1 + n2; }
function sub(n1, n2) { return n1 - n2; }
function mult(n1, n2) { return n1 * n2; }
function div(n1, n2) { return n1 / n2; }

function calculator(n1, n2, action) {
  alert(action(n1, n2));
}

function findOperation(name) {
  switch (name) {
    case "sub":
      return sub;
    case "mult":
      return mult;
    case "div":
      return div;
    case "add":
    default:
      return add;
  }
}

calculator(
  parseFloat(prompt("first no,")),
  parseFloat(prompt("second No")),
  findOperation(prompt("Operation Name?"))
);


0 commentaires

0
votes

la fonction de calcul doit être:

function calculator(n1, n2, action){

    alert(eval(action+'('+n1+', '+n2+')'));
}


0 commentaires

2
votes

Je vous suggère de prendre le temps d'apprendre quelques bases, vous ne pouvez pas convertir une chaîne en un appel de fonction à moins d'utiliser eval () comme ceci:

const ops = {
"add": (n1, n2) => n1 + n2,
"sub": (n1, n2) => n1 - n2,
"mult": (n1, n2) => n1 * n2,
"div": (n1, n2) => n1/n2
}

function calculator(n1, n2, action){
alert(ops[action](parseFloat(n1), parseFloat(n2)));
}

calculator(prompt("first no,"), prompt("second No"), prompt("calc"));

Mais c'est vraiment piraté et code non sécurisé, une meilleure approche serait:

function add(n1, n2){ return n1 + n2;}
function sub(n1, n2){ return n1 - n2;}
function mult(n1, n2){ return n1 * n2;}
function div(n1, n2){ return n1/n2;}

function calculator(n1, n2, action){
alert(eval(`${action}(${n1}, ${n2})`));
}

calculator(prompt("first no,"), prompt("second No"), prompt("calc"));

Notez également le parseFloat (), si vous conservez les paramètres sous forme de chaînes, vous obtiendrez:

entrée: "1", "2", "ajouter" sortie: "12"


0 commentaires