實現一個計算機

圖片:

實現代碼:?

<!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.pswp.cn/news/164075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164075.shtml
英文地址,請注明出處:http://en.pswp.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…