JavaScript的中缀表达式计算器。
最近没事做的时候就浅浅地学了一下js,和c++太神似了,只是变量无类型很不习惯。打了一个计算器来练一下手。
目前支持加、减、乘、除、乘方、括号、三角函数、自然对数,用的还是过去学的知识。。只是用js裹了一层皮,我想效率应该比c++低很多。
浮点支持比较弱,因为oi选手接触实数却是频率较小,不太会处理。
不支持高精,这是基础知识中少有的的神级难度的东西。
<html>
<script type="text/javascript">
const level = new Array();
level['+'] = 1;
level['-'] = 1;
level['*'] = 2;
level['/'] = 2;
level['^'] = 3;
level['s'] = 4;
level['c'] = 4;
level['t'] = 4;
level['('] = 0;
level['l'] = 4;
const opt = new Array();
opt['+'] = 2;
opt['-'] = 2;
opt['*'] = 2;
opt['/'] = 2;
opt['^'] = 2;
opt['s'] = 1;
opt['c'] = 1;
opt['t'] = 1;
opt['('] = 0;
opt['l'] = 1;
var stack1 = new Array();
var stack2 = new Array();
var top1 = 0;
var top2 = 0;
function add(a)
{
if (cal.typein.value=="0")
cal.typein.value=a;
else
cal.typein.value += a;
}
function isdigit(a)
{
if (a<='9' && a>='0')
return true;
else
return false;
}
function work(a,b,c)
{
if (c == '+')
return a+b;
if (c == '-')
return a-b;
if (c == '*')
return a*b;
if (c == '/')
return a/b;
if (c == '^')
return Math.pow(a,b);
if (c == 's')
return Math.sin(a);
if (c == 'c')
return Math.cos(a);
if (c == 't')
return Math.tan(a);
if (c == 'l')
return Math.log(a);
if (c == 'n')
return Math.ln(a);
}
function calc()
{
var str = cal.typein.value;
str = str.replace(/sin/g,"s");
str = str.replace(/cos/g,"c");
str = str.replace(/tan/g,"t");
str = str.replace(/ln/g,"l");
str = str.replace(/pi/g,"3.141592653");
str = str.replace(/e/g,"2.71828183");
if (str[0] == '-')
str = '0'+str;
for (var i=0;i<str.length;i++)
{
if (isdigit(str[i]))
{
var j = i;
var result=0;
var result2=0;
while (j<str.length+1&&isdigit(str[j]))
{
result = result*10+Number(str[j]);
j ++;
}
if (str[j] == '.')
{
var bit = 0.1;
j ++;
while (j<str.length+1&&isdigit(str[j]))
{
result2 += str[j]*bit;
bit /= 10.0;
j ++;
}
}
stack2[++top2] = result+result2;
i = j - 1;
}
else if (str[i]=='(')
{
stack1[++top1] = '(';
}
else if (str[i]==')')
{
while (stack1[top1] != '(')
{
var oper = stack1[top1--];
if (opt[oper] == 2)
{
var num1 = stack2[top2--];
var num2 = stack2[top2--];
var num = work(num2,num1,oper);
}
else
{
var num1 = stack2[top2--];
var num = work(num1,0,oper);
}
stack2[++top2] = num;
}
top1--;
}
else if (top1==0 || level[str[i]] > level[stack1[top1]])
{
stack1[++top1] = str[i];
}
else
{
while (top1>0 && level[str[i]] <= level[stack1[top1]])
{
var oper = stack1[top1--];
if (opt[oper] == 2)
{
var num1 = stack2[top2--];
var num2 = stack2[top2--];
var num = work(num2,num1,oper);
}
else
{
var num1 = stack2[top2--];
var num = work(num1,0,oper);
}
stack2[++top2] = num;
}
stack1[++top1] = str[i];
}
}
while (top1 > 0)
{
var oper = stack1[top1--];
if (opt[oper] == 2)
{
var num1 = stack2[top2--];
var num2 = stack2[top2--];
var num = work(num2,num1,oper);
}
else
{
var num1 = stack2[top2--];
var num = work(num1,0,oper);
}
stack2[++top2] = num;
}
cal.typein.value = stack2[top2];
}
</script>
<body>
<form name="cal">
<table>
<tr>
<input type="Text" value=0 name="typein">
<tr>
<td><input type="Button" value="1" οnclick="add('1')"></td>
<td><input type="Button" value="2" οnclick="add('2')"></td>
<td><input type="Button" value="3" οnclick="add('3')"></td>
<td><input type="Button" value="ce" οnclick="typein.value='0'"></td>
</tr>
<td><input type="Button" value="4" οnclick="add('4')"></td>
<td><input type="Button" value="5" οnclick="add('5')"></td>
<td><input type="Button" value="6" οnclick="add('6')"></td>
<td><input type="Button" value='+' οnclick="add('+')"></td>
<tr>
<td><input type="Button" value="7" οnclick="add('7')"></td>
<td><input type="Button" value="8" οnclick="add('8')"></td>
<td><input type="Button" value="9" οnclick="add('9')"></td>
<td><input type="Button" value="=" οnclick="calc()"></td>
</tr>
<tr>
<td><input type="Button" value='-' οnclick="add('-')"></td>
<td><input type="Button" value='*' οnclick="add('*')"></td>
<td><input type="Button" value='/' οnclick="add('/')"></td>
<td><input type="Button" value='^' οnclick="add('^')"></td>
</tr>
<tr>
<td><input type="Button" value="sin" οnclick="add('sin')"></td>
<td><input type="Button" value="cos" οnclick="add('cos')"></td>
<td><input type="Button" value="tan" οnclick="add('tan')"></td>
<td><input type="Button" value="ln" οnclick="add('ln')"></td>
</tr>
<tr>
<td><input type="Button" value='(' οnclick="add('(')"></td>
<td><input type="Button" value="pi" οnclick="add('pi')"></td>
<td><input type="Button" value='e' οnclick="add('e')"></td>
<td><input type="Button" value=')' οnclick="add(')')"></td>
</tr>
<table>
</form>
</body>
</html>