📄 stringresolution.cpp
字号:
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]=='.')//如果是小数点,返回TURE
{
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;//显示变量的开始不能是数字,后面可以是。例如不能是2a,可以是a2。
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个开始去每次取一个字符
i++;
}
Oprand.push(oprand);//压入一个操作数例如这样可以把SINA压栈
}
}
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=="ln")//因为在VC里log表是E为底的对数
{
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=="log")
{
if(x>0)
x=log10(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=="sign")
{
if(x>=0)
x=1;
else
x=-1;
}
else if(op->m_operator=="fabs")
{
if(x>=0)
x=x;
else
x=-x;
}
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=="exp")
x=exp(x);
else if(op->m_operator=="net")//这里是对我自定义的函数的计算区*********
{
//到此段最后应该用X来接收输出的结果
extern CString s[10];//引用了全局变量 s.
extern double zdh[20];//??????????????最后得把这些全局变量清空****
extern int i;
int y=(int) x-1;
m_strSimuNetworkFold=s[y];
s[y]=" "; //把全局变量赋初值,我觉得没必要清0。防止一个地址被用多次。
// int y=i;// 测试用
// x=zdh[2];// 测试用
// 装载网络参数文件
m_matrixSimuNetwork.LoadDataFromFileSpecial(m_strSimuNetworkFold,//用这个名字来接收路径
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerValveValue,
m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_nComboArithmetic,
m_nComboFunc);//这个函数已经成功取数
if( i!= m_nInputLayerNumber )
{
// ::MessageBox (this->m_hWnd, _T("待仿真数据文件的输入层数目与网络中的输入层数目不相等!!!"), _T("错误!"), MB_OK | MB_ICONERROR);
// 释放全局变量所占的内存
m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
for(int n=0;n<i;n++)//把全局变量赋初值zdh和i赋初值0
{
zdh[n]=(double)0;
}
i=0;
//***************************
return false;
}
else // Successful!!!
{
// 装载变量数据
m_matrixDemoDataInput.m_nRow=1;//为了我下面能利用行数和列数,我把m_nRow和m_nCol在定义时改为public型了
m_matrixDemoDataInput.m_nCol=i;
// m_matrixOutputLayerOutput.m_nRow=1;
// m_matrixOutputLayerOutput.m_nCol=1;
m_matrixDemoDataInput.m_pTMatrix.resize(1);
m_matrixDemoDataInput.m_pTMatrix[0].resize(i);
// m_matrixOutputLayerOutput.m_pTMatrix.resize(1);
// m_matrixOutputLayerOutput.m_pTMatrix[0].resize(1);
for(int j=0;j<i;j++)
{
m_matrixDemoDataInput.m_pTMatrix[0][j]=zdh[j]; //给矩阵赋值
}
// 前向计算
switch(m_nComboArithmetic)
{
case 0: // LM Arithmetic Selected
LMForwardCalculate( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
1, //表示仿真的标志位,置1是处于仿真状态
m_nComboFunc,
m_matrixDemoDataInput, //测试数据的输入
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
case 1: // BP Arithmetic Selected
BPForwardCalculate2(m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
1,
m_nComboFunc,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
default: // No Arithmetic Selected
return false;
}
// 用X来返回模拟结果
x=m_matrixOutputLayerOutput.m_pTMatrix[0][0];
// 释放全局变量所占的内
m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
for(int jj=0;jj<i;jj++)
{
m_matrixDemoDataInput.m_pTMatrix[0][jj]=(double) 0; //给矩阵初始化为0
}
m_matrixHideLayerOutput.InitializeZero ();
m_matrixOutputLayerOutput.m_pTMatrix[0][0]=(double) 0;
m_nComboFunc = -1;
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
for(int n=0;n<i;n++)//把全局变量赋初值
{
zdh[n]=(double)0;
}
i=0;
}
}//******************************************************************
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;
extern double zdh[20];//zdh
extern int i; //zdh
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;
case ',':
{
zdh[i]=atof(Loprand->m_name);
x=atof(Roprand->m_name);
i++;
}
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 + -