JS实现多功能计算器


Posted in Javascript onOctober 28, 2020

本文实例为大家分享了JS实现多功能计算器的具体代码,供大家参考,具体内容如下

1、开发语言 HTML+CSS+JavaScript

2、开发工具 Visual Studio Code

3、项目GitHub地址:计算器 (喜欢可以给一个star)

4、项目运行截图:

JS实现多功能计算器

5、技术分析:由于除了简单的四则运算,还需要进行括号匹配,以及优先级的运算。采用后缀表达式的形式进行处理,同时通过模拟栈的特点运用JS自带的数组进行处理。由于代码有详细的注释,所以直接上代码。

6、项目代码:

compute.html:

<!--
 * @Author: CSU_XZY
 * @Date: 2020-10-15 21:17:33
 * @LastEditors: CSU_XZY
 * @LastEditTime: 2020-10-16 22:07:08
 * @FilePath: \第二天\计算器\compute.html
 * @Description: just to play
-->
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>计算器</title>
</head>
<style>
 *{
  margin: 0;
  padding: 0;
 }
 body{
  background-color: #FCFDFE;
 }
 .container{
  overflow: hidden;
  box-shadow: 0 0 3px 0 rgba(0, 0, 0, .3);
  margin: 150px auto;
  width: 548px;
  height: 274px;
  background-color: #fff;
 }
 .box{
  background-color: #fcfdff;
  margin: 15px auto;
  overflow: hidden;
  width: 514px;
  height: 244px;
 }
 .number{
  width: 514px;
  height: 189px;
 }
 .text{
  width: 514px;
  height: 55px;
  margin: 0;
 }
 span{
  border-top: solid 1px #ebebeb;
  border-right: solid 1px #ebebeb;
  box-sizing: border-box;
  float: left;
  display: block;
  width: 25%;
  font-size: 16px;
  color: #333;
  background-color: #fff;
  line-height: 37px;
  cursor: pointer;
  text-align: center;
  font-weight: 10px;
 }
 span:hover{
  background-color: #d3d7d4;
 }
 span:active{
  background-color: #afdfe4;
  
 }
 
 .text>p{
  text-align: right;
  width: 514px;
  height: 24px;
  line-height: 25px;
  font-size: 25px;
 }
 .number>div{
  width: 514px;
  height: 37.8px;
 }
 .around{
  background-color: #f9f9f9;
  color: #f60;
 }
 .compute{
  color: #333;
 }
 .bottom{
  background-color: #fff;
  color: #f60;
 }
 .dot{
  font-size: 23px; 
  font-weight: 19px;
 }
</style>
<body>
 <div class="container">
  <div class="box">
   <div class="text">
    <p id="text"></p>
    <p id="display"></p>
   </div>
   <div class="number">
    <div class="around">
     <span onclick="showDetails(this)" data-value="(" class="around">(</span>
     <span onclick="showDetails(this)" data-value=")" class="around">)</span>
     <span onclick="showDetails(this)" data-value="D" title="回退一位数" class="around">del</span>
     <span onclick="showDetails(this)" data-value="C" class="around compute">C</span>
    </div>
    <div>
     <span onclick="showDetails(this)" data-value="7">7</span>
     <span onclick="showDetails(this)" data-value="8">8</span>
     <span onclick="showDetails(this)" data-value="9">9</span>
     <span onclick="showDetails(this)" data-value="÷" class="around">÷</span>
    </div>
    <div>
     <span onclick="showDetails(this)" data-value="4">4</span>
     <span onclick="showDetails(this)" data-value="5">5</span>
     <span onclick="showDetails(this)" data-value="6">6</span>
     <span onclick="showDetails(this)" data-value="x" class="around">x</span>
    </div>
    <div>
     <span onclick="showDetails(this)" data-value="1">1</span>
     <span onclick="showDetails(this)" data-value="2">2</span>
     <span onclick="showDetails(this)" data-value="3">3</span>
     <span onclick="showDetails(this)" data-value="-" class="around">-</span>
    </div>
    <div>
     <span onclick="showDetails(this)" data-value="0">0</span>
     <span onclick="showDetails(this)" data-value="." class="around bottom dot">.</span>
     <span onclick="showDetails(this)" data-value="=" class="around bottom">=</span>
     <span onclick="showDetails(this)" data-value="+" class="around">+</span>
    </div>
   </div>
  </div>
 </div>
</body>
<script type="text/javascript" src="compute.js"></script>
</html>

compute.js:

/*
 * @Author: CSU_XZY
 * @Date: 2020-10-15 21:17:45
 * @LastEditors: CSU_XZY
 * @LastEditTime: 2020-10-17 00:04:41
 * @FilePath: \第二天\计算器\compute.js
 * @Description: just to play
 */
var ysf = ['+','÷','=',')','%','x','-','D'];
var sizeyunsuan = ['+','÷','(','x','-'];
var isNumber = ['1','2','3','4','5','6','7','8','9','0','.'];


function showDetails(number)
{
 var number = number.getAttribute("data-value");
 var text = document.getElementById('display').innerText;
//回退一个文字
 if(number === 'D')
 {
  text = text.substring(0,text.length-1);
  document.getElementById('display').innerHTML=text;
  return;
 }
//判断第一个数字是不是运算符
 else if(judgeBegin(number) && text == "")
 return;
//判断是否是连续两个运算符一起输入
 else if(judgeBegin(number) && judgeNext(text,number) && text[text.length-1] !== ')')
 return;
//判断第一个输入是不是‘.',如果是变为0.
 else if(number === '.' && text == "")
 number = "0.";
//如果输入归0,清空输入
 else if(number === 'C')
 {
  document.getElementById('text').innerHTML="";
  document.getElementById('display').innerHTML="";
  return;
 }
//输入是等号就判断
 else if(number === '=')
 {
  //将数字与运算符分开
  let array = [];
  let n = text.length;
  for(let i = 0; i < n; i++)
  {
   var JudgeNumber = true;
   let res = "";
   //判断第一个数字是否是负号
   if(i===0 && text[i] === '-')
   {
    res+=text[i];
    i++;
   }
   //判断是不是在运算符之后的减号,是就变为负号
   if(i !== 0 && near(array[array.length-1]) && text[i] === '-')
   {
    res+=text[i];
    i++;
   }
   //判断是否为连续的数字
   while(JudgeIsNumber(text[i]) && i < n)
   {
    res += text[i];
    i++;
    JudgeNumber = false;
   }
   //如果不为数字了要回退一个
   if(JudgeNumber === false)
   i--;
   //判断其他运算符
   if(JudgeNumber === true)
   if(judgeBegin(text[i]) || text[i] === '(' || text[i] === '-' || text[i] === ')')
   res+=text[i];
   array.push(res);
  }
  //
   console.log(array);
  //中缀表达式变为后缀表达式
  var hz = houZhui(array);
  console.log(hz);
  var result = compute(hz);
  document.getElementById('text').innerHTML = text;
  document.getElementById('display').innerHTML = result;
  return;
 }
 text+=number;
 document.getElementById('display').innerHTML=text;
}

//判断是不是运算符
function judgeBegin(number)
{
 for(let i = 0; i < ysf.length; i++)
 {
  if(ysf[i] === '-')
  continue;
  if(ysf[i] === number)
  return true;
 }
 return false;
}

//判断是否输入两个连续的运算符
function judgeNext(text,number)
{
 if(number === '-')
 return;
 let a = text.length;
 if(judgeBegin(text[a-1]) && judgeBegin(number))
 return true;
 return false;
}

//判断输入的字符里面是不是数字
function JudgeIsNumber(number){
 for(let i = 0; i < isNumber.length; i++)
 {
  if(isNumber[i] === number)
  return true;
 }
 return false;
}

//判断减号前面是否有别的运算符从而确定是不是负号
function near(number)
{
 for(let i = 0; i < sizeyunsuan.length; i++)
 {
  if(sizeyunsuan[i] === number)
  return true;
 }
 return false;
}

