关于用javascript实现科学计算器功能的思路
主要是如何使使用者输入一个式子后程序能够将其读取并运算,然后输出结果。我需要的是思路,比如所要用到的知识,需要的算法等,不要直接贴一段代码,至少要有解释。回答的好还有追加。。。
补充:注意是科学计算器,需要有计算三角函数,幂,对数等功能
主要是如何使使用者输入一个式子后程序能够将其读取并运算,然后输出结果。我需要的是思路,比如所要用到的知识,需要的算法等,不要直接贴一段代码,至少要有解释。回答的好还有追加。。。
补充:注意是科学计算器,需要有计算三角函数,幂,对数等功能
答案:构建一个数学表达式的字符串,然后用 eval函数 (http://www.w3school.com.cn/js/jsref_eval.asp) 执行,返回值就是该表达式的值;这是最简单的方法。 sin、log、e、pi 用Math对象的方法或属性来代替。字符串替换函数replace (http://www.w3school.com.cn/js/jsref_replace.asp) 'sin(12)+log(23)*sqrt(2)'.replace(/(sin|cos|tan|log|sqrt)/g,'Math.$1'); 注意: 1. 最好能检测用户输入的表达式(基础检查:没有非法字符如&~ßä;高级检查:括号是否对称,运算符是否正确 以及错误时的处理方法),否则js执行出错的几率会很大。 2. log表示的其实是数学中的ln。使用到数学中的log时可以用 换底公式(http://baike.zhaoxi.net/view/1920827.htm) 变形。 z.B: eval('Math.sin(Math.PI/2)'); // 1 eval('Math.sin(3*Math.PI/2)'); // -1 eval('Math.log(Math.exp(3))'); // 3 eval('sin(12)+log(23)*sqrt(2)'.replace(/(sin|cos|tan|log|sqrt)/g,'Math.$1')); // 3.8976855269089623 ----------------------------- Math 对象属性 FF: Firefox, IE: Internet Explorer 属性 描述 FF IE E 返回算术常量 e,即自然对数的底数(约等于2.718)。 1 3 LN2 返回 2 的自然对数(约等于0.693)。 1 3 LN10 返回 10 的自然对数(约等于2.302)。 1 3 LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)。 1 3 LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。 1 3 PI 返回圆周率(约等于3.14159)。 1 3 SQRT1_2 返回返回 2 的平方根的倒数(约等于 0.707)。 1 3 SQRT2 返回 2 的平方根(约等于 1.414)。 1 3 Math 对象方法 FF: Firefox, IE: Internet Explorer 方法 描述 FF IE abs(x) 返回数的绝对值。 1 3 acos(x) 返回数的反余弦值。 1 3 asin(x) 返回数的反正弦值。 1 3 atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。 1 3 atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。 1 3 ceil(x) 对数进行上舍入。 1 3 cos(x) 返回数的余弦。 1 3 exp(x) 返回 e 的指数。 1 3 floor(x) 对数进行下舍入。 1 3 log(x) 返回数的自然对数(底为e)。 1 3 max(x,y) 返回 x 和 y 中的最高值。 1 3 min(x,y) 返回 x 和 y 中的最低值。 1 3 pow(x,y) 返回 x 的 y 次幂。 1 3 random() 返回 0 ~ 1 之间的随机数。 1 3 round(x) 把数四舍五入为最接近的整数。 1 3 sin(x) 返回数的正弦。 1 3 sqrt(x) 返回数的平方根。 1 3 tan(x) 返回角的正切。 1 3 toSource() 返回该对象的源代码。 1 - valueOf() 返回 Math 对象的原始值。 1 4
其他:简单点的.定义三个变量,比如a,b,o, a用来保存第一个操作数,o用来保存操作符(即+-*/),b用来保存第二个操作数,当a,b,o都有数据并按等号或另一个操作符后,按a,o,b的顺序按字符串连接,然后用eval函数取结果,存入a变量,同时清空o和b变量.回显a变量的值.如果按的是等号以外的操作符,则将操作符存入o变量. 这个主要涉及到的是字符串分析。
(1 + 3)× 2 - 1
拿这个输入来分析。
那么首先我要有一个循环,循环这个字符串。
循环里边要判断当前字符的类型,比如着一个,我检查到当前字符是“(”号,
那么我下边的逻辑就是要找到“)”号。然后我要再对内部的东西进行循环。
依此类推,分析函数可以做成递归调用,模拟一下栈。
这是分析方法,当然首先你要确认你要进行几种运算,即,你的软件边界是什么,
如果只是加减运算,逻辑可能会简单很多。
希望对你有帮助。 <script type="text/javascript">
<!--
var num=eval("7*9");
document.write(num);
//-->
</script>
看来你有够懒
上一个:javascript 哪些是可以自己定义的,哪些是必须的丫,
下一个:Javascript中的Table怎么设置读写