如何把一个表达式(用户输入的),形如"3.4+3*x"的字符串,插入到代码中,如z=3.4+3*x(double z,x;在程序中已经定义了)。
我看了一些资料,都是不带变量的所谓“常式”,如"1+1+5*5"。它们可以用堆栈处理。但是怎么用堆栈处理带变量的变式呢?另外,还有人用cl.exe带动态库的方法来处理,具体应该怎么做。
附:我的程序主要内容是用户输入公式(表达式的字符串),然后我通过公式计算一些结论。

解决方案 »

  1.   

    有软件例子,不过我还没有过过目:)
    http://www.csdn.net/cnshare/soft/4/4589.shtm
      

  2.   

    如果你的程序支持c++的话,我建议你可以利用纯虚函数和继承的特性来实现。这样的话,可以解析任何长度的输入的字符串,而且可以支持各种操作符和任意层的括号。
    具体的思想是,把数据和操作符从一个纯虚类继承出来,实现相同的操作,比如operate。数据类的operate返回数据,操作类的operate返回对数据操作后的结果。在你解析字符串的时候,需要把所有的内容做成一个二叉数的逻辑结构,最外层叶子为数据,中间的为操作。这样的话,对于计算就比较简单了。计算时,只需要调用root节点的operate即可。
    对于未知数,只需要对特定的数据节点赋值即可实现。
      

  3.   

    csdn软件区有一个basic解释器,带变量的,可以看看
      

  4.   

    小程序,见笑了
    //用递归方式求解表达式
    //本程序在Borland C++ 3.1下编译通过,
    #include <iostream.h>
    #include <math.h>
    #define N 200
    #define Q 0x3a
    //#define Q 0x35
    //char a[10]="5((x+x)*x)";
    //char a[10]="5((x*x)+x)";
    //char a[10]="5(x*x)";
    //char a[15]="5(x*((x*x)+x))";
    char a[100]="5((((x+x)*(x*x))*((x*x)+(x+x)))+x)";
    int az=5;
    int sc(char aa[N]);
    int t(char s[N]);
    main()
    {
    a[0]=Q;
    cout<<t(a);
    cin>>az;
    }
    int t(char s[N])
    {
        int lj=0,i,kh=0;
    char aa[N],bb[N];
        if(s[1]=='x')return(1);
    else
    {
        do
    {
        lj++;
        if(s[lj]=='(')kh++;
        if(s[lj]==')')kh--;
    }while((s[lj]!='+'&&s[lj]!='*')||kh!=1);aa[0]=a[0];
    bb[0]=a[0];
        for(i=2;i<lj;i++)
        aa[i-1]=s[i];
    for(i=lj+1;i<=N;i++)
        bb[i-lj]=s[i];
    // cout<<"aa="<<aa<<" bb="<<bb<<endl;;
        if(s[lj]=='+')
        return t(aa)+t(bb);
    if(s[lj]=='*')
        return t(aa)*sc(bb)+sc(aa)*t(bb);
    }
    }
    int sc(char aa[N])
    {
    int b[N]={{0}};
    char d[N];//B为系数 C为指数栈 D为符号栈
    int ks=1,kf=1,kh=1,i=0;//ks系数指针 kf符号指针 kh括号计数if(aa[1]=='x')return(a[0]-0x30);
        do
    {
    i++;
    switch(aa[i])
    {
        case '(':
            kh++;
    break;
        case 'x':
        b[ks]=a[0]-0x30;ks++;
    break;
        case '+':
        d[kf]='+';kf++;
    break;
        case '*':
        d[kf]='*';kf++;
    break;
        case ')':
        if(kh!=1)
            {
            kh--;
            kf--;
            if(d[kf]=='+')
    {
    b[ks-2]=b[ks-2]+b[ks-1];
    ks--;b[ks]=0;
    }
            if(d[kf]=='*')
    {
        b[ks-2]=b[ks-2]*b[ks-1];
    ks--;b[ks]=0;
    }
            }
    }
    }while(kh!=1);
    // cout<<"sc aa="<<aa<<" "<<b[1]<<endl;
    return b[1];
    }
      

  5.   

    问题已经解决了。可以采取tuyang() 的方法。