亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gisexpression.cpp

?? 此程序實現了表達式求值
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//gisExpression.cpp

#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <time.h>
#include "gisExpression.h"
#include "tstack.h"
#include "stod.h"

////////////////////////////////////////////////////////////////////////////
// CSegment
CSegment::CSegment()
{
	lstrcpy(name, _T(""));
}

CSegment::CSegment(const TCHAR* str)
{
	if(str != NULL)
		lstrcpy(name, str);
}
CSegment::CSegment(const CSegment& rg)
{
	lstrcpy(name, rg.name);
}
CSegment& CSegment::operator=(const CSegment& rg)
{
	if(this == &rg)
		return *this;
	lstrcpy(name, rg.name);
	return *this;
}

////////////////////////////////////////////////////////////////////////////
// CGisExpression
const TCHAR CGisExpression::SEPARATOR = _T('#');
const TCHAR CGisExpression::TEMP_VAR_HEAD = _T('_');

CGisExpression::CGisExpression(BOOL bPostfix/*=FALSE*/)
 : m_pExp(NULL), m_iOperator(0), m_bPostfix(bPostfix)
{
	m_varList.clear();
	m_postfix.clear();

	//生成隨機數種子
	srand((unsigned int)time(NULL));
}

CGisExpression::CGisExpression(const TCHAR* szExp, BOOL bPostfix/*=FALSE*/)
{
	m_varList.clear();
	m_postfix.clear();

	m_pExp = NULL;
	m_pExp = new TCHAR[lstrlen(szExp) + 1];
	assert(m_pExp != NULL);

	m_bPostfix = bPostfix;
	lstrcpy(m_pExp, szExp);
	SetPRI();

	//生成隨機數種子
	srand((unsigned int)time(NULL));
}

CGisExpression::CGisExpression(const CGisExpression& exp)
{
	m_pExp = NULL;
	m_pExp = new TCHAR[lstrlen(exp.m_pExp) + 1];
	assert(m_pExp != NULL);

	lstrcpy(m_pExp, exp.m_pExp);
	m_iOperator = exp.m_iOperator;
	for(int i = 0; i < m_iOperator; i++)
	{
		m_pPri[i] = exp.m_pPri[i];
	}
	m_bPostfix = exp.m_bPostfix;
	m_varList = exp.m_varList;
	m_postfix = exp.m_postfix;

	//生成隨機數種子
	srand((unsigned int)time(NULL));
}

CGisExpression::~CGisExpression()
{
	Free();
}

//operator
CGisExpression& CGisExpression::operator =(const CGisExpression& right)
{
	if(this == &right)
		return *this;

	Free();
	m_pExp = new TCHAR[lstrlen(right.m_pExp) + 1];
	assert(m_pExp != NULL);

	lstrcpy(m_pExp, right.m_pExp);
	m_iOperator = right.m_iOperator;
	for(int i = 0; i < m_iOperator; i++)
	{
		m_pPri[i] = right.m_pPri[i];
	}
	m_bPostfix = right.m_bPostfix;
	m_varList = right.m_varList;
	m_postfix = right.m_postfix;

	return *this;
}

CGisExpression& CGisExpression::operator =(const TCHAR* szExp)
{
	Free();
	m_pExp = new TCHAR[lstrlen(szExp) + 1];
	assert(m_pExp != NULL);

	lstrcpy(m_pExp, szExp);
	SetPRI();

	m_bPostfix = FALSE;//

	return *this;
}

// functions
void CGisExpression::Free()
{
	m_varList.clear();
	m_postfix.clear();
	delete m_pExp;
	m_pExp = NULL;
}

/*
	設置表達式
*/
void CGisExpression::SetExpression(const TCHAR* szExp, BOOL bPostfix/*=FALSE*/)
{
	m_bPostfix = bPostfix;

	if(szExp != NULL)
	{
		SetPRI();

		Free();
		m_pExp = new TCHAR[lstrlen(szExp) + 1];
		assert(m_pExp != NULL);

		lstrcpy(m_pExp, szExp);
	}
}

/*
	添加變量
	返回值:
		0 - 成功
		-1 - 已經存在此變量
*/
int CGisExpression::AddVar(const CVarType& var)
{
	if(FindVar(var.name) >= 0)
		return -1;

	m_varList.push_back(var);
	return 0;
}

/*
	向表達式添加變量 - 如果有重復的變量則跳過
	返回值:
		0 - 成功
*/
int CGisExpression::AddVar(CVarType* pVarList, int iCnt/*=1*/)
{
	assert(pVarList != NULL);

	for(int i = 0; i < iCnt; i++)
	{
		if(FindVar(pVarList[i].name) < 0)
			m_varList.push_back(pVarList[i]);
	}

	return 0;
}

/*
	設置變量
		非0 - 成功
*/
BOOL CGisExpression::SetVar(const CVarType& vt)
{
	BOOL ret = FALSE;
	vector<CVarType>::iterator it;

	for(it = m_varList.begin(); it != m_varList.end(); it++)
	{
		if(0 == lstrcmp((*it).name, vt.name))
		{
			(*it) = vt;
			ret = TRUE;
		}
	}

	return ret;
}

/*
	取得變量的值
	返回值
		=0 - 成功
		-1 - 變量不存在
*/
int CGisExpression::GetVarValue(const TCHAR* var, double* pRet)
{
	assert(pRet != NULL);
	//判斷是否為數字
	if(StringTest(var))
	{
		*pRet = (double)atod(var, NULL);
	}
	else//如果不是數字則當作變量,則應在變量列表中去查找變量的值
	{
		int i = FindVar(var);
		if(i < 0)
		{
			*pRet = 0.0;
			return -1;
		}
		*pRet = m_varList[i].GetValue();
	}

	return 0;	
}

/*
	返回值同上GetVarValue
*/
int CGisExpression::SetVarValue(const TCHAR* var, double f)
{
	int i = FindVar(var);
	if(i < 0)
		return -1;
	m_varList[i].fValue = f;
	m_varList[i].type = VAR_FLOAT;

	return 0;
}

/*
	刪除一個變量
		總是返回0
*/
int CGisExpression::DelVar(const TCHAR* var)
{
	vector<CVarType>::iterator it;

	for(it = m_varList.begin(); it != m_varList.end(); it++)
	{
		if(0 == lstrcmp((*it).name, var))
			m_varList.erase(it);
	}

	return 0;
}

/*
	刪除所有變量
	返回值:
		總是返回0
*/
int CGisExpression::DelAllVar()
{
	m_varList.clear();

	return 0;
}

/*
	查找變量
		成功返回索引
		失敗返回-1
*/
int CGisExpression::FindVar(const TCHAR* var)
{
	if(NULL == var)
		return -1;

	int i = 0;
	vector<CVarType>::iterator it;
	for(it = m_varList.begin(); it != m_varList.end(); it++, i++)
	{
		if(0 == lstrcmp((*it).name, var))
			return i;
	}

	return -1;
}

//產生臨時變量
/*
	臨時變量由 ‘__’ + ‘當前的時間(20060407103456008)’ + ‘一個10000以內的隨機數構成’,
	判斷是否為系統臨時變量只需要判斷變量頭兩個字符是否全為下畫線(_)即可。
	顯然,用戶自定義變量不能以兩個下畫線打頭。
	
	只能生成浮點類型(VAR_FLOAT)的臨時變量,已經足夠了。

	成功返回TRUE;
*/
BOOL CGisExpression::MakeTempVar(CVarType& vartemp)
{
	int myTry = 0;
	TCHAR buf[MAX_BUF], str[MAX_BUF];

TEMP_VAR_LOOP:
	//生成頭
	buf[0] = buf[1] = TEMP_VAR_HEAD;
	buf[2] = _T('\0');

	//取得系統時間
	SYSTEMTIME st;
	GetLocalTime(&st);
	wsprintf(str, 
		_T("%04d%02d%02d%02d%02d%02d%03d"), 
		st.wYear,
		st.wMonth,
		st.wDay,
		st.wHour,
		st.wMinute,
		st.wSecond,
		st.wMilliseconds);

	lstrcat(buf, str);

	//產生隨機數
	wsprintf(str, _T("%04d"), rand()%10000);
	lstrcat(buf, str);

	if(myTry > 5)
		return FALSE;
	myTry ++;

	if(FindVar(buf) >= 0)//已經存在此臨時變量,則重新生成
		goto TEMP_VAR_LOOP;

	//成功生成變量名
	vartemp = CVarType(buf, VAR_FLOAT, 0, 0.0);

	return TRUE;
}

/*
	判斷變量是否在變量列表中,并且為臨時變量
		如果意識條件成立,則返回臨時變量在表中的位置
		否則返回-1
*/
int CGisExpression::IsTempVar(const TCHAR* var)
{
	int ret = -1;
	int i = -1;

	if((i = FindVar(var)) >= 0)
	{
		if((var[0] == TEMP_VAR_HEAD) && (var[0] == TEMP_VAR_HEAD))
			ret = i;
	}

	return ret;
}

int CGisExpression::IsTempVar(const CVarType& var)
{
	return IsTempVar(var.name);
}

/*
	顯示表達式
*/
void CGisExpression::ShowExpression(int flag/**/)
{
	if(SE_MIDFIX == flag)
	{
		if(m_pExp != NULL)
			puts(m_pExp);
		else
			puts("<NULL>");
	}
	else if(SE_POSTFIX == flag)
	{
		vector<CSegment>::iterator iter;
		for(iter = m_postfix.begin(); iter != m_postfix.end(); iter++)
			printf("%s ", (*iter).name);
		printf("\n");
	}
}

/*
	VerifyExpression - 檢查表達式是否合法
	參數:
		iPos - [out]返回錯誤的位置,以0開始
	返回值:
		0 - 失敗
		非0 - 成功
*/
int CGisExpression::VerifyExpression(int* pRet/*=NULL*/)
{
	if(pRet != NULL)
		*pRet = 0;

	if(NULL == m_pExp)
		return 0;

	return 1;
}

/*
	MidToPostFis - 中綴式轉后綴式

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕 久热精品 视频在线| 在线播放91灌醉迷j高跟美女 | 国产欧美日韩卡一| 国产一本一道久久香蕉| 久久久久青草大香线综合精品| 国产自产视频一区二区三区| 久久久另类综合| 粉嫩在线一区二区三区视频| 国产精品久久久久久亚洲伦| 色婷婷激情综合| 午夜精品一区二区三区免费视频 | 五月激情丁香一区二区三区| 日韩欧美中文字幕制服| 国产一区二区在线观看免费| 国产精品国产三级国产aⅴ原创| 91视频免费看| 天堂av在线一区| 久久久精品免费观看| 白白色亚洲国产精品| 亚洲一区二区三区四区五区中文 | 2023国产精品自拍| 99久久亚洲一区二区三区青草| 一区二区三区丝袜| 欧美一区二区美女| 国产91精品入口| 亚洲大片一区二区三区| 精品国产一区二区亚洲人成毛片 | 成人国产精品免费| 亚洲综合在线观看视频| 日韩亚洲欧美中文三级| 东方欧美亚洲色图在线| 亚洲图片一区二区| 一区二区三区精品在线观看| 欧美女孩性生活视频| 国产成人精品影视| 无码av免费一区二区三区试看| 2023国产精品视频| 欧美日韩一区小说| 粉嫩13p一区二区三区| 五月婷婷另类国产| 国产精品久久久久久久久搜平片| 69av一区二区三区| 91老司机福利 在线| 精品一区二区精品| 一区二区三区蜜桃| 国产色产综合色产在线视频| 欧美日韩午夜在线视频| 成人国产在线观看| 狠狠色丁香久久婷婷综| 亚洲成人午夜电影| 亚洲视频在线一区| 国产亚洲欧美色| 欧美一级日韩不卡播放免费| 色噜噜狠狠一区二区三区果冻| 国产毛片一区二区| 日韩高清不卡一区| 亚洲综合在线免费观看| 国产精品麻豆视频| 久久久久国产精品厨房| 91精品国产综合久久久久久 | av中文字幕在线不卡| 久久国产生活片100| 午夜视频一区二区三区| 成人免费一区二区三区视频| 日本不卡高清视频| 洋洋成人永久网站入口| 国产精品伦理一区二区| 久久免费国产精品| 日韩美女天天操| 日韩午夜精品电影| 6080国产精品一区二区| 欧美日韩精品电影| 欧美亚州韩日在线看免费版国语版| 99视频超级精品| 99久久精品国产一区| 成av人片一区二区| 粉嫩高潮美女一区二区三区| 国产成人精品在线看| 粉嫩嫩av羞羞动漫久久久 | 欧美三级欧美一级| 欧美午夜寂寞影院| 欧美日韩视频在线第一区 | k8久久久一区二区三区| www.亚洲精品| 91女人视频在线观看| 日本精品视频一区二区| 在线视频观看一区| 欧美日韩精品专区| 91精品国产日韩91久久久久久| 欧美肥妇free| 欧美一区二区三区在线电影 | 2欧美一区二区三区在线观看视频| 日韩视频在线永久播放| 2020日本不卡一区二区视频| 久久久无码精品亚洲日韩按摩| 久久久99免费| 17c精品麻豆一区二区免费| 亚洲免费资源在线播放| 亚洲v日本v欧美v久久精品| 日韩精品电影在线观看| 精品一区二区久久| 成人99免费视频| 欧美少妇性性性| 日韩欧美黄色影院| 欧美国产在线观看| 亚洲一本大道在线| 久久成人18免费观看| 成人激情动漫在线观看| 欧美亚洲综合久久| 日韩欧美第一区| 国产精品麻豆99久久久久久| 亚洲一区二区高清| 国产真实乱偷精品视频免| 波多野结衣精品在线| 欧美日韩国产区一| 久久久www成人免费毛片麻豆 | 日韩三级伦理片妻子的秘密按摩| 久久久久久99久久久精品网站| √…a在线天堂一区| 日本最新不卡在线| 国产sm精品调教视频网站| 色噜噜狠狠成人网p站| 日韩精品在线网站| 亚洲欧美激情小说另类| 久久精品国内一区二区三区| av动漫一区二区| 日韩欧美第一区| 亚洲精品国产a| 国产丶欧美丶日本不卡视频| 欧美综合欧美视频| 久久精品视频网| 日产国产欧美视频一区精品| 不卡视频在线观看| 日韩免费视频一区二区| 亚洲免费资源在线播放| 国产精品99久久久久| 欧美日韩日本视频| 中文字幕欧美一区| 久久97超碰色| 欧美日韩综合色| 中文字幕永久在线不卡| 狠狠色狠狠色合久久伊人| 欧美日韩一区二区三区四区| 六月婷婷色综合| 一本在线高清不卡dvd| 国产亚洲成av人在线观看导航 | 中文一区二区完整视频在线观看| 丝袜亚洲另类丝袜在线| 91在线观看成人| 国产精品网站在线| 国产一区二区三区不卡在线观看 | 视频一区视频二区在线观看| av午夜一区麻豆| 国产欧美一区二区精品忘忧草| 人人超碰91尤物精品国产| 在线观看日韩国产| 中文字幕在线观看不卡视频| 国产不卡在线播放| 久久亚洲一区二区三区明星换脸 | 日韩欧美自拍偷拍| 日韩精品五月天| 欧美色综合网站| 亚洲一二三专区| 在线观看免费一区| 亚洲综合在线五月| 在线看国产日韩| 亚洲另类春色国产| 色久综合一二码| 亚洲日本乱码在线观看| caoporm超碰国产精品| 国产精品你懂的在线| 丰满少妇在线播放bd日韩电影| 久久久噜噜噜久久中文字幕色伊伊 | 捆绑调教一区二区三区| 在线播放中文字幕一区| 免费成人结看片| 精品美女一区二区三区| 裸体歌舞表演一区二区| 久久影院电视剧免费观看| 久久99精品国产.久久久久| 欧美精品一区二区三区在线| 国产在线精品不卡| 国产精品天美传媒| 一本久久综合亚洲鲁鲁五月天| 亚洲男人电影天堂| 日本黄色一区二区| 日韩激情一二三区| 精品欧美乱码久久久久久1区2区| 国产麻豆欧美日韩一区| 中文文精品字幕一区二区| 一本在线高清不卡dvd| 亚洲国产另类av| 精品美女在线播放| www.日本不卡| 亚洲成人一区二区在线观看| 日韩三级视频在线看| 成人影视亚洲图片在线| 亚洲日本va在线观看| 欧美精品精品一区| 国产福利91精品一区|