2018-11-17

计算器:尝试用数组写一个计算器,利用中缀转后缀计算,我是先将输入的算式保存在一个数组中,当按等号时遍历这个数组开始计算(中缀转后缀的过程就是一个计算过程)。

中缀转后缀

问题是在小数的输入,我输入小数是这样的:当你输入小数点时,一个指数计数器exponment开始运行,每当在小数点后输入数字时减一,并且输入的数字乘10的exponment次方。问题来了,因为小数是运算输入的所以会在后面出现很多零。我想消除,但发现用运算输入的方法不可避免的出现这种情况,因为它是转化成二进制计算的。


<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<link rel="stylesheet" href="../css/calulator.css">

</head>

<body>

<div id="calulator">

<div id="display"></div>

          <ul>

        <div index="CE" id="AtPresent">CE</div>

        <div index="c" id="resert">c</div>

        <div id="backspace"><-</div>

        <li index="/">÷</li>

        <li index="7">7</li>

        <li index="8">8</li>

        <li index="9">9</li>

        <li index="*">X</li>

        <li index="4">4</li>

        <li index="5">5</li>

        <li index="6">6</li>

        <li index="-">-</li>

        <li index="1">1</li>

        <li index="2">2</li>

        <li index="3">3</li>

        <li index="+">+</li>

        <div index="±" id="opponumber">±</div>

        <li index="0">0</li>

        <div index="." id="decimal">.</div>

        <div index="=" id="equalSign">=</div>

          </ul>     

</div>

</body>

</html>

<script type="text/javascript" src="../js/calulator.js"></script>


#calulator{

width: 300px;

height: 500px;

position: relative;

left: 50%;

border: 1px solid red;

background-color: rgba(183,190,190,0.5);

}

#display{

text-align: right;

width: 300px;

height: 150px;

/*border: 1px solid blue;*/

position: absolute;

}

ul div{

display: inline;

line-height: 65px;

margin-top:1px;

    margin-bottom: 1px;

    list-style: none;

width: 72px;

height: 65px;

text-align: center;

background-color: #A7A7A7;

margin-right: 1px;

float: left;

}

ul{

width: 300px;

height: 300px;

position: absolute;

margin:0px 0px 0px 0px;

padding: 0px 0px 0px 0px;

left:1.5%;

top: 32.5%;

}

li{

line-height: 65px;

margin-top:1px;

    margin-bottom: 1px;

    list-style: none;

width: 72px;

height: 65px;

text-align: center;

background-color: #A7A7A7;

margin-right: 1px;

float: left;

}

