实现一个计算机

图片:

实现代码: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>body {padding: 20px;font-family: Arial;}.calc-wrap {width: 300px;border: 1px solid #ddd;border-radius: 3px;}.calc-operation {width: 100%;border-collapse: collapse;}.calc-in-out {width: 100%;padding: 10px 20px;text-align: right;box-sizing: border-box;background-color: rgba(250, 250, 250, .9);}.calc-in-out p {overflow: hidden;margin: 5px;width: 100%;}.calc-history {margin-left: -20px;font-size: 18px;color: #bbb;border-bottom: 1px dotted #ddf;min-height: 23px;}.calc-in,.calc-out {font-size: 20px;color: #888;line-height: 39px;min-height: 39px;}.calc-in {color: #888;}.calc-out {color: #ccc;}.calc-in.active,.calc-out.active {font-size: 34px;color: #666;}.calc-operation td {padding: 10px;width: 25%;text-align: center;border: 1px solid #ddd;font-size: 26px;color: #888;cursor: pointer;}.calc-operation td:active {background-color: #ddd;}.calc-operation .cls {color: #ee8956;}</style><script src="../plug/jquery-3.2.0.min.js"></script>
</head>
<body>
<h5>计算计算</h5>
<!-- 计算器 -->
<div class="calc-wrap"><div class="calc-in-out"><!-- 上一条运算记录 --><p class="calc-history" title=""></p><!-- 输入的数据 --><p class="calc-in"></p><!-- 输出的运算结果 --><p class="calc-out active"></p></div><table class="calc-operation"><thead></thead><tbody><tr><td data-ac="cls" class="cls">C</td><td data-ac="del">&larr;</td><td data-ac="sq">x<sup>2</sup></td><td data-ac="mul">&times;</td></tr><tr><td data-val="7">7</td><td data-val="8">8</td><td data-val="9">9</td><td data-ac="div">&divide;</td></tr><tr><td data-val="4">4</td><td data-val="5">5</td><td data-val="6">6</td><td data-ac="plus">+</td></tr><tr><td data-val="1">1</td><td data-val="2">2</td><td data-val="3">3</td><td data-ac="minus">-</td></tr><td data-ac="per">%</td><td data-val="0">0</td><td data-ac="dot">.</td><td data-ac="eq" class="eq">=</td></tbody></table>
</div>
</body>
<script>$(function() {function Calculator($dom) {this.$dom = $($dom);// 历史运算this.$history = this.$dom.find('.calc-history');// 输入区this.$in = this.$dom.find('.calc-in');// 输出区this.$out = this.$dom.find('.calc-out');this.$operation = this.$dom.find('.calc-operation');// 运算符映射this.op = {'plus': '+','minus': '-','mul': '*','div': '/'};this.opArr = ['+', '-', '*', '/'];// 中缀表达式this.infix = [];// 后缀表达式this.suffix = [];// 后缀表达式运算结果集this.result = [];// 存储最近的值this.lastVal = 0;// 当前已经计算等于完成this.calcDone = false;// 当前正在进行小数点点(.)相关值的修正this.curDot = false;this.init();}Calculator.prototype = {constructor: Calculator,// 初始化init: function() {this.bindEvent();},// 绑定事件bindEvent: function() {var that = this;that.$operation.on('click', function(e) {e = e || window.event;var elem = e.target || e.srcElement,val,action;if (elem.tagName === 'TD') {val = elem.getAttribute('data-val') || elem.getAttribute('data-ac');// 数字:0-9if (!isNaN(parseInt(val, 10))) {// 构建中缀表达式并显示var infixRe = that.buildInfix(parseInt(val, 10), 'add');that.$in.text(infixRe.join('')).addClass('active');that.calculate();return;}action = val;// 操作:清除、删除、计算等于if (['cls', 'del', 'eq'].indexOf(action) !== -1) {if (!that.infix.length) {return;}// 清空数据if (action === 'cls' || (action === 'del' && that.calcDone)) {that.$in.text('');that.$out.text('');that.resetData();}// 清除else if (action === 'del') {// 重新构建中缀表达式var infixRe = that.buildInfix(that.op[action], 'del');that.$in.text(infixRe.join('')).addClass('active');that.calculate();}// 等于else if (action === 'eq') {that.calculate('eq');}}// 预运算:百分比、小数点、平方else if (['per', 'dot', 'sq'].indexOf(action) !== -1) {if (!that.infix.length || that.isOp(that.lastVal)) {return;}if (action === 'per') {that.lastVal /= 100;} else if (action === 'sq') {that.lastVal *= that.lastVal;} else if (action === 'dot') {// that.curDot = true;}// 重新构建中缀表达式var infixRe = that.buildInfix(that.lastVal, 'change');that.$in.text(infixRe.join('')).addClass('active');that.calculate();}// 运算符:+ - * /else if (that.isOp(that.op[action])) {if (!that.infix.length && (that.op[action] === '*' || that.op[action] === '/')) {return;}var infixRe = that.buildInfix(that.op[action], 'add');that.$in.text(infixRe.join('')).addClass('active');}}});},resetData: function() {this.infix = [];this.suffix = [];this.result = [];this.lastVal = 0;this.curDot = false;},// 构建中缀表达式buildInfix: function(val, type) {// 直接的点击等于运算之后,if (this.calcDone) {this.calcDone = false;// 再点击数字,则进行新的运算if (!this.isOp(val)) {this.resetData();}// 再点击运算符,则使用当前的结果值继续进行运算else {var re = this.result[0];this.resetData();this.infix.push(re);}}var newVal;// 删除操作if (type === 'del') {newVal = this.infix.pop();// 删除末尾一位数newVal = Math.floor(newVal / 10);if (newVal) {this.infix.push(newVal);}this.lastVal = this.infix[this.infix.length - 1];return this.infix;}// 添加操作,首先得判断运算符是否重复else if (type === 'add') {// 两个连续的运算符if (this.isOp(val) && this.isOp(this.lastVal)) {return this.infix;}// 两个连续的数字else if (!this.isOp(val) && !this.isOp(this.lastVal)) {newVal = this.lastVal * 10 + val;this.infix.pop();this.infix.push(this.lastVal = newVal);return this.infix;}// 首个数字正负数if (!this.isOp(val) && this.infix.length === 1 && (this.lastVal === '+' || this.lastVal === '-')) {newVal = this.lastVal === '+' ? val : 0 - val;this.infix.pop();this.infix.push(this.lastVal = newVal);return this.infix;}// TODO: 小数点运算//     if (this.isOp(val)) {//         this.curDot = false;//     }//     // 小数点//     if (this.curDot) {//         var dotLen = 0;//         newVal = this.infix.pop();//         dotLen = newVal.toString().split('.');//         dotLen = dotLen[1] ? dotLen[1].length : 0;//         newVal +=  val / Math.pow(10, dotLen + 1);//         // 修正小数点运算精确值//         newVal = parseFloat(newVal.toFixed(dotLen + 1));//         this.infix.push(this.lastVal = newVal);//         return this.infix;//     }this.infix.push(this.lastVal = val);return this.infix;}// 更改操作,比如%的预运算else if (type === 'change') {this.infix.pop();this.infix.push(this.lastVal = val);return this.infix;}},// 判断是否为运算符isOp: function(op) {return op && this.opArr.indexOf(op) !== -1;},// 判断运算符优先级priorHigher: function(a, b) {return (a === '+' || a === '-') && (b === '*' || b === '/');},// 进行运算符的运算opCalc: function(b, op, a) {return op === '+'? a + b: op === '-'? a - b: op === '*'? a * b: op === '/'? a / b: 0;},// 即时得进行运算calculate: function(type) {this.infix2Suffix();var suffixRe = this.calcSuffix();if (suffixRe) {this.$out.text('=' + suffixRe).attr('title', suffixRe).removeClass('active');// 如果是直接显示地进行等于运算if (type === 'eq') {this.$in.removeClass('active');this.$out.addClass('active');// 设置标记:当前已经显示地进行计算this.calcDone = true;this.lastVal = suffixRe;// 设置历史记录var history = this.infix.join('') + ' = ' + suffixRe;this.$history.text(history).attr('title', history);}}},// 中缀表达式转后缀infix2Suffix: function() {var temp = [];this.suffix = [];for (var i = 0; i < this.infix.length; i++) {// 数值,直接压入if (!this.isOp(this.infix[i])) {this.suffix.push(this.infix[i]);}else {if (!temp.length) {temp.push(this.infix[i]);}else {var opTop = temp[temp.length - 1];// 循环判断运算符优先级,将运算符较高的压入后缀表达式if (!this.priorHigher(opTop, this.infix[i])) {while (temp.length && !this.priorHigher(opTop, this.infix[i])) {this.suffix.push(temp.pop());opTop = temp[temp.length - 1];}}// 将当前运算符也压入后缀表达式temp.push(this.infix[i]);}}}// 将剩余运算符号压入while (temp.length) {this.suffix.push(temp.pop());}},// 后缀表达式计算calcSuffix: function() {this.result = [];for (var i = 0; i < this.suffix.length; i++) {// 数值,直接压入结果集if (!this.isOp(this.suffix[i])) {this.result.push(this.suffix[i]);}// 运算符,从结果集中取出两项进行运算,并将运算结果置入结果集合else {this.result.push(this.opCalc(this.result.pop(), this.suffix[i], this.result.pop()));}}// 此时结果集中只有一个值,即为结果return this.result[0];}};new Calculator('.calc-wrap');});</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VL06O报表添加增强字段

业务描述 用户需要在VL06O事务代码下进行批量交货过账&#xff0c;现有的筛选条件不太适用当前公司的业务&#xff0c;需要在报表中新增三个交货单增强字段&#xff0c;方便其筛选&#xff08;选择屏幕没有加&#xff0c;用户在报表里用标准按钮功能自己筛选&#xff09; 效果…

十一 动手学深度学习v2计算机视觉 ——微调

一、网络架构 一个神经网络一般可以分成两块 特征抽取&#xff0c;将原始像素变成容易线性分割的特征。线性分类器来做分类。 二、训练 是一个目标数据集上的正常训练任务&#xff0c; 但使用更强的正则化 使用更小的学习率使用更少的数据迭代 源数据集远远复杂于目标数据集…

蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好&#xff0c;我是晴天学长&#xff0c;dp版的来啦&#xff0c;可以是受益匪浅啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱[算法赛] 问题描述 在数学王国中&#xff0c;存…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点&#xff0c;通过工频滤波、基线滤波和肌电滤波等处理&#xff0c;能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接&#xff0c;实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

企业建数仓的第一步是选择一个好用的ETL工具

当企业决定建立数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;第一步就是选择一款优秀的ETL&#xff08;Extract, Transform, Load&#xff09;工具。数据仓库是企业数据管理的核心&#xff0c;它存储、整合并管理各种数据&#xff0c;为商业决策和数据分析提供支…

PC8250(CC-CV控制)5V/8A同步降压恒流恒压软启动带EN功能只需极少外围元件

概述 PC8250是一个同步降压转换器输出电流至8A。它的设计允许操作电源电压范围从9V到42V。外部关闭功能可以通过逻辑电平来控制COMP/EN引脚下降&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线路和负载调节&#xff0c;外部设计灵活。PC8250在CC&#xff08;恒定…

【读懂AUTOSAR规范】PduR 缓存分配(Buffer allocation)

1. 前言 PDU路由器模块支持将I-PDU从一个源总线网关到一个或多个目标总线。与从/到本地模块的传输和接收不同,PDU路由器模块必须同时充当接收器和发射器,并且在某些情况下还提供I-PDU的缓冲。网关需求被有意地分离,以便在不需要网关的情况下高效实现PDU路由器模块。如果PDU…

华三无线控制器WX2540H配合准入做Portal认证

数据通信 - 建设篇 - 无线 第四章 华三无线控制器WX2540H配合准入做Portal认证 数据通信 - 建设篇 - 无线系列文章回顾华三无线控制器WX2540H配合准入做Portal认证前言其他配置优化参考来源系列文章回顾 第一章 华三无线控制器配置本地转发 第二章 华三无线控制器配置802.1X认…

Redis-Day1基础篇(初识Redis, Redis常见命令, Redis的Java客户端)

Redis-Day1基础篇 初识Redis认识NoSQL认识Redis安装Redis启动RedisRedis客户端 Redis命令数据结构介绍通用命令操作命令StringHashListSetSortedSet Redis的Java客户端客户端对比Jedis客户端Jedis快速入门Jedis连接池 SpringDataRedis客户端SpringDataRedis概述SpringDataRedis…

boardmix AI思维导图,一键自动生成思维导图!

在日常学习和工作中&#xff0c;我们常常需要记忆和整理大量的知识点和思维结构。 此时&#xff0c;思维导图的存在就大大方便了我们的工作。与传统的文本笔记不同&#xff0c;思维导图可以结合文字、图像、颜色等多种元素&#xff0c;帮助我们更好地整理和分析知识的关系&…

centos7上用docker部署redis

1. 下载redis镜像 docker pull redis docker images # 查看镜像是否下载成功2. 安装redis容器 2.1 先准备好配置文件redis.conf vi /data/redis/redis.conf写入配置信息&#xff0c;appendonly yes&#xff0c;如果需要给redis配置密码&#xff0c;可以写入requirepass root…

如何选择更快更稳定的存储服务器

如何选择更快更稳定的存储服务器 存储介质&#xff1a;存储服务器的主要存储介质包括固态硬盘&#xff08;SSD&#xff09;和机械硬盘&#xff08;HDD&#xff09;。相比于机械硬盘&#xff0c;固态硬盘具有更高的读写速度和更低的延迟&#xff0c;因此能够提供更快的数据传输…

python安装的记录

python setup.py install --user

(附程序)AD采集中的10种经典软件滤波程序优缺点分析

前言 本次我们学习一下AD采集的一些简单的软件滤波算法并分析优缺点 本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 AD采样点的电压多少有点起伏波动&#xff0c;经运放放大后电压的波动如果超过ADC的分辩率&#xff0c;则显示的值会出现波动。波动如…

RTOS的任务触发底层逻辑

&#xff08;定时器用于计时和触发事件&#xff0c;任务则由调度器进行调度和执行&#xff1a;每当时钟节拍到达时&#xff0c;系统会触发一个称为 tick 中断的事件。当 tick 中断发生时&#xff0c;操作系统会在中断服务例程中执行一定的处理&#xff0c;其中包括更新任务的运…

C++算法入门练习——相同的二叉查找树

将第一组n​个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T1​&#xff1b;再将第二组n个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T2​。判断T1​和T2​​是否是同一棵二叉查找树。 二叉查找(搜索)树定义&am…

Halcon学习笔记

目录 一.简介 一.简介 Halcon和OpenCV在工业应用中的区别&#xff1a; OpenCV的精度没Halcon高&#xff1b;OpenCV没有模板匹配&#xff0c;Halcon有&#xff0c;而且Halcon匹配的精度更高。

DALSA.SaperaLT.SapClassBasic无法加载,试图加载格式不正确的程序,c#

情景&#xff1a;用c#wpf写DALSA线扫相机的项目&#xff0c;生成时不报错&#xff0c;运行到DALSA相关的代码就报错找不到dll&#xff08;DALSA的技术支持没给到任何支持 &#xff09; 一.根据框架选择dll 如果是.net framework框架&#xff08;比如说.net480&#xff09;&am…

一份全面「梳理LLM幻觉问题」的综述

文章目录 一文全面梳理「LLM 幻觉问题」1. 幻觉的分类2. 幻觉的来源2.1 幻觉来自数据2.2 幻觉来自训练2.3 幻觉来自生成/推理 3. 幻觉的检测3.1 事实性幻觉的检测3.2 忠实性幻觉的检测 4. 幻觉的评估5. 幻觉的解决 一文全面梳理「LLM 幻觉问题」 相信大家在使用ChatGPT或者其他…

vue3源码

/*! Vue.js v2.6.14© 2014-2021 Evan YouReleased under the MIT License. */ (function (global, factory) { typeof exports ‘object’ && typeof module ! ‘undefined’ ? module.exports factory() : typeof define ‘function’ && define.am…