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

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

?? gisexpression.cpp

?? 此程序實現了表達式求值
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	此為表達式求值的核心算法
*/
int CGisExpression::MidToPostfix()
{
	if(!VerifyExpression())
		return 0;

	if(m_bPostfix)//已經轉換過了
		return 1;

	m_postfix.clear();

	TCHAR buf[MAX_BUF];
	TStack<COpPri> stack;
	int pos = 0; 
	while(pos >= 0)
	{
		pos = Divide(buf, MAX_BUF, pos);
		if(0 == lstrcmp(buf, _T("")))
			continue;

		if(IsOperator(buf))
		{
			if(buf[0] == ')')
			{
				while(0 != lstrcmp(stack.GetTop().name, _T("(")))
				{
					m_postfix.push_back(CSegment(stack.Pop().name));
				}
				stack.Pop();
			}
			else if(!stack.IsEmpty() && 
				GetOperatorPri(buf) <= stack.GetTop().pri &&
				0 != lstrcmp(stack.GetTop().name, _T("(")))
			{
				while(GetOperatorPri(buf) <= stack.GetTop().pri && 
							!stack.IsEmpty() &&
							0 != lstrcmp(stack.GetTop().name, _T("(")))
				{
					m_postfix.push_back(CSegment(stack.Pop().name));
				}

				COpPri op;
				assert(GetOperatorOb(buf, op));
				stack.Push(op);
			}
			else
			{
				COpPri op;
				assert(GetOperatorOb(buf, op));
				stack.Push(op);
			}
		}
		else//if is not operator
		{
			m_postfix.push_back(buf);
		}// end if Isoperator
	}
	while(!stack.IsEmpty())
	{
		m_postfix.push_back(CSegment(stack.Pop().name));
	}

	m_bPostfix = TRUE;

	return 1;
}

/*
	計算表達式的值
	[out]fp - 計算的表達式的值
	返回值:
		0 - 成功
		-3 - 不認識的運算符
		-2 - 轉換后的后綴式有誤(很可能是輸入的中綴式不正確)
		-1 - 變量不存在
*/
int CGisExpression::Calculate(double* pf)
{
	assert(pf != NULL);

	TStack<CSegment> stack;
	vector<CSegment>::iterator it;

	for(it = m_postfix.begin(); it != m_postfix.end(); it++)
	{
		//printf("degug - %s\n", (*it).name);
		if(!IsOperator((*it).name))//如果是操作數(不是操作符),壓棧
		{
			stack.Push(*it);
			//printf("debug - %s\n", (*it).name);
		}
		else if(IsOperator((*it).name[0]))//如果是運算符:如+-,不是函數:如sqrt,sin
		{
			//取得操作數
			CVarType vartemp;//臨時變量

			double a = 0.0, b = 0.0;
			int ret = -1;
			int rettemp1 = -1, rettemp2 = -1;
			CSegment temp;

			//取得運算符右邊的數據
			temp = stack.Pop();
			if((ret = GetVarValue(temp.name, &b)) != 0)
				return ret;

			//判斷取出的數據是否為臨時變量
			if((rettemp1 = IsTempVar(temp.name)) >= 0)
			{
				vartemp = m_varList[rettemp1];
			}

			//取得運算符左邊的數據
			temp = stack.Pop();
			if((ret = GetVarValue(temp.name, &a)) != 0)
				return ret;

			//判斷取出的數據是否為臨時變量
			if((rettemp2 = IsTempVar(temp.name)) >= 0)
			{
				vartemp = m_varList[rettemp2];
			}

			//如果兩個操作數全不是臨時變量則重新生成臨時變量。
			if(rettemp1 < 0 && rettemp2 < 0)
			{
				assert(MakeTempVar(vartemp));
				//將臨時變量添加到變量列表中
				AddVar(vartemp);
			}

			//
			if(0 == lstrcmp((*it).name, _T("+")))
			{
				a = a + b;
			}
			else if(0 == lstrcmp((*it).name, _T("-")))
			{
				a = a - b;
			}
			else if(0 == lstrcmp((*it).name, _T("*")))
			{
				a = a * b;
			}
			else if(0 == lstrcmp((*it).name, _T("/")))
			{
				a = a / b;
			}
			else if(0 == lstrcmp((*it).name, _T("^")))
			{
				a = pow(a, b);
			}
			else 
			{
				return -3;//永遠不可能發生
			}

			//將操作數寫入變量中,并且將變量重新壓入堆棧
			SetVarValue(vartemp.name, a);
			stack.Push(CSegment(vartemp.name));
		}//
		else//如果是函數操作:如sin cos tan sqrt等
		{
			CVarType vartemp;
			CSegment temp;
			int ret = -1;
			double a = 0.0;

			//取操作數
			temp = stack.Pop();
			if((ret = GetVarValue(temp.name, &a)) != 0)
				return ret;

			//判斷是否為臨時變量
			if((ret = IsTempVar(temp.name)) >= 0)
			{
				vartemp = m_varList[ret];
			}

			//如果操作數不是臨時變量則生成一個新的臨時變量
			if(ret < 0)
			{
				assert(MakeTempVar(vartemp));
				//將臨時變量添加到變量列表中
				AddVar(vartemp);
			}

			if(0 == lstrcmp((*it).name, _T("sin")))
			{
				a = sin(a);
			}
			else if(0 == lstrcmp((*it).name, _T("cos")))
			{
				a = cos(a);
			}
			else if(0 == lstrcmp((*it).name, _T("tan")))
			{
				a = tan(a);
			}
			else if(0 == lstrcmp((*it).name, _T("sqrt")))
			{
				a = sqrt(a);
			}
			else if(0 == lstrcmp((*it).name, _T("log10")))
			{
				a = log10(a);
			}
			else if(0 == lstrcmp((*it).name, _T("ln")))
			{
				a = log(a);
			}
			else
			{
				return -3;//永遠不可能發生
			}

			SetVarValue(vartemp.name, a);
			stack.Push(CSegment(vartemp.name));
		}//endif
	}

	//取結果
	CSegment temp;
	int ret = -1;
	temp = stack.Pop();
	if((ret = GetVarValue(temp.name, pf)) != 0)
		return ret;

	return 0;
}

/*
	注意,添加函數時一定要將flag標志位設置為1
*/
void CGisExpression::SetPRI()
{
	lstrcpy(m_pPri[0].name, _T("+"));
	m_pPri[0].pri = 20;
	m_pPri[0].flag = 0;

	lstrcpy(m_pPri[1].name, _T("-"));
	m_pPri[1].pri = 20;
	m_pPri[1].flag = 0;

	lstrcpy(m_pPri[2].name, _T("*"));
	m_pPri[2].pri = 40;
	m_pPri[2].flag = 0;

	lstrcpy(m_pPri[3].name, _T("/"));
	m_pPri[3].pri = 40;
	m_pPri[3].flag = 0;

	lstrcpy(m_pPri[4].name, _T("^"));//乘方
	m_pPri[4].pri = 60;
	m_pPri[4].flag = 0;

	lstrcpy(m_pPri[5].name, _T("sqrt"));//開方
	m_pPri[5].pri = 80;
	m_pPri[5].flag = 1;

	lstrcpy(m_pPri[6].name, _T("sin"));//
	m_pPri[6].pri = 80;
	m_pPri[6].flag = 1;

	lstrcpy(m_pPri[7].name, _T("cos"));//
	m_pPri[7].pri = 80;
	m_pPri[7].flag = 1;

	lstrcpy(m_pPri[8].name, _T("tan"));//
	m_pPri[8].pri = 80;
	m_pPri[8].flag = 1;

	lstrcpy(m_pPri[9].name, _T("("));//
	m_pPri[9].pri = 200;
	m_pPri[9].flag = 0;

	lstrcpy(m_pPri[10].name, _T(")"));//
	m_pPri[10].pri = 200;
	m_pPri[10].flag = 0;

	lstrcpy(m_pPri[11].name, _T("log10"));//10為底的對數
	m_pPri[11].pri = 80;
	m_pPri[11].flag = 1;

	lstrcpy(m_pPri[12].name, _T("ln"));//自然對數
	m_pPri[12].pri = 80;
	m_pPri[12].flag = 1;

	m_iOperator = 13;
}

/*
	每次返回一個段,比如:234+152分為:234,+,152三段
	pos表示起始點
	返回值為-1表示處理完畢
*/
int CGisExpression::Divide(TCHAR* dest, int length, int pos/*=NULL*/)
{
	assert(m_pExp != NULL && dest != NULL);

	memset(dest, 0, length);

	int len = lstrlen(m_pExp);
	int index = 0;

	if(pos < len && pos >= 0)
	{
		dest[index++] = m_pExp[pos];
		if(IsOperator(m_pExp[pos]))
			return pos+1;
	}

	for(int i = pos + 1; i < len; i++)
	{
		if(IsOperator(m_pExp[i]))
		{
			dest[index] = _T('\0');
			trim(dest);//去掉前后的空格
			return i;
		}
		
		dest[index++] = m_pExp[i];
	}
	dest[index] = _T('\0');
	trim(dest);

	return -1;
}

int CGisExpression::IsOperator(TCHAR ch)
{
	for(int i = 0; i < m_iOperator; i++)
	{
		if(m_pPri[i].flag == 0 && m_pPri[i].name[0] == ch)
			return 1;
	}

	return 0;
}

/*
	判斷是否是操作符
*/
int CGisExpression::IsOperator(const TCHAR* str)
{
	if(NULL == str)
		return 0;

	for(int i = 0; i < m_iOperator; i++)
	{
		if(0 == lstrcmp(str, m_pPri[i].name))
			return 1;
	}

	return 0;
}

/*
	取得操作符的優先級
*/
int CGisExpression::GetOperatorPri(const TCHAR* str)
{
	if(NULL == str)
		return -1;

	for(int i = 0; i < m_iOperator; i++)
	{
		if(0 == lstrcmp(str, m_pPri[i].name))
			return m_pPri[i].pri;
	}

	return -1;
}

/*
	取得操作符對象COpPri
*/
int CGisExpression::GetOperatorOb(const TCHAR* str, COpPri& op)
{
	if(NULL == str)
		return 0;

	for(int i = 0; i < m_iOperator; i++)
	{
		if(0 == lstrcmp(str, m_pPri[i].name))
		{
			op = m_pPri[i];
			return 1;
		}
	}

	return 0;
}

int CGisExpression::GetIderCount()
{
	int cnt = 0;
	int pos = 0;
	
	TCHAR buf[MAX_BUF];
	while(pos >= 0)
	{
		pos = Divide(buf, MAX_BUF, pos);
		if(!IsOperator(buf[0]) && (buf[0] != _T('\0')))
			cnt++;
	}

	return cnt;
}

LPTSTR CGisExpression::StrCat(LPTSTR str, TCHAR ch)
{
	TCHAR buf[2];

	buf[0] = ch;
	buf[1] = _T('\0');

	return lstrcat(str, buf);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久理论电影网| 视频一区视频二区中文| 亚洲日本在线看| 夜夜嗨av一区二区三区| 轻轻草成人在线| 国产成人精品免费视频网站| 在线成人免费视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美精品一二三| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品久久久久久久久果冻传媒 | 色综合久久久久久久久| 欧美一区二区三级| 伊人一区二区三区| 国产高清精品久久久久| 91麻豆精品国产91久久久使用方法| 国产日产精品一区| 日本亚洲三级在线| 色哟哟亚洲精品| 欧美韩日一区二区三区四区| 蜜臀va亚洲va欧美va天堂 | 亚洲国产精品久久艾草纯爱| 国产91富婆露脸刺激对白| 8x福利精品第一导航| 亚洲免费观看高清完整版在线观看 | 伊人性伊人情综合网| 国产酒店精品激情| 在线播放中文一区| 一区二区三区美女| 99精品欧美一区二区三区综合在线| 久久伊人蜜桃av一区二区| 日韩激情在线观看| 欧美日精品一区视频| 亚洲激情自拍偷拍| 91色乱码一区二区三区| 国产精品午夜久久| 国产精品一级片| 精品播放一区二区| 日产精品久久久久久久性色| 欧美午夜一区二区三区免费大片| 樱桃视频在线观看一区| 一本在线高清不卡dvd| 中文字幕在线不卡一区二区三区| 国产成人精品免费视频网站| 国产香蕉久久精品综合网| 国产一区二区三区在线观看免费 | 欧美在线不卡一区| 亚洲精品乱码久久久久久黑人 | 91浏览器入口在线观看| **欧美大码日韩| 色av成人天堂桃色av| 亚洲激情中文1区| 欧美午夜电影网| 午夜成人免费视频| 日韩欧美成人一区| 国产一区二区日韩精品| 日本一区二区久久| 91在线播放网址| 天堂va蜜桃一区二区三区| 欧美一卡在线观看| 国内成+人亚洲+欧美+综合在线| 久久久久久久综合色一本| 丁香婷婷综合色啪| 亚洲色图视频网| 欧美日韩高清在线| 精品制服美女久久| 国产精品久久久久影院老司| 91福利社在线观看| 美美哒免费高清在线观看视频一区二区| 精品国产一区二区国模嫣然| 不卡av在线免费观看| 一二三四社区欧美黄| 日韩亚洲电影在线| 成人小视频免费观看| 亚洲影视资源网| 日韩精品一区二区三区swag| av在线不卡电影| 日韩精品国产欧美| 欧美经典一区二区| 欧美日韩亚洲不卡| 国产福利电影一区二区三区| 一区二区三区欧美日| 26uuu亚洲| 欧美性猛交xxxx乱大交退制版| 国产一区二区在线电影| 亚洲成人动漫精品| 久久久久久久久久久黄色| 欧美伊人久久久久久久久影院| 精品一区免费av| 亚洲与欧洲av电影| 中文成人综合网| 欧美不卡一区二区| 91久久奴性调教| 国产呦萝稀缺另类资源| 亚洲午夜成aⅴ人片| 日本一区二区三级电影在线观看 | 精品视频一区 二区 三区| 国产丶欧美丶日本不卡视频| 亚洲3atv精品一区二区三区| 国产精品色哟哟| 精品国产精品一区二区夜夜嗨| 欧美视频在线播放| av高清不卡在线| 精品亚洲国内自在自线福利| 日韩制服丝袜av| 亚洲综合丝袜美腿| 亚洲三级电影网站| 国产精品婷婷午夜在线观看| 欧美大黄免费观看| 在线不卡免费欧美| 在线观看欧美精品| 91污在线观看| 成a人片国产精品| 国产成人av在线影院| 激情五月婷婷综合| 麻豆精品国产传媒mv男同| 日欧美一区二区| 性久久久久久久久| 亚洲一二三四久久| 一片黄亚洲嫩模| 亚洲综合在线视频| 夜夜嗨av一区二区三区四季av| 亚洲乱码国产乱码精品精小说| 最新欧美精品一区二区三区| 亚洲欧洲色图综合| 国产精品传媒入口麻豆| 国产精品色一区二区三区| 日韩欧美另类在线| 精品国产凹凸成av人网站| 精品久久久久久无| 久久精品一级爱片| 国产午夜精品一区二区三区嫩草 | 91蝌蚪porny| 日本韩国一区二区三区| 91麻豆自制传媒国产之光| 一本一本久久a久久精品综合麻豆| 91小视频免费观看| 欧美性一区二区| 884aa四虎影成人精品一区| 日韩欧美的一区| 久久久91精品国产一区二区精品| 久久精品日产第一区二区三区高清版| 国产亚洲欧美日韩日本| 国产精品日产欧美久久久久| 一区二区视频免费在线观看| 亚洲福利电影网| 麻豆成人av在线| 成人晚上爱看视频| 在线亚洲高清视频| 日韩一区二区不卡| 国产精品色在线| 亚洲午夜免费视频| 狠狠色丁香婷综合久久| 成人精品视频一区二区三区尤物| 91国产精品成人| 欧美成人一区二区| 中文字幕中文字幕中文字幕亚洲无线| 一区二区在线观看视频在线观看| 日韩在线a电影| 成熟亚洲日本毛茸茸凸凹| 欧美三级视频在线播放| ww亚洲ww在线观看国产| 亚洲激情在线激情| 久久99精品国产麻豆婷婷洗澡| 不卡一区在线观看| 欧美精品vⅰdeose4hd| 国产欧美一区二区精品性色 | 中文在线一区二区| 亚洲国产精品天堂| 国产激情一区二区三区四区 | 久久av老司机精品网站导航| 成人黄色网址在线观看| 91精品国产色综合久久ai换脸 | 欧美一区二区精美| 亚洲欧洲综合另类在线| 精品制服美女丁香| 欧美视频一区二| 国产精品美女久久久久aⅴ| 毛片基地黄久久久久久天堂| 91麻豆视频网站| 欧美激情综合五月色丁香小说| 无码av中文一区二区三区桃花岛| 成人黄色片在线观看| 日韩精品一区二区三区蜜臀| 亚洲大片免费看| 在线亚洲+欧美+日本专区| 国产精品视频麻豆| 国产一区二区三区在线观看精品| 欧美日韩一本到| 伊人色综合久久天天| 97精品视频在线观看自产线路二| 精品成人一区二区三区四区| 免费观看一级欧美片| 欧美精品久久99久久在免费线| 樱花草国产18久久久久| eeuss影院一区二区三区| 国产日韩欧美不卡在线| 久久99精品久久只有精品| 欧美一区二区免费观在线| 日韩中文字幕不卡|