表达式求值(上)

类别:VC语言 点击:0 评论:0 推荐:
/*  功能:计算包含变量及函数的表达式
     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.

//

//////////////////////////////////////////////////////////////////////

 

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

 

本文地址:http://com.8s8s.com/it/it1403.htm