分享
 
 
 

算术表达式解析类

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

提供一个类,字符串表达式解析,不过,表达式容错能力很弱。

源码如下:

class CalcExp

{

public:

CalcExp();

~CalcExp();

double GetResult(LPSTR);

private:

double FindNextValue(LPSTR lpExp, LPSTR &lpRet);

char FindNextOP(LPSTR lpExp, LPSTR &lpRet);

int CompareOP(char chOp1, char chOp2);

int GetLevel(char chOP);

double GetValue(char chOpType, double dLValue, double dRValue);

double CalcExpr(LPSTR);

private:

LPSTR m_pszBuff;

TCHAR m_szBuffForTest[1024];

};

CalcExp::CalcExp()

{

m_pszBuff = NULL;

strcpy(m_szBuffForTest, "");

}

CalcExp::~CalcExp()

{

// delete []m_pszBuff;

}

double CalcExp::FindNextValue(LPSTR lpExp, LPSTR &lpRet)

{

char szTmp[256];

memset(szTmp, 0, 256);

LPSTR lpTmp = szTmp;

while (lpExp && *lpExp != '\0' && (!isdigit(*lpExp)) && (*lpExp != '.'))

{

lpExp ++;

}

BOOL bHasDot = FALSE;

while (lpExp && *lpExp != '\0' && ((isdigit(*lpExp)) || (*lpExp == '.' && !bHasDot)))

{

if(*lpExp == '.')

{

bHasDot = TRUE;

}

*lpTmp = *lpExp;

lpExp ++;

lpTmp++;

}

if(szTmp[0] == 0)

{

lpRet = NULL;

}

else

{

lpRet = lpExp;

}

return atof(szTmp);

}

char CalcExp::FindNextOP(LPSTR lpExp, LPSTR &lpRet)

{

char szOpers[] = "+-*/()";

char chRtn = 0;

while (lpExp && *lpExp != '\0')

{

if(strchr(szOpers, *lpExp))

{

chRtn = *lpExp;

break;

}

lpExp ++;

}

if(lpExp && *lpExp != '\0')

{

lpExp++;

lpRet = lpExp;

}

else

{

lpRet = NULL;

}

return chRtn;

}

int CalcExp::CompareOP(char chOp1, char chOp2)

{

if(chOp2 == ')')

{

return 1;

}

if(chOp1 == '(')

{

return -1;

}

if(chOp2 == '(')

{

return - 1;

}

int iLevel1, iLevel2;

iLevel1 = GetLevel(chOp1);

iLevel2 = GetLevel(chOp2);

if(iLevel1 == iLevel2)

{

return 0;

}

if(iLevel1 > iLevel2)

{

return 1;

}

if(iLevel1 < iLevel2)

{

return -1;

}

}

int CalcExp::GetLevel(char chOP)

{

char szOpers[4][4] = {")","+-","*/", "("};

for(int iLevel = 0; iLevel < 4; iLevel++)

{

if(strchr(szOpers[iLevel], chOP))

{

return iLevel;

}

}

return -1;

}

double CalcExp::CalcExpr(LPSTR lpExp)

{

double dRtn = 0;

while(*lpExp == ' ')

{

lpExp ++;

}

if(*lpExp == '\0')

{

return 0;

}

double ardValueBuff[1024];

char archOPBuff[1024];

int iValDeep = 0, iOPDeep = 0;

LPSTR lpTmpVal = lpExp, lpTmpOP = lpExp;

do

{

ardValueBuff[iValDeep] = FindNextValue(lpTmpVal, lpTmpVal);

if(lpTmpVal)

{

iValDeep++;

}

archOPBuff[iOPDeep] = FindNextOP(lpTmpOP, lpTmpOP);

if(lpTmpOP)

{

iOPDeep++;

}

} while(lpTmpVal || lpTmpOP);

for(int iLoop = 0; iLoop < iValDeep / 2; iLoop++)

{

double dTmp = ardValueBuff[iLoop];

ardValueBuff[iLoop] = ardValueBuff[iValDeep - 1 - iLoop];

ardValueBuff[iValDeep - 1 - iLoop] = dTmp;

}

for(iLoop = 0; iLoop < iOPDeep / 2; iLoop++)

{

char chTmp = archOPBuff[iLoop];

archOPBuff[iLoop] = archOPBuff[iOPDeep - 1 - iLoop];

archOPBuff[iOPDeep - 1 - iLoop] = chTmp;

}

while(iOPDeep)

{

int iValTop = 0, iOPTop = 0;

if(iOPDeep == 1)

{

iOPDeep --;

iValDeep = 0;

dRtn = GetValue(archOPBuff[iOPDeep], ardValueBuff[1], ardValueBuff[0]);

continue;

}

while(CompareOP(archOPBuff[iOPDeep - 1], archOPBuff[iOPDeep - 2]) < 0)

{

iOPDeep--;

iOPTop++;

archOPBuff[1024 - iOPTop] = archOPBuff[iOPDeep];

if(archOPBuff[iOPDeep] == '(')

{

continue;

}

iValDeep--;

iValTop++;

ardValueBuff[1024 - iValTop] = ardValueBuff[iValDeep];

}

iOPDeep--;

if(archOPBuff[iOPDeep] == '(' && archOPBuff[iOPDeep - 1] == ')')

{

iOPDeep--;

}

else

{

iValDeep--;

ardValueBuff[iValDeep - 1] = GetValue(archOPBuff[iOPDeep], ardValueBuff[iValDeep], ardValueBuff[iValDeep - 1]);

}

while(iOPTop || iValTop)

{

if(iOPTop)

{

archOPBuff[iOPDeep] = archOPBuff[1024 -iOPTop];

iOPTop --;

iOPDeep++;

}

if(iValTop)

{

ardValueBuff[iValDeep] = ardValueBuff[1024 - iValTop];

iValTop --;

iValDeep++;

}

}

}

if (iValDeep)

{

dRtn = ardValueBuff[0];

}

return dRtn;

}

double CalcExp::GetValue(char chOpType, double dLValue, double dRValue)

{

switch(chOpType)

{

case '+':

return dLValue + dRValue;

break;

case '-':

return dLValue - dRValue;

break;

case '*':

return dLValue * dRValue;

break;

case '/':

if(dRValue == 0)

{

return 0;

}

return dLValue / dRValue;

break;

}

return 0;

}

double CalcExp::GetResult(LPSTR lpExp)

{

strcpy(m_szBuffForTest, lpExp);

return CalcExpr(lpExp);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有