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

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

?? express.cpp

?? Cool語言編譯器
?? CPP
字號:
//////////////////////////////////////////////
//                                          //
//    Express.cpp                           //
//    表達式計算模塊                        //
//    處理數值表達式計算和布爾表達式計算    //
//    最后更新時間:2004年4月23日11:33      //
//                                          //
//////////////////////////////////////////////



#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#include "Express.h"

double Expression(const char strExp[MaxY], int &Seat)
{
	// 計算表達式的值

	double Expr;

	// 計算項的值
	Expr = Term(strExp, Seat);

	if (Error)
	{
		// 有錯誤,返回
		return 0;
	}

	while (Seat < strlen(strExp) && 
			(strExp[Seat] == '+' || strExp[Seat] == '-'))
	{
		// 還有項需要計算

		Seat++;
		switch (strExp[Seat - 1])
		{
		case '+':
			// 加號

			Expr += Term(strExp, Seat);
			break;
		case '-':
			// 減號

			Expr -= Term(strExp, Seat);
			break;
		}

		if (Error)
		{
			return 0;
		}
	}

	// 返回表達式的值
	return Expr;
}

double Term(const char strExp[MaxY], int &Seat)
{
	// 計算項的值

	double Tem;

	// 計算因式的值
	Tem = Factor(strExp, Seat);

	if (Error)
	{
		// 有錯誤,返回

		return 0;
	}

	while (Seat < strlen(strExp) && 
			(strExp[Seat] == '*' || strExp[Seat] == '/' || strExp[Seat] == '%'))
	{
		// 還有因式需要計算

		Seat++;
		switch (strExp[Seat - 1])
		{
		case '*':
			// 乘號

			Tem *= Factor(strExp, Seat);
			break;
		case '/':
			// 除號

			double Div = Factor(strExp, Seat);
			if (fabs(Div) < 0.000001 )
			{
				// 除數為0,錯誤

				Error = ErrorZeroDivision;
			}
			else
			{
				// 除數不為0

				Tem /= Div;
			}
			break;
		case '%':
			// 取余數

			int Num2 = Factor(strExp, Seat);
			if (Num2 < 0.000001)
			{
				// 除數為0,錯誤

				Error = ErrorZeroDivision;
			}
			else
			{
				Tem = (int) Tem %  Num2;
			}
			break;

		}

		if (Error)
		{
			return 0;
		}
	}

	// 返回項的值
	return Tem;
}

