请问一下将一般的数据公式去掉扩号的公式怎么写。
例如: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
例如: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
按下面搞就可以了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
解析成: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这个你自己不是解析出来了
不过算法比较复杂倒是真的.
不过也别去整那些高深的东西了,直接调用EXCEL对象就可以处理数学表达式了.
比如,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)这样的,)和(两个符号直接相连,要根据中间的运算符又有不同的运算关系。主要是要理清优先关系。
以上愚见,莫笑。
我有C++代码,LZ觉得怎么样?
#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记得给分,嘿嘿!