expression.cpp

来自「输入一个公式」· C++ 代码 · 共 110 行

CPP
110
字号
#include "stdafx.h"
#include "math.h"
#include "Expression.h"
#include <ctype.h>
#include "ExpressionPage.h"

///////////////////////////////////////////////////////////////////////////
//class CExpression
CExpression::CExpression()
{
}

CExpression::CExpression(int num)
{
	InitVariabileMap(num);
}

CExpression::~CExpression()
{
	DestroyVariableMap();
}

void CExpression::InitVariabileMap(int num)
{
	m_VarsMap.InitHashTable(num);
	m_expression.AtachVariables(&m_VarsMap);
}

void CExpression::DestroyVariableMap()
{
	if(m_VarsMap.GetCount()==0) return;
	POSITION pos = m_VarsMap.GetStartPosition();
	CString sName;
	CValue *pVal;
	while (pos != NULL)
	{
		m_VarsMap.GetNextAssoc (pos, sName, pVal);
		delete pVal;
	}
	m_VarsMap.RemoveAll();	
}

void CExpression::RemoveVariable(CString VarName)
{
	CValue *pVal;
	if(!m_VarsMap.Lookup(VarName,pVal)) return;
	delete pVal;
	m_VarsMap.RemoveKey(VarName);
}

//增加一个变量表达式
void CExpression::AddVariable(CString VarName, CString ExpressionValue)
{
	CExpressionBase *expresie = new CExpressionBase(&m_VarsMap);
	expresie->ChangeExpression(ExpressionValue);
	CExpValue *value = new CExpValue;
	value->SetValue(expresie);
	m_VarsMap[VarName] = value;
}

void CExpression::SetVarValue(CString VarName, CString ExpressionValue)
{
	CExpressionBase *expresie = new CExpressionBase(&m_VarsMap);
	expresie->ChangeExpression(ExpressionValue);
	CExpValue *value = (CExpValue*)(m_VarsMap[VarName]);
	value->SetValue(expresie);
}

//增加一个双精度型的变量
void CExpression::AddVariable(CString VarName, double data)
{
	CNumericValue *value = new CNumericValue;
	value->SetValue(data);
	m_VarsMap[VarName] = value;
}

void CExpression::SetVarValue(CString VarName, double data)
{
	CNumericValue *value = (CNumericValue*)(m_VarsMap[VarName]);
	if(value == NULL)return;
	value->SetValue(data);
}

int CExpression::SetExpression(CString strValue)
{
	return m_expression.ChangeExpression(strValue);
}

int CExpression::GetValue(double &value)
{
	return m_expression.Value(value);
}

CMapVariabile* CExpression::GetVarMap()
{
	return &m_VarsMap;
}

int CExpression::EditExpression(CString &sExpression)
{
	CPropertySheet sheet(IDS_STRING_Title);;
	CExpressionPage page;
	page.pVariable=&m_VarsMap;
	page.sExpression=sExpression;
	sheet.AddPage(&page);
	if(sheet.DoModal()!=IDOK)return 0;
	sExpression=page.sExpression;
	return 1;
}

⌨️ 快捷键说明

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