?? 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 + -