//中缀表达式改为后缀表达式
function houZhui(array)
{
 var stack = [];
 var textArea = [];
 for(let i = 0; i < array.length; i++)
 {
  if(near(array[i]) || array[i] === ')')
  {
   //如果是空直接入栈
   if(stack.length === 0)
   stack.push(array[i]);
   //如果栈顶为左括号直接入栈
   else if(stack[stack.length-1] === '(' && array[i] !== ')')
   stack.push(array[i]);
   //如果输入左括号直接入栈
   else if(array[i] === '(')
   stack.push(array[i]);
   //如果输入的是右括号
   else if(array[i] === ')')
   {
    //一直弹出直到遇到左括号
    while(stack[stack.length-1] !== '(')
    {
     let a = stack.pop();
     textArea.push(a);
    }
    //弹出左括号
    stack.pop();
   }
   else if(array[i] === '-' || array[i] === '+')
   {
    while(stack[stack.length-1] !== '(' && stack.length !== 0)
    {
     let a = stack.pop();
     textArea.push(a);
    }
    stack.push(array[i]);
   }
   else if(array[i] === 'x' || array[i] === '÷')
   {
    while(stack[stack.length-1] !== '(' && stack[stack.length-1] !== '+' && stack[stack.length-1] !== '-' && stack.length !== 0)
    {
     let a = stack.pop();
     textArea.push(a);
    }
    stack.push(array[i]);
   }
  }
  else{
   textArea.push(array[i])
  }
 }
 while(stack.length !== 0)
 {
  let a = stack.pop();
  textArea.push(a);
 }
 return textArea;
}

//计算后缀表达式
function compute(array){
 var NUMBER = [];
 for(let i = 0; i < array.length; i++)
 {
  //是运算符就计算
  if(near(array[i])){
   //加法
   if(array[i] === '+')
   {
    if(NUMBER.length < 2)
    return "错误";
    else
    {
     let a = NUMBER.pop();
     let b = NUMBER.pop();
     let c = a + b;
     NUMBER.push(c);
    }
   }
   //减法
   else if(array[i] === '-')
   {
    if(NUMBER.length < 2)
    return "错误";
    else
    {
     let a = NUMBER.pop();
     let b = NUMBER.pop();
     let c = b - a;
     NUMBER.push(c);
    }
   }
   //乘法
   else if(array[i] === 'x')
   {
    if(NUMBER.length < 2)
    return "错误";
    else
    {
     let a = NUMBER.pop();
     let b = NUMBER.pop();
     let c = a * b;
     NUMBER.push(c);
    }
   }
   //除法
   else if(array[i] === '÷')
   {
    if(NUMBER.length < 2)
    return "错误";
    else
    {
     let a = NUMBER.pop();
     let b = NUMBER.pop();
     if(a === 0)
     return "0不能作为除数";
     let c = b / a;
     NUMBER.push(c);
    }
   }
  }
  else{
   if(array[i][0] === '-')
   {
    let temp = array[i].substring(1,array[0].length);
    let num = parseFloat(temp);
    num = -num;
    NUMBER.push(num);
   }
   else{
    let num = parseFloat(array[i]);
    NUMBER.push(num);
   }
   console.log(NUMBER);
  }
 }
 if(NUMBER.length !== 1)
 return "错误";
 else
 {
  let b = String(NUMBER[0]);
  return b;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
9个javascript语法高亮插件 推荐
Jul 18 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 Javascript
javascript jscroll模拟html元素滚动条
Dec 18 Javascript
JavaScript中原型和原型链详解
Feb 11 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
详解 javascript中offsetleft属性的用法
Nov 11 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
Dec 25 Javascript
jQuery+ajax实现文章点赞功能的方法
Dec 31 Javascript
jQuery给指定的table动态添加删除行的操作方法
Oct 12 Javascript
footer定位页面底部(代码分享)
Mar 07 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
Ionic3 UI组件之autocomplete详解
Jun 08 Javascript
JS实现简单贪吃蛇小游戏
Oct 28 #Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 #Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 #Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 #Javascript
antd vue table跨行合并单元格,并且自定义内容实例
Oct 28 #Javascript
js 实现碰撞检测的示例
Oct 28 #Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 #Javascript
You might like
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
php验证是否是md5编码的简单代码
2014/04/01 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python实现多人聊天室
2020/03/31 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
python属于跨平台语言码
2020/06/09 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
python自动化发送邮件实例讲解
2021/01/04 Python
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
求职简历中的自我评价分享
2013/12/08 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
经典导游欢迎词
2015/01/26 职场文书
草房子读书笔记
2015/06/29 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang