哪位大哥写过四则运算方面的东西啊,帮帮忙!

loseme915 2006-02-27 08:38:32
输入是一串字符,可支持支持浮点如(0.8*100)-1000.如果哪位大哥有现成的DLL,或者类。请提供帮助,谢谢。
一定要支持浮点啊!!
...全文
87 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
loseme915 2006-02-28
  • 打赏
  • 举报
回复
struct TREE_INFO{
TREE_INFO* pLeft;
TREE_INFO* pRight;
TREE_INFO* pNext;
BYTE nOperate;//0表示当前为数值,1表示加,2表示减,3表示乘,4表示除
double dValue;
};
loseme915 2006-02-28
  • 打赏
  • 举报
回复
CString L_Expressions::GetString(CString strTemp)//取出括号中公式
{
CString strResult;
char szTemp[256];
int Count=0;
int len = strTemp.GetLength();
int index=0;
for (int i=0;i<len;i++)
{
if(strTemp.GetAt(i)=='(')
{
Count++;
}
if (strTemp.GetAt(i)==')')
{
Count--;
if ((i>0)&&(Count==0))
{
szTemp[index]='\0';
break;
}
}
if (i>0)
{
szTemp[index]=strTemp.GetAt(i);
index++;
}
}
strResult = szTemp;
return strResult;
}
loseme915 2006-02-28
  • 打赏
  • 举报
回复
自己写了一个,基本满足需要了。代码比较笨拙。给大家看看。帮我优化一下吧!!
double L_Expressions::SetExpressions(CString strExpress)
{
m_strExpressions = strExpress;
if (strExpress.IsEmpty()) return 0;
CString strTemp=m_strExpressions;
CString strTemp1;
char szTemp[32];
int len = strTemp.GetLength();
int index=0;
TREE_INFO* pValue=NULL;
TREE_INFO* pOpreate=NULL;
TREE_INFO* pRoot = NULL;
TREE_INFO* pCurOper = NULL;
TREE_INFO* pKuoHao=NULL;
TREE_INFO* pTemp1;
TREE_INFO* pTemp2;
for (int i=0;i<len;i++)
{
switch(strTemp.GetAt(i))
{
case '+'://当前字符是操作符
pOpreate = new TREE_INFO;//创建操作符节点
pOpreate->dValue=0;
pOpreate->nOperate=1;
pOpreate->pLeft=NULL;
pOpreate->pNext = NULL;
pOpreate->pRight = NULL;
if ((index>0)&&(pKuoHao==NULL))//如果数值缓存中有字符并且不是括号中返回值
{//创建数值节点
szTemp[index]='\0';
pValue = new TREE_INFO;
pValue->dValue = atof(szTemp);
pValue->nOperate=0;
pValue->pLeft=NULL;
pValue->pRight = NULL;
pValue->pNext=NULL;

}
if ((index==0)&&(pKuoHao!=NULL))
{//读区括号中数值
pValue = pKuoHao;
pKuoHao = NULL;
}
index=0;
if (pRoot==NULL)
{//如果当前是第一个操作符
pRoot = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
else
{//不是第一个操作符则修改指针
pCurOper->pRight = pValue;
pCurOper->pNext = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
break;
case '-'://同上
pOpreate = new TREE_INFO;
pOpreate->dValue=0;
pOpreate->nOperate=2;
pOpreate->pLeft=NULL;
pOpreate->pNext = NULL;
pOpreate->pRight = NULL;

if ((index>0)&&(pKuoHao==NULL))
{
szTemp[index]='\0';
pValue = new TREE_INFO;
pValue->dValue = atof(szTemp);
pValue->nOperate=0;
pValue->pLeft=NULL;
pValue->pRight = NULL;
pValue->pNext=NULL;

}
if ((index==0)&&(pKuoHao!=NULL))
{
pValue = pKuoHao;
pKuoHao = NULL;
}
index=0;
if (pRoot==NULL)
{
pRoot = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
else
{
pCurOper->pRight = pValue;
pCurOper->pNext = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
break;
case '*'://同上
pOpreate = new TREE_INFO;
pOpreate->dValue=0;
pOpreate->nOperate=3;
pOpreate->pLeft=NULL;
pOpreate->pNext = NULL;
pOpreate->pRight = NULL;

if ((index>0)&&(pKuoHao==NULL))
{
szTemp[index]='\0';
pValue = new TREE_INFO;
pValue->dValue = atof(szTemp);
pValue->nOperate=0;
pValue->pLeft=NULL;
pValue->pRight = NULL;
pValue->pNext=NULL;

}
if ((index==0)&&(pKuoHao!=NULL))
{
pValue = pKuoHao;
pKuoHao = NULL;
}
index=0;
if (pRoot==NULL)
{
pRoot = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
else
{
pCurOper->pRight = pValue;
pCurOper->pNext = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
break;
case '/'://同上
pOpreate = new TREE_INFO;
pOpreate->dValue=0;
pOpreate->nOperate=4;
pOpreate->pLeft=NULL;
pOpreate->pNext = NULL;
pOpreate->pRight = NULL;

if ((index>0)&&(pKuoHao==NULL))
{
szTemp[index]='\0';
pValue = new TREE_INFO;
pValue->dValue = atof(szTemp);
pValue->nOperate=0;
pValue->pLeft=NULL;
pValue->pRight = NULL;
pValue->pNext=NULL;

}
if ((index==0)&&(pKuoHao!=NULL))
{
pValue = pKuoHao;
pKuoHao = NULL;
}
index=0;
if (pRoot==NULL)
{
pRoot = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
else
{
pCurOper->pRight = pValue;
pCurOper->pNext = pOpreate;
pCurOper = pOpreate;
pCurOper->pLeft = pValue;
}
break;
case '('://当前是括号
strTemp1 = strTemp.Right(len-i);
strTemp1=GetString(strTemp1);//取出括号公式
i=i+strTemp1.GetLength()+1;
pKuoHao = new TREE_INFO;
pKuoHao->dValue = SetExpressions(strTemp1);//递归,将返回值保存到缓存中
pKuoHao->nOperate=0;
pKuoHao->pLeft=NULL;
pKuoHao->pRight = NULL;
pKuoHao->pNext=NULL;
index=0;
break;
default://当前不是操作符
szTemp[index]=strTemp.GetAt(i);
index++;
break;
}
}
if ((index>0)&&(pKuoHao==NULL))//保存最后一个数值
{
szTemp[index]='\0';
pValue = new TREE_INFO;
pValue->dValue = atof(szTemp);
pValue->nOperate=0;
pValue->pLeft=NULL;
pValue->pRight = NULL;
pValue->pNext=NULL;
}
if ((index==0)&&(pKuoHao!=NULL))//保存最后一个括号返回值
{
pValue = pKuoHao;
pKuoHao = NULL;
}
pCurOper->pRight = pValue;
pTemp1 = pRoot;
BOOL bFind=TRUE;
while (bFind)//检查是否存在乘法或除法
{
pTemp1 = pRoot;
while (pTemp1)
{
if(pTemp1->nOperate>2)//列表中第一个就是乘法或除法
{
pTemp2 = NULL;
bFind=TRUE;
break;
}
else
{
if (pTemp1->pNext)
{
if(pTemp1->pNext->nOperate>2)//找到目标,并且保存前一个操作符节点
{
pTemp2 = pTemp1;
pTemp1 = pTemp1->pNext;
bFind = TRUE;
break;
}
}

}
bFind = FALSE;
pTemp1 = pTemp1->pNext;
}
if (pTemp1)//执行当前操作符
{
if (pTemp1->nOperate==3)//乘法
{
pTemp1->dValue = pTemp1->pLeft->dValue*pTemp1->pRight->dValue;
}
if (pTemp1->nOperate==4)//除法
{
pTemp1->dValue = pTemp1->pLeft->dValue/pTemp1->pRight->dValue;
}
pTemp1->nOperate =0;
if (pTemp2)//如果前一个操作符存在
{
pTemp2->pRight = pTemp1;
pTemp2->pNext = pTemp1->pNext;
}
else//前一个操作符不存在
{
if (pTemp1->pNext)//下一个操作符存在
pRoot = pTemp1->pNext;
else//下一个操作符不存在
pRoot = pTemp1;//当前已经是最后结果
}
if (pTemp1->pNext!=NULL)
pTemp1->pNext->pLeft = pTemp1;
delete pTemp1->pLeft;//删除使用的缓存
delete pTemp1->pRight;
}
}
if (pRoot->nOperate==0) goto fend;//如果当前已经没有操作符,运算结束
pTemp1 = pRoot;
while (pTemp1)//执行加法或减法
{
if (pTemp1->nOperate==1)
pTemp1->dValue = pTemp1->pLeft->dValue+pTemp1->pRight->dValue;
if (pTemp1->nOperate==2)
pTemp1->dValue = pTemp1->pLeft->dValue-pTemp1->pRight->dValue;
pTemp1->nOperate=0;
delete pTemp1->pLeft;
delete pTemp1->pRight;
if (pTemp1->pNext)
{
pTemp2 = pTemp1;
pTemp1 = pTemp1->pNext;
pTemp1->pLeft = pTemp2;
}
else
{
pRoot = pTemp1;
break;
}
}
fend:
double dvalue = pRoot->dValue;
return dvalue;
}
syhan 2006-02-27
  • 打赏
  • 举报
回复
数据结构啊,书上有的
zhangkewang 2006-02-27
  • 打赏
  • 举报
回复
曾做过C语言语法分析器,其中就包括这个功能,操作符的识别及操作的优先级问题.
loseme915 2006-02-27
  • 打赏
  • 举报
回复
要分析字符串的,还要实现优先级。是比较复杂的一个东西。写好不容易啊!
loseme915 2006-02-27
  • 打赏
  • 举报
回复
就是嫌麻烦,所以想找个现成的。
在写一个列表控件,要用到公式计算。哎!
lzzqqq 2006-02-27
  • 打赏
  • 举报
回复
从CEdit继承下来自己封装一个得了.
Jimmy_Xia 2006-02-27
  • 打赏
  • 举报
回复
没有碰到过类似问题,楼主可以看看编译原理的书,应该有所启发。
fisker0303 2006-02-27
  • 打赏
  • 举报
回复
2插树,自己搞嘛。
cpio 2006-02-27
  • 打赏
  • 举报
回复
用msscript.ocx,它可以干这事

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