快速业务通道

继续表达式求值—支持函数

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-12


这次做的和上次那个方法不同,上次是将中缀表达式转换
为后缀表达式,再利用堆栈求值,所以对函数就不知道如何做了;
而这次用的方法则完全是按人脑的计算过程,从左到右,从内至外,
函数运算也实现了,而且参数个数也没有限制,添加也很方便
目前已添加的函数有sin(),cos(),max,min(),sin和cos采用角度制
另外,这个同样也是可以使用变量的,供测试的变量有m,n,y,x,
程序中所有变量都可用,但有些是不能做算术运算的^_^

点击浏览该文件
http://www.Flash8.net/bbs/UploadFile/2004-12/2004122344424863.swf
参考(很受启发):
http://www-900.ibm.com/developerWorks/cn/Java/j-w3eva/index.sHTML#resources

-------------------AS如下------------------
var ostr = "+,-,*,/,%,^";
var fstr = "sin,cos,max,min";
//获取运算符的优先级,非运算符的优先级为0
function isp(optr:String) {
switch (optr) {
case "+" :
case "-" :
return 1;
case "*" :
case "/" :
case "%" :
return 2;
case "^" :
return 3;
default :
return 0;
}
}
//判断操作数的类型(数字或变量)并作相应处理
function getNum(str:String) {
var ch = str.substr(0, 1);
if ((ch<"0" || ch>"9") && ch != "-") {
return eval(str);
} else {
return Number(str);
}
}
//运算符的具体运算
function func(optr:String, va:Array) {
for (var i in va) {
va[i] = getNum(va[i]);
}
switch (optr) {
case "+" :
return va[0]+va[1];
case "-" :
return va[0]-va[1];
case "*" :
return va[0]*va[1];
case "/" :
return va[0]/va[1];
case "%" :
return va[0]%va[1];
case "^" :
return Math.pow(va[0], va[1]);
case "sin" :
return Math.sin(va[0]/180*Math.PI);
case "cos" :
return Math.cos(va[0]/180*Math.PI);
case "max" :
return Math.max(va[0], va[1]);
case "min" :
return Math.min(va[0], va[1]);
}
}
//找出最里层的括号,并返回括号的起始位置及括号内的表达式
function godepth(estr) {
var e = estr.indexOf(")");
var s = estr.lastIndexOf("(", e);
estr = estr.slice(s+1, e);
var obj = {s:s, e:e, estr:estr};
return obj;
}
//计算带括号和函数的表达式
function toNum2(estr, ostr, fstr) {
var i, JHTEMP, obj = godepth(estr), hasfunc = "";
fstr = fstr.split(",");
while (obj.s>=0 && obj.e>obj.s) {
JHTEMP = toNum1(obj.estr, ostr);
//检查左括号的外边是否是一个函数名
for (i in fstr) {
if (estr.lastIndexOf(fstr[i], obj.s) == obj.s-fstr[i].length) {
hasfunc = fstr[i];
break;
}
}
if (hasfunc.length>0) {
JHTEMP = func(hasfunc, JHTEMP);
estr = estr.slice(0, obj.s-hasfunc.length)+JHTEMP+estr.slice(obj.e+1);
hasfunc = "";
} else {
JHTEMP = JHTEMP[0];
estr = estr.slice(0, obj.s)+"JHTEMP"+estr.slice(obj.e+1);
}
obj = godepth(estr);
}
estr = toNum1(estr, ostr);
return estr;
}
//计算无括号带逗号表达式
function toNum1(estr, ostr) {
var i, earray = estr.split(",");
for (i in earray) {
earray[i] = toNum0(earray[i], ostr);
}
return earray;
}
//计算无括号无逗号表达式
function toNum0(estr:String, ostr:String) {
var i, maxisp, earray = toArray0(estr, ostr);
//搜索数组,找出最高的优先级(非运算符的优先级为0)
while (earray.length>1) {
maxisp = 0;
for (i in ear

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号