&web_id=" language="JavaScript">
Fork me on GitHub

用JavaScript实现中缀表达式计算器【2.0】

上次跟大家说到有关JavaScript中缀计算器的有关代码,但是在优化的过程中发现了一些问题,经过老师的指导改进了一下代码,形成了更易于理解的语法规范和界面交互,就本次代码更新分享给大家。

改进一:提供更直观的计算按钮

经过老师的建议,我添加了有关的计算的按钮,其实就是通过点击相应的按钮,获取显示框中的表达式并进行拆分,然后调用不同的计算函数来实现计算的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function getResultInfix(){
var txt = document.getElementById("txtScream");
var text = document.getElementById("textarea");
if(Judge(txt.value)==1){
var transit = txt.value + '#';
text.value = "中缀计算的结果为:";
//调用中缀计算函数
txt.value = Infix(transit);
}
}
function getResultsuffix(){
var txt = document.getElementById("txtScream");
var text = document.getElementById("textarea");
if(Judge(txt.value)==1){
var transit = txt.value + '#';
text.value = "后缀计算的结果为:";
//调用后缀计算函数
txt.value = suffix(transit);
}
}
function getResultChange(){
var txt = document.getElementById("txtScream");
var text = document.getElementById("textarea");
if(Judge(txt.value)==1){
var transit = txt.value + '#';
text.value = "后缀表达式的结果为:";
//调用中缀转后缀函数
txt.value = Change(transit);
}
}

改进二:括号匹配异常处理

在上一个例子中是没有加入括号匹配异常处理的,在实际操作中我发现不添加异常处理的话会使程序发生运算bug,导致运算结果不准确,加入异常处理使遇到括号不匹配的问题时提示用户检查计算式是否正确,来矫正用户的输入错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function Judge(item){
var str=item;
var outStack=new Stack();
outStack.push('#');
for(var i=0;i<item.length;i++){
if(str[i]=='('){
outStack.push('(');
}
else if(str[i]==')'){
if(outStack.peek()=='('){
outStack.pop();
}
else{
alert("抱歉,您的括号不能够匹配,请检查你的输入!");
return 0;
}
}
}
if(outStack.peek()!='#'){
alert("抱歉,您的括号不能够匹配,请检查你的输入!");
return 0;
}
return 1;
}

即在判断函数即处理括号匹配问题,如果处理的不准确,立即停止操作,直到用户输入正确为止。

运算符按钮的优化

在实际操作中,发现会有一些更容易发生的问题,例如用户没有输入数字直接输入运算符的话运算会导致运算结果不准确或者程序停止运行,再例如用户输入一个运算符后直接输入另外一个运算符,都会使程序产生问题,这就需要对运算符控制函数进行修改,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function putTheControlKey(control){
var txt = document.getElementById("txtScream");
// 处理空输入提醒用户
if(txt.value == 0)
{
alert("请先输入至少一个数字后再输入运算符!");
return;
}
//如果输入框最后一个字符是运算符,先删除最后的运算符,再将键入运算符加入字符串尾
if(txt.value[txt.value.length-1] =="+" || txt.value[txt.value.length-1] =="-" || txt.value[txt.value.length-1] =="*" || txt.value[txt.value.length-1] =="/"){
backSpace();
}
txt.value += control.value;
}

其他优化诸如除零异常处理,后缀表达式逗号隔开,负数处理等都进行了优化,具体效果请查看神奇的计算器(改进版),附上完成图,谢谢大家。

Godlike Meteor wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
我知道不会有人点开,但万一真有人想不开呢?
------ 本文结束 ------