【问题标题】:Calculator function based on passed in arguments基于传入参数的计算器函数
【发布时间】:2020-01-06 09:59:50
【问题描述】:

我正在构建一个简单的计算器作为家庭作业。该函数接受两个数字(number1、number2)和一个运算符(+、-、*、/)作为参数。

但是有几种情况:

  1. 如果缺少运算符 --> 返回“提供的数据错误”
  2. 如果不是,则正常计算
  3. 如果缺少数字 2 --> 假定数字“0”用于 + & - 计算,“1”用于 * & / 计算

编辑:场景 3 应该只考虑传入的 2 个参数(1 个数字和 1 个运算符)。我知道这不是调用函数的正确方法,但它是我尝试解决的任务的一部分.

这是我尝试过的

function calc (number1, number2, operator) {
    if (operator == undefined) {
        return "wrong data provided"
    } else {
        if (operator == "+") {
            return number1+number2
        } else if (operator == "-") {
            return number1-number2
        } else if (operator == "*") {
            return number1*number2
        } else if (operator == "/") {
            return number1/number2
        }
    } 

    if (number2 == undefined) {
        if (operator == "+") {
                number2=0;
            return number1+number2
        } else if (operator == "-") {
                number2=0;
            return number1-number2
        } else if (operator == "*") {
            number2=1;
            return number1*number2
        } else if (operator == "/") {
            number2=1;
            return number1/number2
        }
    }  else {
        if (operator == "+") {
            return number1+number2
        } else if (operator == "-") {
            return number1-number2
        } else if (operator == "*") {
            return number1*number2
        } else if (operator == "/") {
            return number1/number2
        }
    } 
}

calc(50,"+") 导致“提供了错误的数据。为什么?

【问题讨论】:

  • 参数按顺序排列,意思是calc(50,"+")number1作为50number2作为"+"operator作为undefined
  • 你的number2参数在哪里?
  • 对不起,我忘了说,它应该只考虑 1 个数字和 1 个参数被传递。
  • 除了你如何调用函数之外,你还有错误的检查顺序,如果operator不是undefined,你永远不会检查number2是否是undefined。如果operatorundefined+-*/ 字符中的任何一个,您的函数将始终从第一个if...else 语句返回。
  • 正如一般的想法,如果你假设 + 和 - 为 0,* 和 / 为 1,如果 number2 缺失,这只是一种复杂的说法“如果 number2 缺失,返回数字 1 ”。为您节省大量代码和检查。

标签: javascript function if-statement


【解决方案1】:

你可以这样做:

function calc(par1, par2, par3) {
  var number1 = par1;
  var operator;
  var number2;
  if (typeof par2 === 'string') {
    operator = par2;
  } else {
    number2 = par2;
    operator = par3;
  }
  if (typeof operator === "undefined") {
    return "wrong data provided"
  } else {
    if (operator == "+") {
      return number1 + (number2 || 0);
    } else if (operator == "-") {
      return number1 - (number2 || 0);
    } else if (operator == "*") {
      return number1 * (typeof number2 === 'undefined' ? 1 : 0);
    } else if (operator == "/") {
      return number1 / (typeof number2 === 'undefined' ? 1 : 0);
    }
  }
}

console.log(calc(50, '+'));
console.log(calc(50, '*'));
console.log(calc(50, 20, '+'));
console.log(calc(50, undefined, '*'));
console.log(calc(50, 10));

在这里,当number2undefined 或 当number2undefined 时,0(typeof number2 === 'undefined' ? 1 : 0) 使用number21 进行*/ 操作的计算。

【讨论】:

  • 对不起,我恐怕还没有 let 和 const :/ 其余的我明白
  • @user2132380 您可以用var 替换这两个。 constlet 只是在较新版本的 JavaScript 中声明变量的一些不同方式。
  • 所以我基本上说, - 数字 1 将始终是 par1 - 有一个 number2 变量 - 有一个运算符变量 - 如果第二个参数是字符串,那么运算符就是第二个参数 - 在所有其他case 坚持默认(即第二个参数是数字 2,第三个参数是操作符) 稍后,这些表达式 (number2 || 0);将使脚本在 number2(如果已定义)和 0(如果只有两个参数)之间进行选择,对吗?
  • 是的,这基本上是正确的。那里有一个错误,我将编辑答案以修复。如果number20 并且operator*/,则number2 将设置为1
  • 好的,你用这个语法迷失了我。我知道你想避免除法(特别是)和乘法与 0 但语法是什么意思?
