5D艺术网首页
商城
|
资讯
|
作品
|
博客
|
教程
|
论坛
登录
注册
加为好友
发短消息
来自:好人村
性别:先生
最后登录:2012-08-07
http://jh7086.5d.cn/
大坏人
首页
|
新闻
|
话题
|
博客
|
相册
|
艺术作品
|
社交关系
|
留言板
|
社交圈
2004/10/12 | 字符串-转-表达式
类别(Flash进修)
|
评论
(1)
|
阅读(404)
|
发表于 21:40
本篇讨论:如何将字符串形式的数学表达式计算出来
例如:"-((2*3+5)/7)*2-9.7",无法直接用Number(),也无法用eval()。
1。先从简单的,不带括号,不带负数的开始:以"200*36-53+7.89/6"为例,可以先找出其中的"+","-","*","/"在字串中的位置,按照这些位置将字串分割后存到数组中,按上例得到数组:{200,*,36,-,53,+,7.89,/,6},再在数组寻找"*"或"/",找到后将前一元素与后一元素作"*"或"/"(此时用到Number()),将得到的结果存到"*"或"/"所在位置,并将前一元素和后一元素删去,继续寻找"*"或"/",直到数组中不在有"*"与"/"。接下来就是寻找"+"和"-"了,与处理"*","/"的方法一样。
2。不带括号,带有负数的:以"-200*36-53+7.89/6"为例,由于是不带括号的,所以这个负数必然在最前面,只要在前面添个"0",变为"0-200*36-53+7.89/6"就OK了,成了上面讲到的最简单情况了。
3。带括号的:以"-(-200*36-(53+7.89))/6"为例,先检测第一个字符,发现是"-",于是在前面添个"0",
变为"0-(-200*36-(53+7.89))/6",然后检测"("和")",只要出现"(",就建立新的表达式,而只要出现")",就对最后新建的表达式进行计算,并返回计算结果,用得到的结果来替换括号内的内容。(即用“递归法”处理括号的问题)
如上例,其处理过程:
在前面添加"0"
检测到第一个"("
开始建立新的表达式:"-200*36-......."(假设用变量M[1]记录)
建立过程中检测到"("
开始建立新的表达式:"53+7.89........"(假设用变量M[2]记录)
建立过程中检测到")"
开始计算最后新建的表达式M[2],即计算"53+7.89",并将无用的M[2]删掉
将得到的结果"60.89"替换到M[1]中,使M[1]变为"-200*36-60.89......."
继续建立M[1],又检测到")"
开始计算目前最后新建的表达式M[1],即计算"-200*36-60.89"
。。。。。。。。。。。
____________________开始试验_______________________________
gongshi001="-((2*3+5)/7)*2-9.7";
//递归求值
function js001(gongshi){
var gongshi=new String(gongshi);
if (gongshi.charAt(0)=="("){//如果第一个字符为"("号
js001(gongshi.substr(1))//直接进入下级递归
}else if (gongshi.charAt(0)=="-"){//如果第一个字符为"-"号
gongshi="0"+gongshi;//在"-"号前面添"0"
}
//本级的计算
//返回结果
return jieguo;
}
//
//
0
评论
Comments
日志分类
首页
[163]
Flash习作
[85]
Flash进修
[33]
Flash推荐
[16]
Flash涂鸦
[4]
听~音乐
[9]
我滴地盘er
[16]