window.onload=function () {

      var outinput=new Array();                                      //显示数组

      var ops=new Array("#");                                        //运算符数组

      var result=new Array();                                      //运算算数组

      var count=0;                                                //计数outinput

      var dot=false;                                              //小数点,false:没有 true:有了

        var keys=document.getElementsByTagName('li');              //显示键

        var display=document.getElementById('display');          //显示屏

        var ce=document.getElementById('AtPresent');            //清零当前屏幕

        var resert=document.getElementById('resert');          //清除所有

        var opponumber=document.getElementById('opponumber');  //相反数

        var decimal=document.getElementById('decimal');      //小数点

        var equalSign=document.getElementById('equalSign');  //等号

        var backspace=document.getElementById('backspace'); //退格

        var exponment=0;


        function init() {                    //初始函数

        outinput.length=0;

        ops.length=0;

        result.length=0;

        count=0;

        dot=false;

        display.innerHTML=" ";

        }

      for (var i = 0; i < keys.length; i++) {    //创建点击事件

      keys[i].onclick=function(){


          if (Math.abs(parseInt(this.getAttribute("index")))>=0) {

          if(outinput.length==1&&Math.abs(result[0])>=0){

          outinput.splice(0,outinput.length);

          }

          if (outinput[count-1]>=0&&count>0) {

          if (dot==false){

          outinput[count-1]=outinput[count-1]*10+parseInt(this.getAttribute("index"));

              }

              else if(dot==true){

                    exponment--;

                    console.log("指数"+exponment);

                    outinput[count-1]=outinput[count-1]+parseInt(this.getAttribute("index"))*Math.pow(10,exponment);

              }

          }

          else{

          exponment=0;

          outinput[count]=parseInt(this.getAttribute("index"));

          count++;

              }

          }

          else

          {

          outinput[count]=this.getAttribute("index");

          count++;

          }

            display.innerHTML=" ";

            for(x in outinput){

              display.append(outinput[x]);

            }

      }

      }

      function turn(temp){  //优先级判断

      switch(temp){

      case "#": return 0;break;

      case "+": return 2;break;

      case "-": return 2;break;

      case "*": return 3;break;

      case "/": return 3;break;

      case "=": return 1;break;

      }

      }

      function compute(){  //计算函数

        var num=0;

        var mun=0;

            for (var i = 0; i < outinput.length; i++) {

            if(Math.abs(outinput[i])>=0){

            result[num]=outinput[i];

            num++;

            }

            else{

                    while(turn(outinput[i])<=turn(ops[mun])){

                          switch (ops[mun]){

                          case "-":result[num-2]=subtraction(result[num-2],result[num-1]);break;

                          case "+":result[num-2]=addition(result[num-2],result[num-1]);break;

                          case "*":result[num-2]=multip(result[num-2],result[num-1]);break;

                          case "/":result[num-2]=division(result[num-2],result[num-1]);break;

                          }

                        num=num-1;

                        mun--;

                    }

                    mun++;

                    ops[mun]=outinput[i];

            }

            }

            ops.splice(1,1);

            outinput.splice(0,outinput.length);     

      }

      function addition(r1,r2){

      var s1=0; var s2=0;var m;

      if (r1.toString().indexOf(".")!=-1) {

        s1=r1.toString().split(".")[1].length;

        }

        if (r2.toString().indexOf(".")!=-1) {

        s2=r2.toString().split(".")[1].length;

        }

      m=Math.pow(10,Math.max(s1,s2));

        return (r1*m+r2*m)/m;

      }

      function subtraction(r1,r2) {

      var s1=0; var s2=0;var m;

        if (r1.toString().indexOf(".")!=-1) {

        s1=r1.toString().split(".")[1].length;

        }

        if (r2.toString().indexOf(".")!=-1) {

        s2=r2.toString().split(".")[1].length;

        }


      m=Math.pow(10,Math.max(s1,s2));

      if (m!=0) {return (r1*m-r2*m)/m;}

        else{return (r1-r2);}

      // body...

      }

      function multip(r1,r2){

      var s1=0;var s2=0;var m;

      if (r1.toString().indexOf(".")!=-1) {

        s1=r1.toString().split(".")[1].length;

        }

        if (r2.toString().indexOf(".")!=-1) {

        s2=r2.toString().split(".")[1].length;

        }

        m=Math.pow(10,s1+s2);

        r1=r1*m;

        r2=r2*m;

        if (m!=0) {return(r1*r2)/m;}

        else{return(r1*r2);}

      }

      function division(r1,r2){

        var s1=0;var s2=0;var m;

      if (r1.toString().indexOf(".")!=-1) {

        s1=r1.toString().split(".")[1].length;

        }

        if(r2.toString().indexOf(".")!=-1) {

        s2=r2.toString().split(".")[1].length;

        }

      if(m!=0){

      m=Math.pow(10,s2-s1);

      r1=r1*m;

      r2=r2*m;

      return(r1/r2)/m;

      }

      else{

      return(r1/r2);

      }

      }

      function answer() {        //答案显示函数

      display.innerHTML=" ";

      display.append(result[0]);


      }

    equalSign.onclick=function () { //等号

    outinput[outinput.length]="=";

    compute();

    answer();

    outinput.splice(0,outinput.length);

        outinput[0]=result[0];

    }

    resert.onclick=function () { //计算器重新开始

        init();

    // body...

    }

    ce.onclick=function(){      //使当前的number为0

    if (Math.abs(outinput[outinput.length-1])>=0) {

    outinput[outinput.length-1]=0;

    }

    display.innerHTML=" ";

            for(x in outinput){

              display.append(outinput[x]);

            }

    }

    backspace.onclick=function(){ //纠正错误的输入

    outinput.splice(--count,1);

    display.innerHTML=" ";

            for(x in outinput){

              display.append(outinput[x]);

            }

    }

    decimal.onclick=function(){

    dot=true;

    display.append(".");

    }

}

// 正则表达式查找小数点有问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容