计算器:尝试用数组写一个计算器,利用中缀转后缀计算,我是先将输入的算式保存在一个数组中,当按等号时遍历这个数组开始计算(中缀转后缀的过程就是一个计算过程)。
问题是在小数的输入,我输入小数是这样的:当你输入小数点时,一个指数计数器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(".");
}
}
// 正则表达式查找小数点有问题。