怎么编写计算小程序(微信小程序实现简易计算器)
怎么编写计算小程序
微信小程序实现简易计算器微信小程序之简易计算器,供大家参考,具体内容如下
一、介绍
1.中缀表达式
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
2.后缀表达式
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例:
(1)8+4-62用后缀表达式表示为:
8 4+6 2-
(2)2*(3+5)-4+7/1用后缀表达式表示为:
3 5+2*7 1/4-+
例如后缀表达式“3 4 + 5 × 6 -”:
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
二、程序代码
1.代码
app.js配置代码如下:
// app.js App({ onLaunch() { // 展示本地存储能力 const logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) // 登录 wx.login({ success: res => { // 发送 res.code 到后台换取 openId, sessionKey, unionId } }) }, globalData: { userInfo: null }, calculator:{ express:'', //临时字符串 strList:[], //中缀表达式存储(队列先进先出) strListP:[], //后缀表达式(队列先进先出) list:[], //存放运算符的堆栈 (先进后出) calculate:[] //计算表达式堆栈(先进后出) } })
2.逻辑代码
calculator.js代码如下:
// pages/calculator/calculator.js const app = getApp() Page({ /** * 页面的初始数据 */ data: { operators: ['AC', 'DEL', '%', '/', '7', '8', '9', '×', '4', '5', '6', '+', '1', '2', '3', '-', '0', '.'], res: '=', expression: '0', }, clearAll() { this.setData({ expression: '0', result: '' }) }, click: function (event) { const val = event.target.dataset.value; if (val == 'AC') { this.clearAll(); } else if (val == 'DEL') { if (this.data.expression != '0') { const res = this.data.expression.substr(0, this.data.expression.length - 1); this.setData({ expression: res }) } } else { var len = this.data.expression.length; var s = this.data.expression.substring(len - 1, len); if ((this.checkOperator(s)) && this.checkOperator(val)) { const res = this.data.expression.substr(0, this.data.expression.length); this.setData({ expression: res }) } else { if ((this.data.expression == '0') && (val == '.')) { this.setData({ expression: this.data.expression + String(val) }) } else { this.setData({ expression: this.data.expression === '0' ? val : this.data.expression + String(val) }) } } } }, result() { app.calculator.strList.length = 0; app.calculator.strListP.length = 0; app.calculator.list.length = 0; app.calculator.calculate.length = 0; this.expressToStrList(this.data.expression); let tempList = app.calculator.strList; this.expressToStrListP(tempList); let tempP = app.calculator.strListP for (let m in tempP) { if (this.checkOperator(tempP[m])) { let op1 = app.calculator.calculate[0]; app.calculator.calculate.shift(); let op2 = app.calculator.calculate[0]; app.calculator.calculate.shift(); app.calculator.calculate.unshift(this.countDetail(op2, tempP[m], op1)); } else { app.calculator.calculate.unshift(tempP[m]) } } this.setData({ result: app.calculator.calculate[0] }); }, countDetail(num1, operator, num2) { let result = 0.0; try { if (operator == "×") { result = parseFloat(num1) * parseFloat(num2); } else if (operator == "/") { result = parseFloat(num1) / parseFloat(num2); } else if (operator == "%") { result = parseFloat(num1) % parseFloat(num2); } else if (operator == "+") { result = parseFloat(num1) + parseFloat(num2); } else { result = parseFloat(num1) - parseFloat(num2); } } catch (error) { } return result; }, expressToStrListP(tempList) {//将中缀表达式集合转变为后缀表达式集合 for (let item in tempList) { if (this.checkOperator(tempList[item])) { if (app.calculator.list.length == 0) { app.calculator.list.unshift(tempList[item]); } else { if (this.compaerOperator(app.calculator.list[0], tempList[item])) { for (let x in app.calculator.list) { app.calculator.strListP.push(app.calculator.list[x]); } app.calculator.list.length = 0; app.calculator.list.unshift(tempList[item]); } else { app.calculator.list.unshift(tempList[item]); } } } else { app.calculator.strListP.push(tempList[item]); } } if (app.calculator.list.length > 0) { for (let x in app.calculator.list) { app.calculator.strListP.push(app.calculator.list[x]); } app.calculator.list.length = 0; } }, compaerOperator(op1, op2) { if ((op1 == "%" || op1 == "×" || op1 == "/") && (op2 == "-" || op2 == "+")) { return true; } else { return false; } }, expressToStrList(expression) { //将字符串表达式变成中缀队列 let temp = ''; for (let i = 0; i < expression.length; i++) { if (i == 0 && expression[i] == "-") { temp = temp + expression[i]; } else { if (this.checkDigit(expression[i])) { temp = temp + expression[i]; } else { if (temp.length > 0) { if (expression[i] == ".") { temp = temp + expression[i]; } else { app.calculator.strList.push(parseFloat(temp)); temp = ''; app.calculator.strList.push(expression[i]); } } else { temp = temp + expression[i]; } } } } if (temp.length > 0 && this.checkDigit(temp.substring(temp.length - 1))) { app.calculator.strList.push(parseFloat(temp)); temp = ''; } }, //判断是否是运算符 checkOperator(input) { if (input == "-" || input == "+" || input == "/" || input == "%" || input == "×") { return true; } else { return false; } }, //判断是否是数字 checkDigit(input) { if ((/^[0-9]*$/.test(input))) { return true; } else { return false; } }, })
3.界面代码
calculator.js代码如下:
<!--pages/calculator/calculator.wxml--> <view class="contaniner"> <view class="displayer"> <view class="text">{{expression}}</view> <view class="result">={{result}}</view> </view> <view class="btnArea"> <block wx:for="{{operators}}"> <view class="btn" data-value="{{item}}" capture-bind:tap="click">{{item}}</view> </block> <view class="btn btn1" data-value="{{res}}" bindtap="result">{{res}}</view> </view> </view>
4.样式代码
calculator.js代码如下:
/* pages/calculator/calculator.wxss */ .container1{ width: 100%; height: 100%; } .displayer{ border: 1px solid #f1f3f3; width: 100%; height: 602![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328162054440.jpg" alt="怎么编写计算小程序(微信小程序实现简易计算器)" border="0" />
三.程序截图
四.总结
使用数组来实现堆栈,然后将表达式转为中缀表达式,再转成后缀表达式,利用堆栈实现计算。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
- 微信小程序开发如何实现自动保存(微信小程序开发实用技巧之数据传递和存储)
- 微信小程序日期选择器有星期天(微信小程序 滚动选择器时间日期详解及实例代码)
- 微信小程序图片加特效(微信小程序实现可实时改变转速的css3旋转动画实例代码)
- 微信小程序ui聊天窗口(微信小程序实现简单聊天室)
- 微信小程序存token(小程序开发实现access_token统一管理)
- 微信小程序可以用h5开发不(微信小程序webView嵌入H5的方法实例)
- 微信小程序即时聊天功能怎么实现(微信小程序实现聊天室功能)
- 微信小程序的交通码(微信小程序中实现车牌输入功能)
- 微信小程序静态页面详情(微信小程序基础教程之echart的使用)
- 微信小程序如何请求服务器数据(微信小程序学习笔记之页面配置与路由方式)
- 微信小程序双人游戏横屏(微信小程序实现拼图游戏)
- pythondjango后台管理(基于腾讯云服务器部署微信小程序后台服务Python+Django)
- 微信小程序引用模板的函数(微信小程序页面与组件之间信息传递与函数调用)
- 微信小程序canvas缩放(微信小程序之html5 canvas绘图并保存到系统相册)
- 微信小程序获取时间(微信小程序wxs日期时间处理的实现示例)
- 微信小程序接入第三方支付的方法(小程序通过小程序云实现微信支付功能实例)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
- 职场人改不掉这4个习惯,只会越混越穷,一辈子也翻不了身(职场人改不掉这4个习惯)
- 华为 联想等46家公司笔试面试题,涉及各行各业,建议收藏(联想等46家公司笔试面试题)
- ()
- ()
- 800壮士拼死拖住30万日军 八佰 的真实历史,誓与阵地共存亡(800壮士拼死拖住30万日军)
热门推荐
- 云服务器如何选择(好的云服务器需要怎么选择?)
- isPrototypeOf和hasOwnProperty的区别
- linux部署tomcat项目(阿里云服务器linux系统搭建Tomcat部署Web项目)
- python编程将一个三位数反序输出(python实现整数的二进制循环移位)
- python 导入指定文件夹的模块(Python实现的在特定目录下导入模块功能分析)
- 用js做一个计算器(使用JS实现简易计算器)
- sqlserver完全删除教程(sql server编写archive通用模板脚本实现自动分批删除数据)
- webgl api 源码(基于 HTML5 WebGL 实现的医疗物流系统)
- dedecms标签怎么用(dedecms列表页上一页下一页翻页单独调用的方法)
- docker 改变存储位置方式(修改Docker镜像默认存储位置的方法解决方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9