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

📄 calexpression.h

📁 计算机器程序~ 附带词法分析~
💻 H
字号:
#include "stack.h"
#include "CompareTable.h"
#include "SyntaxAnalyse.h"



class  CalExpression
{
public:
	CalExpression(char* Expression);
	int GetValueType();
	int GetIntResult();
	double GetDoubleResult();
	bool GetResult();
	int Calculate();
protected:
	int Operate(char Operator,int Fir,int Sec);
	double Operate(char Operator,double Fir,double Sec);
protected:

	PriorityTable  MyTable;
	WordAnalyse MyWords;
	SyntaxAnalyse MySyntax;
protected:
	bool bResult;
	int nResult;
	double dResult;
	int ValueType;
};

CalExpression::CalExpression(char* Expression):MyWords(Expression)
{
	bResult = false;
	nResult = 0;
	dResult = 0;
	ValueType = -1;
}

bool CalExpression::GetResult()
{
	return bResult;
}


int CalExpression::GetValueType()
{
	return ValueType;
}


int CalExpression::Operate(char Operator,int Fir,int Sec)
{
	switch (Operator)
	{
	case '+':
		return Fir+Sec;
	case '-':
		return Fir - Sec;
	case '*':
		return Fir * Sec;
	case '/':
		return Fir/Sec;
	}
	return 0;
}

double CalExpression::Operate(char Operator,double Fir,double Sec)
{
	switch (Operator)
	{
	case '+':
		return Fir+Sec;
	case '-':
		return Fir - Sec;
	case '*':
		return Fir * Sec;
	case '/':
		return Fir/Sec;
	}
	return 0;
}

int CalExpression::GetIntResult()
{
	return nResult;
}

double CalExpression::GetDoubleResult()
{
	return dResult;
}

int CalExpression::Calculate()
{
	bResult = false;
	nResult = 0;
	dResult = 0;
	ValueType = -1;

	if(!MySyntax.Analyse(&MyWords))
		return ValueType = -1;
	if(MyWords.TypeIsDouble())
	{
		CStack<char> CharStack;
		CStack<double>  ValueStack;

		CharStack.Push('#');
		
		int WordIndex = 0;
		
		char top;
		CharStack.GetTop(top);
		while(!(strcmp(MyWords.GetWord(WordIndex),"#") == 0 && top == '#'))
		{
			if(MyWords.GetWordAttribute(WordIndex) != 2)
			{
				double Value = atof(MyWords.GetWord(WordIndex));
				ValueStack.Push(Value);
				WordIndex ++;
				
			}
			else
			{
				switch (MyTable.Compare(top,(MyWords.GetWord(WordIndex))[0]))
				{
				case -1:
					CharStack.Push((MyWords.GetWord(WordIndex))[0]);
					WordIndex ++;
					break;
				case 0:
					CharStack.Pop(top);
					WordIndex ++;
					break;
				case 1:
					{
						double nFirNum ,nSecNum, nResult;
						char Operator;
						ValueStack.Pop(nSecNum);
						ValueStack.Pop(nFirNum);
						CharStack.Pop(Operator);
						nResult = Operate(Operator,nFirNum,nSecNum);
						ValueStack.Push(nResult);
						break;
					}
				default	:
					break;
				}
			}
			
			
			CharStack.GetTop(top);
		}

		ValueStack.GetTop(dResult );
		ValueType = 1;
		return 1;
	}
	else
	{
		CStack<char> CharStack;
		CStack<int>  ValueStack;
		
		CharStack.Push('#');
		
		int WordIndex = 0;
		
		char top;
		CharStack.GetTop(top);
		while(!(strcmp(MyWords.GetWord(WordIndex),"#") == 0 && top == '#'))
		{
			if(MyWords.GetWordAttribute(WordIndex) != 2)
			{
				int Value = atoi(MyWords.GetWord(WordIndex));
				ValueStack.Push(Value);
				WordIndex ++;
				
			}
			else
			{
				switch (MyTable.Compare(top,(MyWords.GetWord(WordIndex))[0]))
				{
				case -1:
					CharStack.Push((MyWords.GetWord(WordIndex))[0]);
					WordIndex ++;
					break;
				case 0:
					CharStack.Pop(top);
					WordIndex ++;
					break;
				case 1:
					{
						int nFirNum ,nSecNum,nResult;
						char Operator;
						ValueStack.Pop(nSecNum);
						ValueStack.Pop(nFirNum);
						CharStack.Pop(Operator);
						nResult = Operate(Operator,nFirNum,nSecNum);
						ValueStack.Push(nResult);
						break;
					}
				default	:
					break;
				}
			}
			
			
			CharStack.GetTop(top);
		}

		ValueStack.GetTop(nResult );
		ValueType = 0;
		return 0;

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -