分享
 
 
 

基于表达式计算的科学计算器

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

基于表达式计算的科学计算器

作者: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);

}

首先的Macro(&strExp)是将表达式中的所有常数符号代换为相应的字数字串;

接着的所谓对表达式两边加上保护括号实际上是为了方便对表达式的处理,因为按照上面所讲的思路,后面的二三步其实就是一个对不含括号的表达式的计算过程,这个过程可以放到第一步里面去执行,这样整个对表达式的计算过程就成了一个不断去括号,计算括号内的表达式的过程。为整个表达式加上一对括号就使得我们可以做这样一个以上形式的循环,则最后一个循环就是对整个表达式的计算。

在while循环过程中,SynRes(&strExp)用于检查表达式中是否有ERROE标记,有的话说明用户所输入的表达式有语法错误或是表达式的结果有错(如计算中遇到了除数为0的情况)。最后的ModiResult(strExp)中对表达式结果的一个格式化,如将结果科学记数化、提取错误信息等。

既然是对字符串表达式求值,整个处理过程中少不了的就是字串到数值,数值到字串的相互转换,前者我主要是使用了strtod函数,后者主要是使用了_ecvt函数,这两个函数在MSDN中可以查到,这里我就不细说了。当然转换过程光用这两个函数还不够,还要有对错误表达式的一些控制过程,具体请看源代码。

三、结束语

大概情况就是如此,具体的函数处理过程可以参见源代码,大家有什么问题或指正可以与我联系,谢谢!

四、代码更新说明

有的网友发邮件给我指出了其中的不足之处,如没有处理好连加连减或加减号混合出现的情况(如:1++++1,1----1,--+-+-+1-+-++++---1)。我也发现了这个问题,所以重写了其中的MultiE(CString

*strExp)计算函数。同时应一些网友的议建,加入了对结果的十六、八、二进制转换(以前只能在计算过程中转换)。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有