double Factor(const char strExp[MaxY], int &Seat)
{
	// 計算因式的值

	if (strExp[Seat] == '(')
	{
		// 因式中含有括號,開始表達式處理

		// 越過左括號位
		Seat++;

		// 返回表達式的值
		double Exp = Expression(strExp, Seat);

		if (Error)
		{
			return 0;
		}

		// 越過右括號位
		Seat++;

		// 返回因式的值
		return Exp;
	}
	else if (strExp[Seat] == '+')
	{
		// 是正號

		// 越過正好位
		Seat++;

		// 返回因式的值
		double Result = Factor(strExp, Seat);

		return Result;
	}
	else if (strExp[Seat]=='-')
	{
		// 是負號

		// 越過負號位
		Seat++;

		// 返回因式的相反數
		double Result = -Factor(strExp, Seat);

		return Result;
	}
	else
	{
		// 處理普通因式

		// 存儲因式的表達式
		char strTemp[MaxY];
		strTemp[0] = '\0';

		char Chr = strExp[Seat];

		while (isalpha(Chr) || isdigit(Chr) || Chr == '_' || Chr == '.')
		{
			// 是字母、數字或小數點

			// 添加如表達式
			strcat(strTemp, " ");
			strTemp[strlen(strTemp) - 1] = Chr;

			// 位置后移
			Seat++;

			Chr = strExp[Seat];
		}

		double Value;
		if (IsNumber(strTemp, Value))
		{
			return Value;
		}

		switch (GetType(strTemp))
		{
			// 查看因式的類型

		case NoType:
			// 有未定義的變量錯誤

			// 輸出錯誤
			Error = ErrorUndefined;

			return 0;
		case Integer:
			// 是整形變量

			return VarValue_Int(strTemp);
		case Real:
			// 是實型變量

			return VarValue_Real(strTemp);
		case Array:
			// 是數組

			// 存儲數組變量名
			char strVar[MaxLenOfVar];

			// 得到變量名
			strcpy(strVar,strTemp);

			// 得到其數組指針
			VarArrayHeadType *pThis = GetArrayDim(strVar);

			char strPara[MaxY];

			int SeatNew;
			if (!GetParaStr(strExp, Seat, strPara, SeatNew))
			{
				// 缺少對應括號

				Error = ErrorMissingBracketInArray;

				return 0;
			}

			Seat = SeatNew;

			// 取各下標
			int Dim[MaxDim];
			int TotDim;
			Para(strPara, Dim, TotDim);
			if (pThis->TotDim != TotDim)
			{
				// 維數不正確

				Error = ErrorDim;

				return 0;
			}

			// 計算數組元素位置
			int Position = CalcPosition(pThis, Dim);
			if (Error)
			{
				return 0;
			}

			// 取數組元素值
			int Result = GetValue(pThis, Position);
			if (Error)
			{
				return 0;
			}

			return Result;

		case SystemFunc:
			// 是系統函數

			if (strcmp(strTemp,"RND") == 0)
			{
				// 隨機函數

				// 取參數
				GetParaStr(strExp, Seat, strPara, SeatNew);
				Seat = SeatNew;

				// 計算參數值
				int SeatPara = 0;
				int Temp = Expression(strPara, SeatPara);

				if (Error)
				{
					return 0;
				}

				if (Temp < 1)
				{
					// 隨機參數小于零

					Error = ErrorRND;
					return 0;
				}
				else
				{
					return random(Temp);
				}
			}
			else if (strcmp(strTemp,"INT")==0)
			{
				// 取整函數

				// 取參數
				GetParaStr(strExp, Seat, strPara, SeatNew);
				Seat = SeatNew;

				// 計算參數值
				int SeatPara = 0;
				int Result = Expression(strPara, SeatPara);

				if (Error)
				{
					return 0;
				}
				else
				{
                    return Result;
				}
			}
			else if (strcmp(strTemp,"SQR")==0)
			{
				// 求平方根函數

				// 取參數
				GetParaStr(strExp, Seat, strPara, SeatNew);
				Seat = SeatNew;

				// 計算參數值
				int SeatPara = 0;
				double Result = Expression(strPara, SeatPara);

				if (Error)
				{
					return 0;
				}
				else
				{
                    return sqrt(Result);
				}
			}
			else if (strcmp(strTemp,"PI")==0)
			{
				// 圓周率

				return Pi;
			}
			break;
		}
	}

	return 0;
}

void BoolChange
	(
	const char ExpIn[MaxY],	// 源布爾表達式
	char *Return			// 返回字符串
	)
{
	// 變換布爾表達式
	// NOT	->	!
	// AND	->	&
	// OR	->	|
	// 清除中間所有空格

	char Exp[MaxY];
	strcpy(Exp, ExpIn);

	// 在變換連接時使用
	char strLeft[MaxY];
	char strRight[MaxY];

	// 存儲單詞
	char Word[MaxY];

	// 源表達式字符指針
	int i = 0;

	while (i < strlen(Exp))
	{
		if (!strchr("<>=(), ", Exp[i]))
		{
			// 加入單詞

			strcat(Word, " ");
			Word[strlen(Word) - 1] = Exp[i];

			// 指針后移
			i++;
		}
		else if (Word[0] != '\0')
		{
			if (strcmp(Word, "NOT") == 0)
			{
				// 替換NOT

				// 取關鍵字左邊的部分
				GetMid(Exp, 0, i - 4, strLeft);

				// 取關鍵字右邊的部分
				GetMid(Exp, i, strlen(Exp), strRight);

				// 依次連接表達式
				strcat(strLeft, " ! ");
				strcat(strLeft, strRight);

				// 覆蓋源表達式
				strcpy(Exp, strLeft);
			}
			else if (strcmp(Word, "AND") == 0)
			{
				// 替換AND

				// 取關鍵字左邊的部分
				GetMid(Exp, 0, i - 4, strLeft);

				// 取關鍵字右邊的部分
				GetMid(Exp, i, strlen(Exp), strRight);

				// 依次連接表達式
				strcat(strLeft, " & ");
				strcat(strLeft, strRight);

				// 覆蓋源表達式
				strcpy(Exp, strLeft);
			}
			else if (strcmp(Word, "OR") == 0)
			{
				// 替換OR

				// 取關鍵字左邊的部分
				GetMid(Exp, 0, i - 4, strLeft);

				// 取關鍵字右邊的部分
				GetMid(Exp, i, strlen(Exp), strRight);

				// 依次連接表達式
				strcat(strLeft, " | ");
				strcat(strLeft, strRight);

				// 覆蓋源表達式
				strcpy(Exp, strLeft);

				// 因為替換后源表達式變長一位,所以指針后移
				i++;
			}
			else
			{
				// 標識符

				i++;
			}

			// 清空單詞
			Word[0] = '\0';
		}
		else
		{
			// 連續的分隔符

			i++;
		}
	}

	// 清除中間的空格
	ClearBlankInside(Exp);

	// 復制給返回字符串
	strcpy(Return, Exp);
}

bool Boolean(const char Exp[MaxY], int &SeatStart)
{
	// 計算布爾表達式

	// 計算AND表達式的值
	int Seat = SeatStart;
	bool Result = AND(Exp, Seat);

	if (Error)
	{
		return false;
	}

	if (Result)
	{
		// 當前為真,則直接返回真

		SeatStart = Seat;
		return true;
	}

	while (Exp[Seat] == '|')
	{
		// 計算下一個AND表達式
		Seat++;
		Result = AND(Exp, Seat);

		if (Error)
		{
			return false;
		}

		if (Result)
		{
			// 結果為真,直接返回真

			SeatStart = Seat;
			return true;
		}
	}

	// 返回假
	SeatStart = Seat;
	return false;
}

bool AND(const char Exp[MaxY], int &SeatStart)
{
	// 計算AND表達式的值

	// 計算OR表達式的值
	int Seat = SeatStart;
	bool Result = OR(Exp, Seat);

	if (Error)
	{
		return false;
	}

	if (!Result)
	{
		// 當前為假,則直接返回假

		SeatStart = Seat;
		return false;
	}

	while (Exp[Seat] == '&')
	{
		// 計算下一個OR表達式的值

		Seat++;
		Result = OR(Exp, Seat);

		if (Error)
		{
			return false;
		}

		if (!Result)
		{
			// 當前為假,則直接返回假

			SeatStart = Seat;
			return false;
		}
	}

	SeatStart = Seat;

	return true;
}

bool OR(const char Exp[MaxY], int &SeatStart)
{
	// 計算OR表達式的值

	int Seat = SeatStart;

	if (Exp[Seat] == '(')
	{
		// 計算新的布爾表達式的值

		Seat++;
		bool Result = Boolean(Exp, Seat);

		if (Error)
		{
			return false;
		}

		SeatStart = Seat;
		return Result;
	}
	else if (Exp[Seat] == '!')
	{
		// 計算NOT

		Seat++;
		bool Result = OR(Exp, Seat);

		SeatStart = Seat;
		return !Result;
	}
	else
	{
		// 取左側表達式
		char Word[MaxY] = "";
		while (!strchr("<>=&|", Exp[Seat]))
		{
			strcat(Word, " ");
			Word[strlen(Word) - 1] = Exp[Seat];
			Seat++;
		}

		// 計算左側表達式
		int SeatTemp = 0;
		double Exp1 = Expression(Word, SeatTemp);
		if (Error)
		{
			return false;
		}

		// 取邏輯運算符
		char Operation[3] = "";
		while (strchr("<>=", Exp[Seat]))
		{
			strcat(Operation, " ");
			Operation[strlen(Operation) - 1] = Exp[Seat];
			Seat++;
		}

		if (Operation[0] == '\0')
		{
			// 邏輯運算符為空,直接返回左側表達式
			// 非零為真,反之為假

			return Exp1 != 0;
		}

		// 取右側表達式
		Word[0] = '\0';
		while (!strchr("<>!=&|", Exp[Seat]))
		{
			strcat(Word, " ");
			Word[strlen(Word) - 1] = Exp[Seat];
			Seat++;
		}

		// 計算右側表達式
		SeatTemp = 0;
		double Exp2 = Expression(Word, SeatTemp);
		if (Error)
		{
			return false;
		}

		SeatStart = Seat;

		// 根據運算符,分別判斷返回
		if (strcmp(Operation, ">") == 0)
		{
			return Exp1 > Exp2;
		}
		else if (strcmp(Operation, "<") == 0)
		{
			return Exp1 < Exp2;
		}
		else if (strcmp(Operation, "=") == 0)
		{
			return Exp1 == Exp2;
		}
		else if (strcmp(Operation, ">=") == 0)
		{
			return Exp1 >= Exp2;
		}
		else if (strcmp(Operation, "<=") == 0)
		{
			return Exp1 <= Exp2;
		}
		else if (strcmp(Operation, "<>") == 0)
		{
			return Exp1 != Exp2;
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性猛交一区二区三区精品 | 91丝袜国产在线播放| 国产亚洲1区2区3区| 岛国精品在线观看| 国产精品国产自产拍高清av王其| 成人av在线观| 亚洲一二三区不卡| 欧美一级xxx| 风间由美一区二区三区在线观看| 国产精品视频观看| 91国偷自产一区二区开放时间| 亚洲v精品v日韩v欧美v专区| 91精品国产入口| 国产精品亚洲一区二区三区妖精 | 日韩电影免费在线看| 久久久久久免费网| 99久久精品国产麻豆演员表| 一区二区久久久久| 日韩午夜av电影| av在线不卡电影| 午夜影院在线观看欧美| 亚洲精品在线免费播放| av电影一区二区| 午夜影院久久久| 国产欧美日韩一区二区三区在线观看 | 91在线免费看| 日韩精品一二三| 国产欧美一区二区精品性色超碰| 色成年激情久久综合| 久久福利资源站| 亚洲男帅同性gay1069| 日韩女优毛片在线| 91亚洲精品乱码久久久久久蜜桃| 日日嗨av一区二区三区四区| 国产精品污www在线观看| 在线电影国产精品| eeuss鲁片一区二区三区在线观看| 午夜精品久久久久久久99樱桃| 久久久久国产免费免费| 欧美日韩久久不卡| 成人黄色片在线观看| 蜜桃视频在线观看一区| 亚洲码国产岛国毛片在线| 欧美tk丨vk视频| 欧美视频在线不卡| 99re视频这里只有精品| 狠狠久久亚洲欧美| 丝袜美腿亚洲一区二区图片| 国产精品情趣视频| 精品国产91乱码一区二区三区| 在线观看中文字幕不卡| www.欧美.com| 国产精一品亚洲二区在线视频| 午夜免费欧美电影| 一区二区三区高清在线| 欧美国产精品一区| 精品久久久久久久久久久久包黑料 | 国产成人综合在线观看| 蜜臂av日日欢夜夜爽一区| 亚洲成a人片综合在线| 亚洲婷婷综合色高清在线| 亚洲国产精品99久久久久久久久| 欧美一区午夜视频在线观看| 欧美亚洲免费在线一区| 97久久超碰国产精品电影| 国产91精品在线观看| 国产一区在线观看视频| 极品尤物av久久免费看| 蜜桃传媒麻豆第一区在线观看| 性欧美大战久久久久久久久| 一区二区高清视频在线观看| 国产精品久久久久久妇女6080| 久久精品欧美一区二区三区麻豆| 欧美成人福利视频| 日韩精品一区二区三区三区免费| 欧美一区二区观看视频| 欧美日本免费一区二区三区| 欧美日韩免费一区二区三区| 欧美性猛交xxxxxxxx| 色呦呦国产精品| 欧美自拍偷拍一区| 欧美色网一区二区| 欧美剧情片在线观看| 91精品国产高清一区二区三区蜜臀 | 伊人夜夜躁av伊人久久| 自拍偷自拍亚洲精品播放| 亚洲欧洲日韩在线| 亚洲视频中文字幕| 一区二区三区久久| 日韩成人伦理电影在线观看| 麻豆成人免费电影| 国产精品一品视频| 91丨porny丨户外露出| 91福利视频在线| 制服丝袜av成人在线看| 精品国产亚洲一区二区三区在线观看 | 国产日韩v精品一区二区| 亚洲国产成人一区二区三区| 国产精品不卡在线观看| 亚洲色图在线播放| 日本视频一区二区| 国产一区二区在线看| 成人高清在线视频| 欧美区视频在线观看| 欧美va亚洲va在线观看蝴蝶网| 国产欧美日韩在线看| 亚洲一二三专区| 久久国产精品第一页| bt欧美亚洲午夜电影天堂| 欧美日韩不卡在线| 精品成人一区二区三区| 成人欧美一区二区三区1314| 亚洲18影院在线观看| 另类小说欧美激情| 91小视频在线观看| 欧美一区二区日韩一区二区| 国产欧美中文在线| 日韩电影免费在线观看网站| 成人午夜碰碰视频| 欧美丰满少妇xxxxx高潮对白 | 欧美大度的电影原声| 国产精品久久久久一区二区三区| 亚洲成人免费电影| 国产不卡在线播放| 69堂国产成人免费视频| 中文字幕av一区二区三区高| 日本成人在线不卡视频| 91亚洲永久精品| 2023国产精品视频| 亚洲成人手机在线| 成年人午夜久久久| 久久久久亚洲蜜桃| 日韩av中文在线观看| 色婷婷久久久亚洲一区二区三区| 精品欧美久久久| 亚洲香蕉伊在人在线观| www.一区二区| 久久香蕉国产线看观看99| 五月综合激情日本mⅴ| 99久久99久久免费精品蜜臀| 日韩美女视频一区二区在线观看| 亚洲黄色片在线观看| 国产麻豆日韩欧美久久| 制服丝袜亚洲色图| 亚洲成人自拍网| 在线观看国产精品网站| 国产精品国产成人国产三级| 国产精品综合二区| 日韩欧美久久久| 日韩精品乱码av一区二区| 色婷婷综合久久久中文一区二区| 国产日韩视频一区二区三区| 久久精品国产精品青草| 91麻豆精品91久久久久同性| 香蕉av福利精品导航| 欧洲精品中文字幕| 亚洲女人****多毛耸耸8| av一区二区三区| 欧美国产精品一区| 成人天堂资源www在线| 国产亚洲欧美日韩俺去了| 久久爱www久久做| 欧美不卡一区二区三区四区| 首页欧美精品中文字幕| 欧美区一区二区三区| 视频一区国产视频| 欧美精品乱码久久久久久按摩| 婷婷综合五月天| 欧美精品 日韩| 欧美aⅴ一区二区三区视频| 在线成人av网站| 免费人成网站在线观看欧美高清| 欧美一区二区三区在线观看视频 | 韩国理伦片一区二区三区在线播放| 91麻豆精品91久久久久同性| 麻豆国产91在线播放| 久久免费美女视频| 国产91精品一区二区| 亚洲婷婷在线视频| 欧美色爱综合网| 日韩精品成人一区二区在线| 欧美一区二区在线看| 激情五月婷婷综合| 国产欧美日韩精品a在线观看| www.性欧美| 亚洲成av人**亚洲成av**| 欧美一区二区在线免费观看| 国产一区二区调教| 亚洲欧洲日本在线| 777亚洲妇女| 国产精品羞羞答答xxdd| 亚洲欧洲国产专区| 欧美色偷偷大香| 国产综合色产在线精品| 久久精品视频在线免费观看| 99久久婷婷国产| 午夜精品视频一区| 欧美一区二区三区免费大片| 国产精品夜夜嗨| 亚洲欧美区自拍先锋|