📄 stringresolution.cpp
字号:
COperator* op=new COperator;
op->m_level=level;
op->m_operator=string.Mid(i,1);
op->m_startIndex=i;
if(i==0||string[i-1]=='#')
op->m_type=UNARY;
else
op->m_type=BINARY;
Operator.push(op);
string.SetAt(i,'@');
i++;
}
else if(string[i]=='*'||string[i]=='/')
{
COperator* op=new COperator;
op->m_level=level+1;
op->m_operator=string.Mid(i,1);
op->m_startIndex=i;
op->m_type=BINARY;
Operator.push(op);
string.SetAt(i,'@');
i++;
}
else if(string[i]=='^')
{
COperator* op=new COperator;
op->m_level=level+2;
op->m_operator=string.Mid(i,1);
op->m_startIndex=i;
op->m_type=BINARY;
Operator.push(op);
string.SetAt(i,'@');
i++;
}
else if(string.Mid(i,4)=="sqrt")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="sqrt";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');string.SetAt(i+3,'@');
i+=3;
}
else if(string.Mid(i,3)=="log")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="log";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');
i+=3;
}
else if(string.Mid(i,3)=="sin")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="sin";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');
i+=3;
}
else if(string.Mid(i,3)=="cos")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="cos";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');
i+=3;
}
else if(string.Mid(i,3)=="tan")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="tan";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');
i+=3;
}
else if(string.Mid(i,3)=="cot")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="cot";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');
i+=3;
}
else if(string.Mid(i,4)=="asin")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="asin";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');string.SetAt(i+3,'@');
i+=3;
}
else if(string.Mid(i,4)=="acos")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="acos";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');string.SetAt(i+3,'@');
i+=3;
}
else if(string.Mid(i,4)=="atan")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="atan";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');string.SetAt(i+2,'@');string.SetAt(i+3,'@');
i+=3;
}
else
i++;
}
return bRet;
}
BOOL CStringResolution::GetOperandStack(OperandStack &Oprand, CString &string)
{
int i=0;
int num=string.GetLength();
while(i<num)
{
if(string[i]=='#'||string[i]=='@')
i++;
else
{
COperand * oprand=new COperand;
if(isdigit(string[i]))
oprand->m_IsConst=TRUE;
oprand->m_startIndex=i;
BOOL HasPoint=FALSE;
while(i<num&&string[i]!='#'&&string[i]!='@')
{
if(string[i]=='.')
{
if(HasPoint)
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(11,TRUE,"There are more than one point continuously!");
#endif
return FALSE;
}
else
HasPoint=TRUE;
}
if(oprand->m_IsConst&&!isdigit(string[i])&&(string[i]!='.'))
{
CString s;
s.Format("Variant cann't start with digital (%d in expression)!",i+1-oprand->m_name.GetLength());
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(11,TRUE,s);
#endif
return FALSE;
}
oprand->m_name+=string.Mid(i,1);
i++;
}
Oprand.push(oprand);
}
}
return TRUE;
}
int CStringResolution::GetErrorNumber()
{
#ifdef _ERROR_INFO_H_
GET_ERROR_NUMBER
#else
return 0;
#endif
}
double CStringResolution::computing(const COperator*op,const COperand*oprand)
{
double x=atof(oprand->m_name);
if(op->m_operator=="-")
{
x=-x;
}
else if(op->m_operator=="log")
{
if(x>0)
x=log(x);
else
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(4,oprand->m_IsConst,"log function exception. Argument domain error.");
#endif
x=BIGNUMBER;
}
}
else if(op->m_operator=="sqrt")
{
if(x>=0)
x=sqrt(x);
else
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(5,oprand->m_IsConst,"Negative has no square root!");
#endif
x=BIGNUMBER;
}
}
else if(op->m_operator=="sin")
x=sin(x);
else if(op->m_operator=="cos")
x=cos(x);
else if(op->m_operator=="tan")
{
x=tan(x);
#ifdef _ERROR_INFO_H_
_CLEAR_ERROR(oprand->m_IsConst);
#endif
}
else if(op->m_operator=="cot")
{
if(fabs(sin(x))>DERROR)
x=cos(x)/sin(x);
else
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(7,oprand->m_IsConst,"Cotangent fonction exception!");
#endif
x=BIGNUMBER;
}
}
else if(op->m_operator=="asin")
{
x=asin(x);
#ifdef _ERROR_INFO_H_
_CLEAR_ERROR(oprand->m_IsConst);
#endif
}
else if(op->m_operator=="acos")
{
x=acos(x);
#ifdef _ERROR_INFO_H_
_CLEAR_ERROR(oprand->m_IsConst);
#endif
}
else if(op->m_operator=="atan")
x=atan(x);
return x;
}
double CStringResolution::computing(const COperator*op,const COperand*Loprand,const COperand*Roprand)
{
double x=BIGNUMBER;
switch(op->m_operator[0])
{
case '+':
x=atof(Loprand->m_name)+atof(Roprand->m_name);
break;
case '-':
x=atof(Loprand->m_name)-atof(Roprand->m_name);
break;
case '*':
x=atof(Loprand->m_name)*atof(Roprand->m_name);
break;
case '/':
{
double y=atof(Roprand->m_name);
x=atof(Loprand->m_name);
if(fabs(y)>DERROR)
x=x/y;
else
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(9,Roprand->m_IsConst,"Divisor is zero!");
#endif
x=BIGNUMBER;
}
}
break;
case '^':
{
double y=atof(Roprand->m_name);
x=atof(Loprand->m_name);
x=pow(x,y);
#ifdef _ERROR_INFO_H_
_CLEAR_ERROR(Roprand->m_IsConst);
#endif
}
break;
}
return x;
}
CString CStringResolution::GetDigitalString(double* variantValue,int num)
{
CString value=m_formula;
if(num>=m_oprandANum)
{
int i,j;
CString* ppchar;
ppchar=new CString[m_oprandNum+1];
for(i=0;i<=m_oprandNum;i++)
{
if(i==0)
ppchar[0]=m_formula.Left(m_oprand[0].m_startIndex);
else if(i<m_oprandNum)
{
WORD start=m_oprand[i-1].m_startIndex+m_oprand[i-1].m_name.GetLength();
WORD length=m_oprand[i].m_startIndex-start;
ppchar[i]=m_formula.Mid(start,length);
}
else
{
WORD start=m_oprand[i-1].m_startIndex+m_oprand[i-1].m_name.GetLength();
ppchar[i]=m_formula.Mid(start);
}
}
CString* digitchar=new CString[m_oprandNum];
for(i=0;i<m_oprandNum;i++)
{
if(m_oprand[i].m_IsConst)
digitchar[i]=m_oprand[i].m_name;
else
{
for(j=0;j<m_oprandANum;j++)
{
if(m_oprand[i]==m_oprandA[j])
{
if(variantValue[j]<0)
digitchar[i].Format("(%g)",variantValue[j]);
else
digitchar[i].Format("%g",variantValue[j]);
}
}
}
}
value=ppchar[0];
for(i=0;i<m_oprandNum;i++)
value+=digitchar[i]+ppchar[i+1];
delete[]ppchar;
delete[]digitchar;
}
return value;
}
BOOL CStringResolution::ExpressionIsError()
{
#ifndef _ERROR_INFO_H_
return 0;
#else
GET_EXPRESSION_ERROR
#endif
}
const COperand* CStringResolution::GetVariantTable()
{
return m_oprandA;
}
COperator::COperator():m_startIndex(0),m_level(0),m_type(BINARY)
{
}
COperator::~COperator()
{
}
COperand::COperand():m_startIndex(0)
{
m_IsConst=FALSE;
}
COperand::~COperand()
{
}
BOOL COperand::operator ==(const COperand & od)
{
BOOL bRet=TRUE;
bRet=(m_IsConst==od.m_IsConst);
bRet=(bRet&&(m_name==od.m_name));
return bRet;
}
void CStringResolution::Destroy()
{
if(m_operator)
{
delete[]m_operator;
m_operator=0;
}
if(m_oprand)
{
delete[]m_oprand;
m_oprand=0;
}
if(m_oprandA)
{
delete[]m_oprandA;
m_oprandA=0;
}
m_oprandNum=0,m_oprandANum=0,m_operatorNum=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -