得到一个字符串如“3+2-5”,或“10>=8”,用c#我怎样才能计算它的值啊? 用javascript的eval 功能 导入相关的assembly 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是我,那就自己写算法进行分析了,网络上应该有类似的源代码你去google搜一搜吧 把数字和运算符分离开来,用string.split('数字或符号'),再用system.convert.toint()把数字转换为整形变量,最后再组合起来! 用JScript动态编译功能去实现最方便了。 看看这个:http://www.yestar2000.com/TechCenter/1410/TC_16048.htm 用函数将其分解,具体函数上面已经有人说过,就是splite,至于最后用什么分隔符你自己决定吧.^_^ 把运算符分离出来的话,似乎有点繁杂了,因为数学运算符很多的,我也不知道具体情况下是什么运算符,用jscript的方法我看过了,如下面的函数<input type="text" name="expr" size=14 action="compute(this.form)" >function compute(obj) {obj.expr.value = eval(obj.expr.value)}但是要导入js脚本解释语句,这点暂时还不会,这里我想问有没有简单一点的,用c#解决的办法; 用Windows Script Control吧,文件名:msscript.ocx.那么在引用节点下会增加一个MSScriptControl组件,Eval 方法:计算表达式并返回结果。 用数据库吧。select '3+2-5' 在vc下的。要先改为c#的语法String 改为string 等等;用的时候用loadexp(string)读入你的表达式;然后用string getresult()返回的到结果;mfc下通过编译可以运行,有表达式纠错功能。运算符号有+ - * / ^ sin() cos() tan() ln() () 任意的组合或嵌套class supermath{public: int deadline; CString errormsg; CString expstr; CString thesign; float runstr(CString,int); int isdigits(CString); void xtrim(CString*); void prerun(CString*); CString getresult(); void loadexp(CString);};void supermath::loadexp(CString str){ expstr=str;}int supermath::isdigits(CString str){ int i,is=1; char *t=str.GetBuffer(str.GetLength()); for (i=0;i<(int)strlen(t);i++) if (!((*(t+i)>='0' && *(t+i)<='9') || *(t+i)=='.' || (*(t+i)=='-' && i==0))) is=0; return is;}void supermath::xtrim(CString *str){ char *t=str->GetBuffer(str->GetLength()); int level=0,isdotrim=1; for(int i=0;i<(int)strlen(t)-1;i++) { if (*(t+i)=='(') level++; if (*(t+i)==')') level--; if (level==0) isdotrim=0; } if ((isdotrim)&&strlen(t)>1) { *str=str->Mid(1,str->GetLength()-2); xtrim(str); }}void supermath::prerun(CString *str){ int level=0,i; for(i=0;i<str->GetLength();i++){ if (str->Mid(i,1)=='(') level++; if (str->Mid(i,1)==')') level--; } if (level!=0) errormsg="括号请成对!"; str->Replace("tg","tan");}float supermath::runstr(CString str,int maxtime){ float midvar; int i,j,level; if (errormsg!="") return 2; if (maxtime>deadline) { errormsg="expression fleat!!"; return 2; } xtrim(&str); if (isdigits(str)) return (float)atof(str.GetBuffer(str.GetLength())); else { char *exp=str.GetBuffer(str.GetLength()); char *sign=thesign.GetBuffer(str.GetLength()); for(i=0;i<10;i++){ level=0; for(j=0;j<str.GetLength()-1;j++) { if (*(exp+j)=='(') level++; if (*(exp+j)==')') level--; if (str.Mid(j,1)==thesign.Mid(i,1) && level==0) { CString str1=str.Mid(0,j); CString str2=str.Mid(j+1); switch (*(sign+i)) { case '+': return runstr(str1,maxtime+1)+runstr(str2,maxtime+1);break; case '-': if (str1=="") midvar=0; else midvar=runstr(str1,maxtime+1); return midvar-runstr(str2,maxtime+1);break; case '*': return runstr(str1,maxtime+1)*runstr(str2,maxtime+1);break; case '/': midvar=runstr(str2,maxtime+1); if (midvar==0) {errormsg+=" '/0'形错误 位置:‘"+str+"’<-err.. "; return 2;} return runstr(str1,maxtime+1)/midvar; break; case '^': midvar=(float)pow(runstr(str1,maxtime+1),runstr(str2,maxtime+1)); if ((midvar+1)==midvar) { errormsg+=" '-x^0.5'形错误 位置:‘"; errormsg+=str; errormsg+="’<-err.. "; return 2; } return midvar; break; case 'i': return (float)sin(runstr(str2.Mid(1),maxtime+1));break; case 'c': return (float)cos(runstr(str2.Mid(2),maxtime+1));break; case 't': midvar=(float)tan(runstr(str2.Mid(2),maxtime+1)); if ((midvar+1)==midvar) {errormsg+=" 'tan(pi/2)'形错误 位置:‘"+str+"’<-err.. "; return 2;} return midvar; break; case 'b': return (float)fabs(runstr(str2.Mid(1),maxtime+1));break; case 'l': midvar=runstr(str2.Mid(1),maxtime+1); if (midvar<=0) {errormsg+=" 'ln-'形错误 位置:‘"+str+"’<-err.. "; return 2;} return (float)log(midvar); break; default: errormsg+=" 内部未知错误!"; } } } } }errormsg+="含有未知运算符 位置:‘"+str+"’<-err.. ";return 2;}CString supermath::getresult(){ deadline=10; errormsg=""; thesign="+-/*^ictbl"; errormsg=""; CString str; prerun(&expstr); str.Format("%f",runstr(expstr,1)); if (errormsg=="") return str; else return errormsg;} 数据库,以前没用过 select '3+2-5'就可以得行了吗? 上面的是vc++吗,我从来没用过,看不懂啊 我只学过qb,vb c# 可以结帖了,非常感谢各位的参与,很想给所有人加100分,但这题只有20分(我是刚在这个论坛注册,没有那么多分,遗憾)我想,加给hongenbull()表示一个意思了 c#添加MMC管理单元 求,怎么把dataGridView的数据读取到数据库中 这个软件如何更新? 请教保存文件的问题 创建AD用户时候的密码加密问题 mdi窗体中,怎样使得一个子窗体打开,其他的子窗体关闭呢? 我的结构体怎用错了 OFFICE2007的2个版本同时安装到一台电脑上的问题 B/S程序调试过程中出现如下错误:未处理的“System.InvalidOperationException”类型的异常出现在 mscorlib.dll 中。如何解决? 关于ListView的排序的速度问题 新申请的.NET的QQ群,欢迎大家加入:6568951 Gif动画如何生成?
你去google搜一搜吧
再用system.convert.toint()把数字转换为整形变量,
最后再组合起来!
http://www.yestar2000.com/TechCenter/1410/TC_16048.htm
用Windows Script Control吧,文件名:msscript.ocx.那么在引用节点下会增加一个MSScriptControl组件,Eval 方法:计算表达式并返回结果。
select '3+2-5'
用的时候用loadexp(string)读入你的表达式;
然后用string getresult()返回的到结果;mfc下通过编译可以运行,有表达式纠错功能。
运算符号有+ - * / ^ sin() cos() tan() ln() () 任意的组合或嵌套class supermath{
public:
int deadline;
CString errormsg;
CString expstr;
CString thesign;
float runstr(CString,int);
int isdigits(CString);
void xtrim(CString*);
void prerun(CString*);
CString getresult();
void loadexp(CString);
};void supermath::loadexp(CString str){
expstr=str;
}int supermath::isdigits(CString str)
{
int i,is=1;
char *t=str.GetBuffer(str.GetLength());
for (i=0;i<(int)strlen(t);i++)
if (!((*(t+i)>='0' && *(t+i)<='9') || *(t+i)=='.' || (*(t+i)=='-' && i==0))) is=0;
return is;
}void supermath::xtrim(CString *str)
{
char *t=str->GetBuffer(str->GetLength());
int level=0,isdotrim=1;
for(int i=0;i<(int)strlen(t)-1;i++)
{
if (*(t+i)=='(') level++;
if (*(t+i)==')') level--;
if (level==0) isdotrim=0;
}
if ((isdotrim)&&strlen(t)>1)
{
*str=str->Mid(1,str->GetLength()-2);
xtrim(str);
}
}void supermath::prerun(CString *str){
int level=0,i;
for(i=0;i<str->GetLength();i++){
if (str->Mid(i,1)=='(') level++;
if (str->Mid(i,1)==')') level--;
}
if (level!=0) errormsg="括号请成对!";
str->Replace("tg","tan");
}float supermath::runstr(CString str,int maxtime)
{
float midvar;
int i,j,level;
if (errormsg!="") return 2;
if (maxtime>deadline) {
errormsg="expression fleat!!";
return 2;
}
xtrim(&str);
if (isdigits(str)) return (float)atof(str.GetBuffer(str.GetLength()));
else {
char *exp=str.GetBuffer(str.GetLength());
char *sign=thesign.GetBuffer(str.GetLength());
for(i=0;i<10;i++){
level=0;
for(j=0;j<str.GetLength()-1;j++)
{
if (*(exp+j)=='(') level++;
if (*(exp+j)==')') level--;
if (str.Mid(j,1)==thesign.Mid(i,1) && level==0) {
CString str1=str.Mid(0,j);
CString str2=str.Mid(j+1);
switch (*(sign+i))
{
case '+':
return runstr(str1,maxtime+1)+runstr(str2,maxtime+1);break;
case '-':
if (str1=="") midvar=0; else midvar=runstr(str1,maxtime+1);
return midvar-runstr(str2,maxtime+1);break;
case '*':
return runstr(str1,maxtime+1)*runstr(str2,maxtime+1);break;
case '/':
midvar=runstr(str2,maxtime+1);
if (midvar==0) {errormsg+=" '/0'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return runstr(str1,maxtime+1)/midvar; break;
case '^':
midvar=(float)pow(runstr(str1,maxtime+1),runstr(str2,maxtime+1));
if ((midvar+1)==midvar) { errormsg+=" '-x^0.5'形错误 位置:‘"; errormsg+=str; errormsg+="’<-err.. "; return 2; }
return midvar; break;
case 'i':
return (float)sin(runstr(str2.Mid(1),maxtime+1));break;
case 'c':
return (float)cos(runstr(str2.Mid(2),maxtime+1));break;
case 't':
midvar=(float)tan(runstr(str2.Mid(2),maxtime+1));
if ((midvar+1)==midvar) {errormsg+=" 'tan(pi/2)'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return midvar; break;
case 'b':
return (float)fabs(runstr(str2.Mid(1),maxtime+1));break;
case 'l':
midvar=runstr(str2.Mid(1),maxtime+1);
if (midvar<=0) {errormsg+=" 'ln-'形错误 位置:‘"+str+"’<-err.. "; return 2;}
return (float)log(midvar); break;
default:
errormsg+=" 内部未知错误!";
}
}
}
}
}
errormsg+="含有未知运算符 位置:‘"+str+"’<-err.. ";
return 2;
}
CString supermath::getresult()
{
deadline=10;
errormsg="";
thesign="+-/*^ictbl";
errormsg="";
CString str; prerun(&expstr);
str.Format("%f",runstr(expstr,1));
if (errormsg=="") return str; else return errormsg;
}
非常感谢各位的参与,很想给所有人加100分,但这题只有20分(我是刚在这个论坛注册,没有那么多分,遗憾)
我想,加给hongenbull()
表示一个意思了