⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stringresolution.cpp

📁 vc编程实现bp神经网络
💻 CPP
📖 第 1 页 / 共 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]=='.')//如果是小数点,返回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 + -