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

输入符号的计算逻辑:点击符号时调用函数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. 如何有效使用每一点脑力总结_如何更有效地节省脑力和编码
  2. tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
  3. 书中自有BAT Offer!
  4. SQL提取表中某列字符长度为2的所有记录
  5. 网页按钮跳转位置_RPA工具BizRobo!之运用网页数据处理
  6. 征稿 | 国际KG大会 IJCKG 2021专辑征文
  7. 【学习笔记】第三章——内存 II(分页存储、快表与局部性原理、两级页表)
  8. NodeJS知识汇总
  9. 给xen虚拟机添加硬盘分区格式化
  10. 火出B站的冠状病毒传播模拟仿真程序代码解析来啦!
  11. 实验2-4-3 求平方根序列前N项和 (C语言)
  12. Jetson nano jetpack4.5安装torch1.8.0 yolov5(遇到到报错和解决办法)
  13. 产品生命周期管理PLM系统概述——睿思成研发管理咨询(www.wiserdm.com)
  14. 大数据开发需要学习哪些编程语言
  15. Windows系统下的mklink指令
  16. 仿生象鼻机械臂的创新设计与应用研究
  17. 循环结构中break、continue、return和exit的区别
  18. 日系插画学习笔记(十二):如何增加画面完整度
  19. 【Unity国际版下载地址】
  20. Java删除表格的基本代码,Java 删除 Excel 中的空白行和列

热门文章

  1. 微型计算机原理排序实验报告,微机原理实验报告1.doc
  2. 塔式服务器冷却系统图示,塔式,刀片和机架是三种不同类型的服务器区别
  3. TensorFlow-gpu2.0.0 + Anaconda + Win10(MX250)安装教程
  4. 【Anaconda】将已有Python环境添加到Anaconda中
  5. 亚马逊广告投放指南:实现精准营销的关键步骤?
  6. STM32中断使用注意事项/使用详解
  7. J2EE 应用服务器技术
  8. Golang 整数类型最大值和最小值的定义
  9. wordpress图像大小_8个WordPress插件来创建令人敬畏的图像效果
  10. logback.xml中additivity的使用