首页 / 软件开发 / C++ / 基于表达式计算的科学计算器
基于表达式计算的科学计算器2010-11-29 vckbase Gamsn同诸多网友一样,受益于VCKBASE,觉得应为他做点贡献了,于是做了这么一 个基于表达式求值的科学计算器与各位爱好的朋友分享。如您所知,这方面的程序很多,看过ZF.Yi的相关作品,也见过黄江峰的相关 程序,但我觉得我的计算类有不同于二位的特色,如计算结果的有效位较长(16 位);支持不严格的表达式输入(如cos(23)*sin(34)与cos(23)*sin(34与 cos23*sin34等价);支持四种进制的数在一个表达式中同时出现的进制混合运 算(除十进制外的各进制数不限于整数,如12d.3axh,xh是我的计算类所能识别 的十六进制数的标识符);且程序做得也比较精细(如制作了鼠标键盘、窗口跟 随、计算历史查看等),这才使我觉得拙作不致于滥竽充数,相信网友们看了会 另有收获的。一、简单的思路是这样的:对于用户输入的表达式,1.将其中的括号按从里到外,从左到右的顺序找到第一对,提取其中的表达 式;2.将表达式中的所有一元计算部分编译计算出结果再转换成字串放回表达式 中;3.将其中的所有二元计算部分编译计算出结果再转换成字串放回表达式中。4.回到第一步,除非表达式中没有括号了。二、实现代码的一些说明:以下是计算类中的一个主过程函数:CString CCalculation::MainPro(CString strExp)
{
if(strExp.IsEmpty()) return "表达式不能为空";
Macro(&strExp);
strExp.MakeLower(); //表达式全部小写
/**********给表达式加上保护括号************/
strExp.Insert(0,"(");
strExp+=")";
/******************************************/
int pos=strExp.Find(" ");
int n=BraCheck(strExp);
CString str;
str.Format("%d",abs(n));
if(n==1) strExp+=")";
else if(n==-1) strExp.Insert(0,"(");
else if(n>0) return "缺少"+str+"个右括号 ";
else if(n<0) return "缺少"+str+"个左括号 ";
while(pos!=-1) //去掉表达式中的空格符
{
strExp.Delete(pos);
pos=strExp.Find(" ");
}
Oct2Dec(&strExp); //将表达式中的八进制数转换成十进制
Hex2Dec(&strExp); //将表达式中的十六进制数转换成十进制
Bin2Dec(&strExp); //将表达式中的二进制数转换成十进制
while(!IsDigital(strExp))
{
DelBracket(&strExp);
if(!SynRes(&strExp)) return strExp;
}
if(!SynRes(&strExp)) return strExp;
else return ModiResult(strExp);
}