用javascript的eval 功能
 导入相关的assembly

解决方案 »

  1.   

    如果是我,那就自己写算法进行分析了,网络上应该有类似的源代码
    你去google搜一搜吧
      

  2.   

    把数字和运算符分离开来,用string.split('数字或符号'),
    再用system.convert.toint()把数字转换为整形变量,
    最后再组合起来!
      

  3.   

    用JScript动态编译功能去实现最方便了。
      

  4.   

    看看这个:
    http://www.yestar2000.com/TechCenter/1410/TC_16048.htm
      

  5.   

    用函数将其分解,具体函数上面已经有人说过,就是splite,至于最后用什么分隔符你自己决定吧.^_^
      

  6.   

    把运算符分离出来的话,似乎有点繁杂了,因为数学运算符很多的,我也不知道具体情况下是什么运算符,用jscript的方法我看过了,如下面的函数<input type="text" name="expr" size=14 action="compute(this.form)" >function compute(obj) {obj.expr.value = eval(obj.expr.value)}但是要导入js脚本解释语句,这点暂时还不会,这里我想问有没有简单一点的,用c#解决的办法;
      

  7.   


    用Windows Script Control吧,文件名:msscript.ocx.那么在引用节点下会增加一个MSScriptControl组件,Eval 方法:计算表达式并返回结果。
      

  8.   

    用数据库吧。
    select '3+2-5'
      

  9.   

    在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;
    }
      

  10.   

    数据库,以前没用过 select '3+2-5'就可以得行了吗?
      

  11.   

    上面的是vc++吗,我从来没用过,看不懂啊 我只学过qb,vb c#
      

  12.   

    可以结帖了,
    非常感谢各位的参与,很想给所有人加100分,但这题只有20分(我是刚在这个论坛注册,没有那么多分,遗憾)
    我想,加给hongenbull()
    表示一个意思了