运算部分逻辑的文字说明:

输入符号的计算逻辑:点击符号时调用函数operation(join, newlevel),join为当前运算符,newlevel为当前运算符的参数(权重);设置一个全部变量:level,初始为零,每次输入符号将当前符号的参数push进level的末尾;设置while条件:新输入的符号参数小于等于level的最后一位(即可以进行运算,权重不会对后面算式造成影响),就用函数(正则方式)过滤当前公式。过滤函数为parse()。关于过滤计算函数parse():因为上面已经说明,要计算的是权重更高的公式(乘除权重最高为6,其次加减权重5,其次左右移位运算权重4,最后按位与3、或2、非1运算),所以过滤为:(/^(.*\d[\+\-\*\/\%\^\&\|x\<\>])?([+-]?[0-9a-f\.]+)([\+\-\*\/\%\^\&\|x\<\>])([+-]?[0-9a-f\.]+)$/)$1:前面权重低不需要计算的公式返回到stack,$2为算式第一个数,$3为算式符号,$4为算式第二个数,再将$2,$3,$4传入函数cypher(left, join, right)作为参数。cypher()函数:判断$3的符号,并进行运算,将运算结果返回,同时level的最后一位slice掉。到这里,while的第一次循环已经结束,level的最后一位已经slice掉(进行一次运算),如果还满足while条件(连续的乘除运算),则继续进行上面的循环,直到循环结束。计算过程:level初始为02+3    level:052+3+   level:055(满足while条件,计算2+3)2+3*3  level:056(不满足while条件,不计算)2+3*3* level:0566(满足while条件,计算3*3)2+3*3+ level:0565 (满足while条件,计算2+3*3)输入括号的逻辑:设置全局变量level,代表括号的层数(权重级别)每次点击括号时level++,同时截取第level个括号后(里)的值。输入扩回的逻辑:每次点击扩回,计算当前level下的括号的值,将当前value的值写入display中,同时level--(减少一层括号)。输入等号的逻辑:运算算式,如有括号未扩回,将括号中的值优先计算,算到level为0(没有括号),再将得出的等式用过滤函数计算。在operation()函数的控制下,stack的运算最多三层,还是用parse()将stack运算。

相关函数代码:

