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 相关文章推荐
JavaScript修改css样式style
Apr 15 Javascript
使用隐藏的new来创建对象
Mar 29 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
JavaScript代码复用模式详解
Nov 07 Javascript
jQuery实现简单的列表式导航菜单效果代码
Aug 31 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
Jun 13 Javascript
jquery siblings获取同辈元素用法实例分析
Jul 25 Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 Javascript
浅谈vue路径优化之resolve
Oct 13 Javascript
Vue中的scoped实现原理及穿透方法
May 15 Javascript
vue elementui form表单验证的实现
Nov 11 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP分享图片的生成方法
2018/04/25 PHP
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
jsonp原理及使用
2013/10/28 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
利用Python破解验证码实例详解
2016/12/08 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
python实现图书管理系统
2018/03/12 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python中return如何写
2020/06/18 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
Django nginx配置实现过程详解
2020/09/10 Python
员工评语大全
2014/01/19 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
市场营销策划方案
2014/06/11 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
建筑管理专业求职信
2014/07/28 职场文书
宇宙与人观后感
2015/06/05 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
pycharm代码删除恢复的方法
2021/06/26 Python