表达式求值(上) (转)

表达式求值(上) (转)[@more@]/*  功能:计算包含变量及 函数表达式
  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

#include

 

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 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_)

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-963487/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-963487/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值