【解决方案2】:

更好的代码:

function calculate(number1,number2,operator){
if (!number1 || !number2){
    return "Invalid number"
}
if (!['*','-','/','+'].includes(operator)){
    return "Invalid operator"
}
switch(operator){
  case "+":
    return number1 + number2;
  case "/":
    return number1 * number2;
  case "*":
    return number1 * number2;
  case "-":
    return number1 - number2;
 }
}
console.log(calculate(5,6,"+"))

【讨论】:

  • OP 提到number2 可以是undefined,在这些情况下,它应该根据operator 的值设置为01
【解决方案3】:
calc(50,"+")

这里你只传递了 2 个参数。所以第三个参数是未定义的

calc(50,,"+")

改为传递 3 个参数

【讨论】:

  • 你为什么不再传一个参数来检查它是用3参数还是2参数检查?
【解决方案4】:

您将错误的数据传递给函数。 在javascript中,您需要传递所有参数。

calc(50, "+")

你会得到一个未定义的第三个参数,并且一直都是“提供的数据错误” 试试这个

calc(50, 0, "+")

【讨论】:

  • 使用 EDIT 更新
【解决方案5】:

如前所述,您必须使用正确的参数进行调用。 calc(50,0,"+")。但是,您可以进行 hack - 在许多库中很常见。

function calc (number1, number2, operator) {
    operator = operator || number2;
    number2 = (number2 === operator) ? undefined : number2;

    // Rest keep the same
    if (operator == undefined) {
        return "wrong data provided"
    }

第一步 - operator = operator || number2; - 是将 operator 设置为 operator,但如果它是假的(假、未定义、0 等...),它将分配编号 2。

第二步 - number2 = (number2 === operator) ? undefined : number2; 如果 number2 和 operator 严格相等,则将 number2 设置为 undefined。 如果它们不相同,则分配原始值,即 number2。

现在您可以拨打calc(50,"+"),它的作用与calc(50,0,"+")相同

编辑:请注意,这现在不起作用,因为第一个 if 将是假的,所以它会立即尝试做数学......所以你至少必须改变它这样:

if (operator == undefined) {
    return "wrong data provided"
} else if (number2 != undefined) {
  ...

【讨论】:

  • 从 OP 的描述看来 number2 可以是 undefinedoperator 不是。
  • 嗯......不要得到你的编辑。你是否认为 IF 语句的顺序有误?
  • @user2132380 是的。首先 if 不应该有 else 部分。因为它与最后一个ifelse 部分相同。如果你跳过它,它会起作用。但是有更好的解决方案,更短更清晰。
【解决方案6】:

你可以定义你的变量有跟随

  • number1 将来自参数
  • number2 将作为参数,除非存在运算符而不是数字。如果有运算符,则为 0 或 1,取决于运算符
  • 操作员将从参数或 number2 中获取他的值

const operators = ["+", "-", "*", "/"];

function calc(number1, n2, op) {

// the part i add
  let number2;
  let operator = op;
  if (operators.includes(n2)) {
      if (n2 == "+" || n2 == "-") {
        number2 = 0;
      } else {
        number2 = 1;
      }
      operator = n2;
    } else {
      number2 = n2;
    }

    if (operator == undefined) {
      return "wrong data provided"
    } else {
      if (operator == "+") {
        return number1 + number2
      } else if (operator == "-") {
        return number1 - number2
      } else if (operator == "*") {
        return number1 * number2
      } else if (operator == "/") {
        return number1 / number2
      }
    }

    if (number2 == undefined) {
      if (operator == "+") {
        number2 = 0;
        return number1 + number2
      } else if (operator == "-") {
        number2 = 0;
        return number1 - number2
      } else if (operator == "*") {
        number2 = 1;
        return number1 * number2
      } else if (operator == "/") {
        number2 = 1;
        return number1 / number2
      }
    } else {
      if (operator == "+") {
        return number1 + number2
      } else if (operator == "-") {
        return number1 - number2
      } else if (operator == "*") {
        return number1 * number2
      } else if (operator == "/") {
        return number1 / number2
      }
    }
  }

  console.log(calc(50, "+"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 2018-05-11
    • 2017-10-16
    • 2017-09-19
    • 2020-09-03
    • 1970-01-01
    • 2021-03-23
    • 2016-03-22
    相关资源
    最近更新 更多