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

📄 stringresolution.cpp

📁 表达式计算器。表达式中只能有圆括号、函数名、运算符、常数与变量。一、变量名的命名规则:1、可以是字符、或字符串 2、不能以数字开头 3、不能夹杂有空格、运算符或标点符号
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -