请问一下将一般的数据公式去掉扩号的公式怎么写。
例如:a1+a*(a2+a3*(a4+a5*a6))+a3
解析成:a1+a*a2+a*a3*a4+a*a3*a5*a6
还比如:
(a1*a2+a3)*(a4*a5+a7*a8)+a9解析成:
a1*a2*a4*a5+a1*a2*a7*a8+a3*a4*a5+a3*a7*a8+a9

解决方案 »

  1.   

    不用解析了:
    按下面搞就可以了dim V1 ,V2,V3
    V1=a4+a5*a6
    V2=a2+a3*V1
    V3=a1+a*V2+a3dim T1,T2,T3
    T1=(a1*a2+a3)
    T2=T1*(a4*a5+a7*a8)
    T3=T2+a9debug.print "a1+a*(a2+a3*(a4+a5*a6))+a3=" & V3,"(a1*a2+a3)*(a4*a5+a7*a8)+a9=" & T3
      

  2.   

    mathlib有函数推导功能,俺上学时毕业设计也曾做这方面,苦于没想法,放弃了。
      

  3.   

    解析干什么?例如:a1+a*(a2+a3*(a4+a5*a6))+a3 
    解析成:a1+a*a2+a*a3*a4+a*a3*a5*a6 
     
    以上解析后结果不同
    漏了个a3a1*a2+a3)*(a4*a5+a7*a8)+a9 
    解析成: 
    a1*a2*a4*a5+a1*a2*a7*a8+a3*a4*a5+a3*a7*a8+a9这个你自己不是解析出来了
      

  4.   

    当然有这样的算法,否则的话你又是如何在编程的时候在代码里写复杂的表达式呢.
    不过算法比较复杂倒是真的.
    不过也别去整那些高深的东西了,直接调用EXCEL对象就可以处理数学表达式了.
      

  5.   

    我做过化学分子式的分子量计算,比如计算CaSO4*2H2O的分子量,和这有点类似,用的就是递归。先将最里层的括解析出来,将括号中的运算用一个变量代替,去掉该层括号,然后再计算调用这个递归函数...至直最外一层括号。
      

  6.   

    说下我思路,主要还是用到编译原理的词法分析。
    比如,a1+a*(a2+a3*(a4+a5*a6))+a3 ,先找根据运算符优先级别找出最先需要解析的部分,如a3*(a4+a5*a6),在根据运算符关系解析成a3*a4+a3*a5*a6,放到原来的地方代替a3*(a4+a5*a6),再由新运算式来重复上面动作。不过这个动作只考虑了这种情况,还有很多其他复杂的情况都要做判断,比如(a1*a2+a3)*(a4*a5+a7*a8)这样的,)和(两个符号直接相连,要根据中间的运算符又有不同的运算关系。主要是要理清优先关系。
    以上愚见,莫笑。
      

  7.   

    怎么这几天LZ都没消息
    我有C++代码,LZ觉得怎么样?
      

  8.   


    #include<iostream>
    #include<vector>
    #include<string>using namespace std;struct SYMBOL
    {
    char c; // '+' or '-'
    string str; // terms
    SYMBOL( char ch = 0, string temp = string() )
    :c(ch), str(temp)
    {
    }
    };
    string ParseFact( const string&, int& );void ShowError( int i )
    {
    switch ( i )
    {
    case 1:
    cout << "parse name error!" << endl;
    break;
    case 2:
    cout << "can't find ')' for matched " << endl;
    case 3:
    cout << "can't find anything after '+' or '-'" << endl;
    break;
    case 4:
    cout << "can't find anything after '*' " << endl;
    break;
    default:
    cout << "unexpected error!" << endl;
    break;
    }
    }bool validateChar( char c, bool head )
    {
    // head 代表是否为首字母
    bool ret = c<='z'&&c>='a' || c<='Z'&&c>='A' || c=='_';
    if ( !head )
    ret = ret || c<='9'&&c>='0';

    return ret;
    }bool IsOperator( char c )
    {
    return c=='+' || c=='-' || c=='*' || c==')';
    }bool IsEnd( char c )
    {
    return c == 0x0d || c==0 || c=='#';
    }bool ParseToVector( const string& str, vector<SYMBOL>& termVec )
    {
    char oldChar = '+';
    int oldPos = 0,pos;
    string temp;
    for ( pos = 0; pos < str.size(); pos++ )
    {
    if ( str[pos]=='+' || str[pos]=='-' )
    {
    if ( pos <= oldPos )
    return false;

    temp = str.substr( oldPos, pos-oldPos );
    termVec.push_back( SYMBOL(oldChar,temp) );

    oldChar = str[pos];
    oldPos = pos+1;
    }
    }

    temp = str.substr( oldPos, pos-oldPos );
    termVec.push_back( SYMBOL(oldChar,temp) );
    return true;
    }string MulPolynomial( const string& leftFact, const string& rightFact )
    {
    string ret;
    string temp;
    vector<SYMBOL> leftVec, rightVec;

    if ( ParseToVector(leftFact,leftVec) && ParseToVector(rightFact,rightVec) )
    {
    for (  vector<SYMBOL>::iterator leftIt = leftVec.begin(); 
    leftIt != leftVec.end();
    leftIt++ )
    {
    for( vector<SYMBOL>::iterator rightIt = rightVec.begin();
    rightIt != rightVec.end();
    rightIt++ )
    {
    temp = leftIt->str + string("*") + rightIt->str;
    if ( leftIt->c != rightIt->c )
    temp.insert( 0, "-" );
    else
    temp.insert( 0, "+" );

    ret += temp;
    }

    }
    }
    else
    ret = string();

    // 去掉最前面的'+'
    ret.erase( 0, 1 );
    return ret;
    }// 前面为符号时多项式里的+,-号应该变号
    string MinusPolynomial( const string& original )
    {
    string str( original );
    for ( unsigned i = 0; i < str.size(); i++ )
    {
    if ( str[i] == '+' )
    str[i] = '-';
    else if ( str[i] == '-' )
    str[i] = '+';
    }

    return str;
    }string ParseName( const string& strParse, int& pos )
    {
    int iStart = pos;
    int iEnd = 0;
    // 读取空格
    while ( strParse[pos] == ' ' ) pos++;

    if ( !validateChar(strParse[pos], true) )
    {
    ShowError( 1 );
    return string();
    }
    else
    {
    while ( validateChar(strParse[pos], false) )
    pos++;
    iEnd = pos;
    while ( strParse[pos] == ' ' ) pos++;

    if ( !IsOperator(strParse[pos]) && !IsEnd(strParse[pos]) )
    {
    ShowError( 1 );
    return string();
    }
    else
    {
    // cout << iStart << iEnd << endl; 
    return strParse.substr( iStart, iEnd-iStart );
    }
    }
    }string ParseTerm( const string& strParse, int& pos )
    {
    // 解析一个因子 如:a*b*(c+d)都会被当成一个因子
    string ret = ParseFact( strParse, pos );
    while ( strParse[pos] == '*' )
    {
    string ret2 = ParseFact( strParse, ++pos );
    if ( ret2.empty() )
    {
    ShowError( 4 );
    return string();
    }
    else
    ret = MulPolynomial( ret, ret2 ); while( strParse[pos]==' ' ) pos++;
    }

    return ret;
    }string ParseExp( const string& strParse, int& pos )
    {
    // 解析一个完整的表达式
    string ret = ParseTerm( strParse, pos );
    while ( strParse[pos] == '+' || strParse[pos] == '-' )
    {
    int oldPos = pos;

    string ret2 = ParseTerm( strParse, ++pos );
    if ( ret2.empty() )
    {
    ShowError( 3 );
    return string();
    }

    while ( strParse[pos] == ' ' ) pos++;

    if ( strParse[oldPos] == '+' )
    ret += string("+") + ret2;
    else
    ret += string("-") + MinusPolynomial( ret2 );
    }

    return ret;
    }string ParseFact( const string& strParse, int& pos )
    {
    // 解析单个项 将(exp)的exp当成一个独立体
    string ret;
    while ( strParse[pos] == ' ' ) pos++;

    if ( validateChar(strParse[pos],true) )
    ret = ParseName( strParse, pos );
    else if ( strParse[pos] == '(' )
    {
    ret = ParseExp( strParse, ++pos );
    if ( strParse[pos] != ')' )
    {
    ShowError( 2 ); // 不匹配
    ret = string();
    } // 指向'('的下一个字符
    ++pos;
    }
    else
    {
    ShowError( 1 );
    ret = string();
    }

    return ret;
    }int main()
    {
    int pos = 0;
    string strParse;

    // tests:
    string t1( " a1 + b2*c3 *(d4+e5)" ), t2( "a-(b*c-d*e)*(m+n)" ), t3( "((a+b)*(c-d)+e-f)*g + h" );
    cout << " tests: " << t1 << endl << "after Parse " << ParseExp( t1, pos ) << endl;
    pos = 0;
    cout << " tests: " << t2 << endl << "after Parse " << ParseExp( t2, pos ) << endl;
    pos = 0;
    cout << " tests: " << t3 << endl << "after Parse " << ParseExp( t3, pos ) << endl;

    // cout << "please input the string to parse:(注意在输入时读到空格或者回车为止" << endl;  
    // cin >> strParse;
    // cout << "the parsed string is :" << endl << ParseExp( strParse, pos ) << endl;
    return 0;
    }LZ记得给分,嘿嘿!