当前位置:编程学习 > JS >>

关于用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怎么设置读写

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,