2>變量之間允許有表達式約束
使用說明:
1>用戶使用的函數爲bool CExpression::CalExp()
double m_dResult; file://計算得數
char* m_strExp; file://表達式字符串
CVarList m_VarList; file://變量表
bool m_bDegUnit; // 缺省採用角度單位
CVar var1
出錯返回false,
2>用戶使用該函數前負責初始化變量表
例如:用戶有變量a=10,b=2,c=20.其中c=a*b;
則用戶做如下工作:
CVar *pVar;
pVar=new CVar;
pVar->m_dValue=10;
pVar->m_strName="a";
CExpression exp1;
exp1.m_VarList.AddVar(pVar);
pVar=new CVar;
pVar->m_dValue=20;
pVar->m_strName="b";
exp1.m_VarList.AddVar(pVar);
pVar=new CVar;
pVar->m_dValue=0;
pVar->m_strName="c";
pVar->m_strSlave="a*b";
exp1.m_VarList.AddVar(pVar);
exp1.m_strExp="a*b+c";
exp1.CalExp();
計算出表達式的左值.*
3>被其他變量約束的變量在變量表中的位置應放在相關變量之後. */
// Expression.h: interface for the CExpression class.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_EXPRESSION_H__2578E33F_FF86_4384_A7CE_A401BAC5A010__INCLUDED_)
#define AFX_EXPRESSION_H__2578E33F_FF86_4384_A7CE_A401BAC5A010__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <list>
#include <string>
using namespace std;
#define DELIMITER 1 //分隔符
#define VARIABLE 2 //變量
#define NUMBER 3 //數值
#define FUNCTION 4 //函數
#define PI 3.1415926535898
class CVar //用來存放變量及變量值的表結構
{
public:
char m_cFlag; // 等於0爲臨時變量,否則等於1
string m_strName; //變量名 如變量a
string m_strSlave; //約束表達式,如a=b+2
double m_dValue; //變量值 如10,表a=10
public:
CVar();
virtual ~CVar();
void InitVar();
};
class CVarList
{
public:
list<CVar*> m_VarList;
CVarList();
virtual ~CVarList();
bool AddVar(CVar* pVar);
};
class CExpression
{
public:
double m_dResult;
char* m_strExp;
CVarList m_VarList;
bool m_bDegUnit; // 缺省採用角度單位
protected:
int m_iErrFlag; //標記表達式計算是否出錯0:正常,1:表達式空2:非法變量或函數3:括號不匹配
int m_iFunFlag; //標記當前正在進行函數參數計算.
int m_iMatchFlag; //標記括號是否匹配
char m_cTokenType; //標記符號的類型,如分格符,變量等
char m_strToken[80];
public:
void Message(const char * strMsg);
CExpression();
virtual ~CExpression();
bool CalExp();
bool UpdateSlaveVar();
protected:
bool GetToken();
void Error();
bool IsDelim(char c);
bool IsFunc(const char *fname);
bool IsWhite(char c);
bool IsInStr(char ch,char *s);
bool Level1(double *result);
bool Level2(double *result);
bool Level3(double *result);
bool Level4(double *result);
bool Level5(double *result);
bool Level6(double *result);
bool Level7(double *result);
bool GetFunIndex(const char *name,int *index);
void PutBack();
void Unary(char o,double *r);
bool Arith(char o, double *r, double *h);
bool Primitive(double *result);
bool GetVarValue( const char * n, double * result );
bool GetVarIndex( const char * name, int * index );
};
#endif // !defined(AFX_EXPRESSION_H__2578E33F_FF86_4384_A7CE_A401BAC5A010__INCLUDED_)