• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

表达式求值(上)

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 15次 | 进入软件测试论坛讨论

领测软件测试网 /*  功能:计算包含变量及函数的表达式
     2>变量之间允许有表达式约束 
使用说明:
 1>用户使用的函数为bool CExpression::CalExp()
 double m_dResult; 算得数
 char* m_strExp;  达式字符串
 CVarList  m_VarList; 量表
 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_)

 


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网