运算符:function operation(join, newlevel) {// if(document.calc.display.value==="0" && document.calc.notes.value.charAt(document.calc.notes.value.length-1)=="+"){return}endNumber = true;var temp = stack.substr(stack.lastIndexOf("(") + 1) + document.calc.display.valuewhile (newlevel != 0 && (newlevel <= (level.charAt(level.length - 1)))) {temp = parse(temp)level = level.slice(0, -1)}if (temp.match(/^(.*\d[\+\-\*\/\%\^\&\|x])?([+-]?[0-9a-f\.]+)$/))document.calc.display.value = RegExp.$2document.calc.notes.value += join;stack = stack.substr(0, stack.lastIndexOf("(") + 1) + temp + joindocument.calc.operator.value = " " + join + " "level = level + newlevel}括号:function addbracket() {endNumber = truedocument.calc.display.value = 0document.calc.notes.value += "("stack = stack + "("document.calc.operator.value = "   "level = level + 0layer += 1}括回:function disbracket() {endNumber = truevar temp = stack.substr(stack.lastIndexOf("(") + 1) + document.calc.display.valuewhile ((level.charAt(level.length - 1)) > 0) {//验证表达式格式是否正确temp = parse(temp)level = level.slice(0, -1)}document.calc.display.value = tempdocument.calc.notes.value += ")"stack = stack.substr(0, stack.lastIndexOf("("))document.calc.operator.value = "   "level = level.slice(0, -1)layer -= 1}等号(计算):function result() {endNumber = truewhile (layer > 0)disbracket()temp = stack + document.calc.display.valuewhile ((level.charAt(level.length - 1)) > 0) {temp = parse(temp)level = level.slice(0, -1)}document.calc.display.value = tempdocument.calc.operator.value = ""document.calc.notes.value = ""stack = ""level = "0"}过滤后的计算函数:function cypher(left, join, right) {left = todec(left, carry)right = todec(right, carry)if (join == "+")return (decto(parseFloat(left) + parseFloat(right), carry))if (join == "-")return (decto(left - right, carry))if (join == "*")return (decto(left * right, carry))if (join == "/" && right != 0)return (decto(left / right, carry))if (join == "%")return (decto(left % right, carry))if (join == "&")return (decto(left & right, carry))if (join == "|")return (decto(left | right, carry))if (join == "^")return (decto(Math.pow(left, right), carry))if (join == "x")return (decto(left ^ right, carry))if (join == "<")return (decto(left << right, carry))if (join == ">")return (decto(left >> right, carry))alert("除数不能为零")return (left)}

js计算器运算部分的逻辑(附代码)相关推荐

  1. js 只刷新ajax,JS实现AJAX局部刷新(附代码)

    这次给大家带来JS实现AJAX局部刷新(附代码),JS实现AJAX局部刷新的注意事项有哪些,下面就是实战案例,一起来看一下. AJAX即"Asynchronous Javascript An ...

  2. PHP JS浏览器实时获取摄像头内容(附代码)

    注意 浏览器获取摄像头权限时候比较严格,我百度时必须有ssl证书才可以(应该还有别的方法),我自己使用的https协议调用的 前端JS <!DOCTYPE html> <html&g ...

  3. js visibility和display区别(附代码实例)

    <html><head><meta charset="utf-8" /><title></title><scrip ...

  4. js接收php 回调,JS callback回调函数的使用(附代码)

    这次给大家带来JS callback回调函数的使用(附代码),JS callback回调函数使用的注意事项有哪些,下面就是实战案例,一起来看一下. 在使用开源项目的时候经常会使用到回调函数,如果把回调 ...

  5. 独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)

    作者:MOHD SANAD ZAKI RIZVI 翻译:吴金笛 校对:丁楠雅 本文约5500字,建议阅读15分钟. 本文首先介绍了TensorFlow.js的重要性及其组件,并介绍使用其在浏览器中构建 ...

  6. linux tensorflow demo_独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

    作者:MOHD SANAD ZAKI RIZVI 翻译:吴金笛 校对:丁楠雅 本文约5500字,建议阅读15分钟. 本文首先介绍了TensorFlow.js的重要性及其组件,并介绍使用其在浏览器中构建 ...

  7. html做秒表代码,利用JS实现一个可精确到10ms的秒表的制作(附代码)

    本篇文章给大家带来的内容是关于利用JS实现一个可精确到10ms的秒表的制作(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 这段时间刚接触js,想利用所学的知识自制一款简单的 ...

  8. VAE逻辑整理及VAE在异常检测中的小实验(附代码)

    VAE逻辑整理及VAE在异常检测中的小实验(附代码) Variance和control variate 两种常见的分类器 相应代码 Minst数据集的训练和重构 KDD99数据  本文主要讲解一下整个 ...

  9. ajax js图片上传到php,Ajax上传并预览图片(附代码)

    这次给大家带来Ajax上传并预览图片(附代码),Ajax上传并预览图片的注意事项有哪些,下面就是实战案例,一起来看一下. 1. 直接上最简单的 一种 ajax 异步上传图片,并预览 html: 图片上 ...

最新文章

  1. UVA1586 ​​​​​​​ Molar mass
  2. linux sed名宁,Linux shell利用sed批量更改文件名的方法
  3. 澳大利亚超市巨头考虑设专门网站 方便代购买奶粉
  4. j2ee和mysql怎么连接_Eclipse下配置j2ee开发环境及与MySQL数据库的连接
  5. 射手播放器的 clientkey
  6. 那个找不到工作的iOS程序猿
  7. 电源设计基础笔记:DC-DC与LDO电路
  8. 视觉设计需要学什么?
  9. 赵小楼《天道》《遥远的救世主》深度解析(118)女人的客观就那么难么?不难。难的是不想客观的人。
  10. 兼容iOS10资料整理
  11. 编译原理——自上而下的语法分析方法(LL分析法)
  12. 使用VNC远程连接云服务器,连接超时问题
  13. Android日期时间与时区使用总结汇总
  14. html游戏让目标人物移动,用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动...
  15. java 类一定要声明成public_关于使用public class 和 class声明类的区别
  16. 庄家一般炒作什么样的股票?
  17. JavaScript学习笔记——JS基础0
  18. IPv6的黑洞路由何去何从
  19. Spark Streaming 双流 join
  20. 3632: 外太空旅行

热门文章

  1. 树莓派+PCA9685+舵机控制:wiringPi实现
  2. 数据库触发器(TRIGGER)
  3. Android高级面试问题及答案(1)——Android Framework篇
  4. excel vba replace函数的使用方法
  5. 一个大学应届生的互联网创业心得
  6. 华为p30p会用上鸿蒙系统吗,实锤!用华为p30p拍到银河的真相在此
  7. Dell服务器win2003修复安装,dell PowerEdge 1900服务器安装win2003系统
  8. [NewLife.XCode]增删改查入门
  9. python web开发框架比较
  10. 怎么用计算机弹千本樱,现在的地球人真不正常!用计算器都能来一发千本樱!【附曲谱】...