📄 gisexpression.h
字号:
//gisExpression.h
#ifndef __EXPRESSION_DOT_H__
#define __EXPRESSION_DOT_H__
#include <tchar.h>
#include "OperPri.h"
#include "varlist.h"
#include <vector>
using namespace std;
//
enum{ MAX_PRI = 100, MAX_BUF = 80, MAX_BUF_EXP = 4096 };
//显示
enum SHOW_TYPE{
SE_MIDFIX = 1, SE_POSTFIX = 2
};
//一个段的表示
class CSegment
{
public:
CSegment();
CSegment(const TCHAR* str);
CSegment(const CSegment& rg);
CSegment& operator=(const CSegment& rg);
TCHAR name[MAX_BUF];
};
//表达式
class CGisExpression
{
static const TCHAR SEPARATOR;
static const TCHAR TEMP_VAR_HEAD;//临时变量的头,在这里为'_'
public:
CGisExpression(BOOL bPostfix = FALSE);
CGisExpression(const TCHAR* szExp, BOOL bPostfix = FALSE);
CGisExpression(const CGisExpression& exp);
~CGisExpression();
// operator
CGisExpression& operator=(const CGisExpression& right);
CGisExpression& operator=(const TCHAR* szExp);
// functions
void SetExpression(const TCHAR* szExp, BOOL bPostfix = FALSE);
void ShowExpression(int flag = SE_MIDFIX);
//计算
int VerifyExpression(int* pRet = NULL);//检查表达式是否合法,合法返回非0
int MidToPostfix();//中缀式转换为后缀式,成功返回非0
int Calculate(double* pf);//计算表达式的值
//为表达式添加变量
int AddVar(const CVarType& var);
int AddVar(CVarType* pVarList, int iCnt = 1);
BOOL SetVar(const CVarType& vt);
int DelVar(const TCHAR* var);
int DelAllVar();
//
int FindVar(const TCHAR* var);
int GetVarValue(const TCHAR* var, double *pRet);
int SetVarValue(const TCHAR* var, double f);
private:
//
int IsOperator(TCHAR ch);//判断是否是操作符
int IsOperator(const TCHAR* str);
int GetOperatorPri(const TCHAR* str);
int GetOperatorOb(const TCHAR* str, COpPri& op);
int GetIderCount();//取得标识符个数;
LPTSTR StrCat(LPTSTR str, TCHAR ch);
int Divide(TCHAR* dest, int len, int pos = 0);
private:
//产生临时变量
/*
临时变量由 ‘__’ + ‘当前的时间(200604071034008)’ + ‘一个10000以内的随机数构成’,
判断是否为系统临时变量只需要判断变量头两个字符是否全为下画线(_)即可。
显然,用户自定义变量不能以两个下画线打头。
*/
BOOL MakeTempVar(CVarType& vartemp);
int IsTempVar(const CVarType& var);//判断是否为临时变量
int IsTempVar(const TCHAR* var);
private:
void Free();
void SetPRI();
private:
TCHAR* m_pExp;
BOOL m_bPostfix;//是否为后缀式(此参数没有用处)
vector<CVarType> m_varList;
private://辅助参数
int m_iOperator;//操作符种类数
COpPri m_pPri[MAX_PRI];
vector<CSegment> m_postfix;
};
#endif //__EXPRESSION_DOT_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -