📄 stringresolution.cpp
字号:
// StringResolution.cpp: implementation of the CStringResolution class.
#include "stdafx.h"
#include "StringResolution.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#ifdef _ERROR_INFO_H_
BEGIN_CATCH_MATH_ERROR
_BEGIN_GET_TYPE
GET_ERROR_TYPE(_DOMAIN,BIGNUMBER,Argument domain error.)
GET_ERROR_TYPE(_SING,BIGNUMBER,Argument singularity.)
GET_ERROR_TYPE(_OVERFLOW,BIGNUMBER,Overflow range error.)
GET_ERROR_TYPE(_UNDERFLOW,0,Underflow range error.)
GET_ERROR_TYPE(_TLOSS,0,Total loss of precision.)
GET_ERROR_TYPE(_PLOSS,0,Partial loss of precision.)
_END_GET_TYPE
GET_ERROR_FUNCTION(pow,power function exception. )
GET_ERROR_FUNCTION(tan,tangent function exception. )
GET_ERROR_FUNCTION(asin,arcsine function exception. )
GET_ERROR_FUNCTION(acos,arccosine function exception. )
END_CATCH_MATH_ERROR
IMPLEMENT_CATCH_ERROR(CStringResolution)
#endif
CStringResolution::CStringResolution(char*formula)
:m_oprandNum(0),m_oprandANum(0),m_operatorNum(0)
{
m_operator=0;
m_oprand=0;
m_oprandA=0;
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(0,FALSE,"Good");
#endif
if(formula)
{
m_formula=formula;
Initialize();
}
}
CStringResolution::~CStringResolution()
{
if(m_operator)
delete[]m_operator;
if(m_oprand)
delete[]m_oprand;
if(m_oprandA)
delete[]m_oprandA;
}
void CStringResolution::SetFormula(char *formula)//初始化一些参数
{
if(!formula)
return;
m_formula=formula;
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;
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(0,FALSE,"Good!");
#endif
Initialize();
}
//对符号栈进行检查
int CStringResolution::IsFormula()
{
int bRet=0;
stack<char> charStack;
int i,num=m_formula.GetLength();
char notChar[]={';','\'','[',']','{','}','\\','|','\"','=','&','%','$','@','#','!','`','~','?'};
int notNum=sizeof notChar;//这里是上面的符号的数量
//zdh对表达式中进行检查看有无上面的符号
for(i=0;i<num;i++)
{
for(int j=0;j<notNum;j++)
{
if(m_formula[i]==notChar[j])
{
CString s;
s.Format("The %dth character,\"%c\" is invalidated!",i+1,m_formula[i]);//指出那个字符不合法
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(-i-1,TRUE,s);
#endif
return -i-1;//the ith symbol is invalidating.
}
}
}
//zdh处理括号的匹配
for(i=0;i<num;i++)
{
if(m_formula[i]=='(')//左括号压栈
charStack.push('(');
if(m_formula[i]==')')
{
if(charStack.empty())
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(1,TRUE,"There are some more right brackets!");
#endif
return 1;//right bracket if more.
}
else
charStack.pop();//消去一对括号
}
}
if(!charStack.empty())
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(2,TRUE,"There are some more left brackets!");
#endif
return 2;//left bracket is more.
}
return bRet;
}
BOOL CStringResolution::GetStack(OperatorStack &Operator, OperandStack &Oprand)
{
if(IsFormula())
return FALSE;//illogicality return
BOOL bRet=TRUE;
EmptyStack(Operator);
EmptyStack(Oprand);
CString string=m_formula;
bRet=bRet&&GetOperatorStack(Operator,string);//?????
bRet=bRet&&GetOperandStack(Oprand,string);//????????
return bRet;
}
//将两个栈清空初始化
BOOL CStringResolution::Initialize()
{
BOOL bRet=FALSE;
OperatorStack Op; //定义两个栈
OperandStack Od;
bRet=GetStack(Op,Od);
if(!bRet)
{
EmptyStack(Op);
EmptyStack(Od);
return FALSE;
}
m_oprandNum=Od.size(),m_operatorNum=Op.size();//发现中间用逗号和用分号是相同的效果?必须要这行
if(m_operatorNum)
m_operator=new COperator[m_operatorNum];
if(m_oprandNum)
m_oprand=new COperand[m_oprandNum];
int i;
for(i=0;i<m_operatorNum;i++)
{
COperator*op=Op.top();
m_operator[m_operatorNum-i-1]=*op;
Op.pop();
delete op;
}
for(i=0;i<m_oprandNum;i++)
{
COperand*od=Od.top();
m_oprand[m_oprandNum-i-1]=*od;
Od.pop();
delete od;
}
m_oprandA=new COperand[m_oprandNum];
BOOL IsIn=FALSE;
for(i=0;i<m_oprandNum;i++)
{
for(int j=0;j<m_oprandANum;j++)
{
if(m_oprand[i]==m_oprandA[j])//操作数等于变量时
{
IsIn=TRUE;
break;
}
}
if(!IsIn&&!m_oprand[i].m_IsConst)//指向操作数的指针不是数字时压入变量数组
{
m_oprandA[m_oprandANum]=m_oprand[i];
m_oprandANum++;//??????????????????????????????
}
IsIn=FALSE;
}
return TRUE;
}
//下面是整个运算过程,中间调用了computing函数进行运算…………………………………
double CStringResolution::Computer(OperatorStack &Operator, OperandStack &Oprand)
{
double value =0.0;
if(Operator.empty())//操作符栈为空
{
if(Oprand.size()==1)//操作数栈只剩一个数值
{
COperand* od=Oprand.top();
value=atof(od->m_name);//将字符转为相应的数值
delete od;
return value;
}
else
{
while(!Oprand.empty())
{
COperand*od=Oprand.top();
Oprand.pop();
delete od;
}
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(12,TRUE,"Oprand is less or more!");
#endif
return BIGNUMBER;
}
}
OperatorStack tmpOO;
OperandStack tmpOD;
COperator* op=0,*op1=0;
COperand *oprand=0,*oprand1=0;
op=Operator.top();
Operator.pop();
if(!Operator.empty())
op1=Operator.top();
while(op1&&(op1->m_level>op->m_level))
{
tmpOO.push(op);
if(op->m_type==BINARY)
{
if(!Oprand.empty())
{
oprand=Oprand.top();
Oprand.pop();
tmpOD.push(oprand);
}
}
op=op1;
Operator.pop();
if(!Operator.empty())
op1=Operator.top();
else
op1=0;
}
if(op->m_type==UNARY)
{
if(Oprand.empty())
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(12,TRUE,"Oprand is less!");
#endif
return BIGNUMBER;
}
oprand=Oprand.top();
double x=computing(op,oprand);
oprand->m_name.Format("%g",x);
}
else
{
if(Oprand.empty())
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(12,TRUE,"Oprand less!");
#endif
return BIGNUMBER;
}
oprand1=Oprand.top();
Oprand.pop();
if(Oprand.empty())
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(12,TRUE,"Oprand less!");
#endif
return BIGNUMBER;
}
oprand=Oprand.top();
double x=computing(op,oprand1,oprand);//有两个运算数栈其中是用oprand1取出oprand的栈顶元素
oprand->m_name.Format("%g",x);
delete oprand1;
}
delete op;
while(!tmpOO.empty())
{
op=tmpOO.top();
tmpOO.pop();
Operator.push(op);
}
while(!tmpOD.empty())
{
oprand=tmpOD.top();
tmpOD.pop();
Oprand.push(oprand);
}
return Computer(Operator,Oprand);
}
//……………………………………………………………………………………………
double CStringResolution::computer(double variantValue[], int num)
{
#ifdef _ERROR_INFO_H_
PROCESSION_ERROR
#endif
double value=0.0;
int i;
if(num<m_oprandANum)
{
#ifdef _ERROR_INFO_H_
_SAVE_ERROR_INFO(10,FALSE,"There are less digital number than variants");
#endif
return BIGNUMBER;
}
OperatorStack Operator;
OperandStack Oprand;
for(i=0;i<m_operatorNum;i++)//把所有的操作符压栈
{
COperator*op=new COperator;
*op=m_operator[m_operatorNum-i-1];
Operator.push(op);
}
for(i=0;i<m_oprandNum;i++)//把所有的操作数压栈int m_oprandNum表operand number
{
COperand*od=new COperand; //int m_oprandANum表variant number
*od=m_oprand[m_oprandNum-i-1]; //int m_operatorNum表operator number
for(int j=0;j<m_oprandANum;j++) //COperand*m_oprand表pointer points to operands set
if(*od==m_oprandA[j]) //COperand*m_oprandA表pointer points to variants set
{
od->m_name.Format("%g",variantValue[j]);//传递对应的data[]中的数值
}
Oprand.push(od);
}
value=Computer(Operator,Oprand);//调用Computer进行运算
return value;
}
CString CStringResolution::GetErrorInformation()
{
CString value;
#ifndef _ERROR_INFO_H_
value="There is no error information.";
#else
GET_ERROR_INFORMATION(value)
#endif
return value;
}
//清空操作符栈
BOOL CStringResolution::EmptyStack(OperatorStack Op)
{
while(!Op.empty())
{
COperator*op=Op.top();
Op.pop();
delete op;
}
return TRUE;
}
//清空操作数栈
BOOL CStringResolution::EmptyStack(OperandStack Od)
{
while(!Od.empty())
{
COperand*od=Od.top();
Od.pop();
delete od;
}
return TRUE;
}
//zdh重新扫描接收的字符串建立操作符栈()+ - , * / ^ sqrt net ln fabs sign exp log 和三角及反三角函数
BOOL CStringResolution::GetOperatorStack(OperatorStack &Operator, CString &string)
{
BOOL bRet=TRUE;
int num=string.GetLength();
int i=0;
int level=0;
while(i<num)
{
if(string[i]=='(')
{
level+=LEVELS;
string.SetAt(i,'#');
i++;
}
else if(string[i]==')')
{
level-=LEVELS;
string.SetAt(i,'@');
i++;
}
else if(string[i]=='+'||string[i]=='-'||string[i]==',')
{
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,3)=="net") //给神经网络定义的函数
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="net";
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)=="sign")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="sign";
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)=="exp")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="exp";
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)=="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,4)=="fabs")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="fabs";
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)=="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,2)=="ln")
{
COperator* op=new COperator;
op->m_level=3+level;
op->m_operator="ln";
op->m_startIndex=i;
op->m_type=UNARY;
Operator.push(op);
string.SetAt(i,'@');string.SetAt(i+1,'@');
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,'@');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -