上一题的基础上将计算器的核心逻辑提取出来,封装一个框架无关的计算器模块,并改造你的计算器应用。

限制

  • 你不可以使用 eval() 函数来执行计算
  • 你不可以使用 new Function('...') 函数来执行计算

用例

上一题的基础上增加一些边界情况的处理:

  1. 用户可以看到显示屏显示当前输入的数字或最后一次操作的结果。
  2. 用户可以看到一个包含数字 0-9、操作符 —— '+'、'-'、'*'、'/' 和 '=' 按钮的输入板,一个 'AC' 按钮(用于清除所有)。
  3. 用户可以通过点击输入板上的数字来输入最多八位数的数字序列,任何超过8位的数字的输入都将被忽略。
  4. 用户可以点击 'AC' 按钮来清除所有的内部工作区域,并将显示值设为 0。
  5. 初始值为 0,输入操作符则以 0 为操作数,否则按收入的数字作为操作数;
  6. 最后输入等号后,将计算结果作为下一轮计算的初始值;
  7. 当前操作数为 0 时,再重复输入 0 时需要忽略,避免出现 00000123 这样的显示;
  8. 暂时不支持数字正负符号输入,所有操作符号都以最后输入为准;
    例如:现在是 3 + ,再输入减号变为 3 -
  9. 如果上一次输入的是操作符,现在输入等号支持自动去掉多余的操作符再进行计算。

脚手架

class Calculator {
  // 接收计算器输入
  press() {}

  /**
   * 计算当前输入的结果
   * @return number
   */
  compute() {}

  /**
   * 显示当前的输入值
   * 
   * @return string
   */
  display() {}
}

const calculator = new Calculator()
// 以下 press 入参只是范例,可以自行定义
calculator.press('3').press('+').press('4').press('×').press(5)
calculator.display() // 3 + 4 * 5
calculator.compute() // 23

ps:以上只是参考范例,大家可以自行封装扩展。后续会增加操作符和操作数的支持,有条件的可以考虑如何封装可扩展的插件化的计算器模块,另外有兴趣的可以尝试使用 TS 来编写。

https://codepen.io/zhbhun/pen...


zhbhun
1k 声望5 粉丝