mfc编写计算器程序

上传人:夏** 文档编号:507033000 上传时间:2023-01-14 格式:DOCX 页数:63 大小:311.12KB
返回 下载 相关 举报
mfc编写计算器程序_第1页
第1页 / 共63页
mfc编写计算器程序_第2页
第2页 / 共63页
mfc编写计算器程序_第3页
第3页 / 共63页
mfc编写计算器程序_第4页
第4页 / 共63页
mfc编写计算器程序_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《mfc编写计算器程序》由会员分享,可在线阅读,更多相关《mfc编写计算器程序(63页珍藏版)》请在金锄头文库上搜索。

1、计算器的介绍(1) 在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:AC764130转化为二进制转化为十六进制后退sinc o 图 1.1 计算器界面(2) 在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以 通过键盘和单击按钮 2 种方式输入,输入后的结果如下图所示:三计算暮X图1.2输入表达式后的界面在输入完表达式后,单击“二”后,开始对表达式进行计算,计算完成后,在编辑框中显示计圧计算器算的结果。转化为二进制4.000000转化为十六进制图1.3计算后的结果(4) 计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数, 再单

2、击按钮“转化为二进制”或“转化为十六进制。图 1.4 输入一个十进制数100图 1.5 100转化为二进制后的结果图 1.6 100转化为十六进制后的结果(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果1算法的实现2.1 把字符串转化为数字和运算符的算法(1)如果字符串中只有数字。这个情况用来实现一些简单函数的运算。在进行简单函数的运算时,都是先输入一个数字,再单击要进行运算的按钮,然后编辑框显示运算的结果。程序用了一个函数double GetaStr(CString str

3、)来实现这个功能,该函数以编辑框变量m_strResult为头参,再得到m_strResult的值后,调用GetAt函数,一个字符个字符的读取如果碰到整数,执行 itemp二itemp*rate+(str.GetAt(i)-O);,其中变量 itemp 初始值为 0 ,变量rate初始值为10,如果碰到了小数点,改变 rate的值,使其等于0.1,再向后继续读 取,再碰到整数时执行itemp二itemp+rate*(str.GetAt(i)-O);rate二rate/10;,函数的最后确定返回值为 itemp。以下是这个函数的代码必:double CMyDlg:GetaStr(CString

4、str)int i=0;double rate=10.0,itemp=0.0;for(;istr.GetLength();i+)if(isdigit(strGetAt(i)如果字符串 str.GetAt(i)的内容是整数if(rate=100)/整数部分itemp=itemp*rate+(strGetAt(i)-0); /获得整数else/小数部分 itemp=itemp+rate*(strGetAt(i)-0); /获得小数rate=rate/10;/每次让 rate 小 10 倍else if(str.GetAt(i)=)rate=0.1;如果 strGetAt(i)是小数点/让rate=

5、0.1,开始计算小数部分return (itemp);如果字符串中有运算符和数字,但是没有括号。程序调用函数void GetStr(CString str),这个函数 的前半部分和函数void GetaStr(CString str)样,都是获取数字的算法,但是因为表达式中可能有多个数 字和运算符,所以我们需要定义 2 个数组,分别用来存放数字和运 算符,当读取字符遇到运算符时, 把变量itemp的值保存在数组a中,并把0赋给itemp,把10赋给rate,把运算符保存在数组b中。当不在碰到运算符号时,把最后一个整数itemp的值数组a 中,把z的值赋给s。(Z的值表示运算符加数字一个有多少个

6、,把这个值赋给s,可以在以后的计算中, 控制循环的条件,避免造成不必要的误差。 )这个函数的代码如下:void CMyDlg:GetStr(CString str)int i=0,z=0;double rate=10.0,itemp=0.0;for(i=0;i20;i+) ai=1000000.0;for(i=0;i10;i+)bi= ;i=0;for(;istr.GetLength();i+)if(isdigit(str.GetAt(i)if(rate=10.0)/对数组a20初始化/对数组b10初始化/把 0赋给 i如果字符串str.GetAt(i)的内容是整数itemp=itemp*ra

7、te+(strGetAt(i)-O);获得整数次让 rate 小 10 倍elserate=rate/10;else if(str.GetAt(i)=.)rate=0.1;else if(str.GetAt(i)=+)az=itemp;itemp=0;/小数部分itemp=itemp+rate*(strGetAt(i)-O); 获得/如果 str.GetAt(i)是小数点让rate=0.1,开始计算小数部分如果是加号让z自加一次/把加号放入字符数组b中让z自加一次else if(strGetAt(i)=-)/如果 str.GetAt(i) 是减号az=itemp;itemp=0;Z+;让z自加

8、一次bz=-;/把减号放入字符数组b中z+;/让z自加一次把itemp的值放入双精度数组a中,并把itemp的值改为0rate=100;把10赋给rate,确保读取下个数字时,先计算整数部分else if(strGetAt(i)=*)/如果 str.GetAt(i) 是乘号az=itemp;itemp=0;/把 itemp 的值放入双精度数组 a 中,并把 itemp 的值改为 0 z+;/让 z 自加一次bz=*;/把减号放入字符数组 b 中z+;让z自加一次rate=100;把10赋给rate,确保读取下个数字时,先计算整数部分else if(str.GetAt(i)=/)如果 str.G

9、etAt(i)是除号az=itemp;itemp=0;/把 itemp 的值放入双精度数组 a 中,并把 itemp 的值改为 0 z+;让z自加一次bz=/;/把除号放入字符数组b中/把 itemp 的值放入双精度数组 a 中,并把 itemp 的值改为 0z+;bz=+;z+;rate=100;把10赋给rate,确保读取下个数字时,先计算整数部分z+;/让 z 自加一次rate=10.0;把10赋给rate,确保读取下个数字时,先计算整数部分az=itemp;把最后一个整数itemp的值放入双精度数组a中s=z;把z的值赋给变量s,用来控制计算结果的循环中的条件如果字符串中有括号。程序用

10、函数void Bracket(CString strO)来解决括号问题/同样,函数以编辑框 变量m_strResult为实参,主要思想是把m_strResult先分成3个字符串,比如一个表达式2*(2+3)-6,这 个函数的目的是先把表达式2*(2+3)-6分成2*、2+3、-6三个字符串,再计算2+3后,把结果覆盖掉2+3 所在的字符串,最后把 3个字符串相加,这样就处理掉了括号的问题。具体实现的算法:定义 3个 字符串变量 str1、str2、str3?0三个变量都初始化为空变量,现在开始一个循环,当没有遇到字符“ (”时,把每次得到的字符都加在 字符串str1上,当遇到字符“(”时,把“

11、(”后的字符都加在字符串str2 上,直到遇到字符“)”。当遇 到字符)时,把“)后的字符都加在字符串str3上,str2再调用函数计算出它的表达式的值,最后把 3个字符串相加,这就解决了括号问题。该函数代码如下:void CMyDlg:Bracket(CString str0) CString str1=,str2=,str3=; int i=0;for(;istr0.GetLength();i+)nlnyge旺 Kzs 三EsSS&FR 藹-担一曹咪吕、 血也出列豁煤旺味吕皿三盟WH丽聶吳owsawonsH+Tt:7+HolIPGUQTiQwo%VoOJ+( 【(2saoou+ss 空 e

12、aiq ( H HelseEroAS* (十+xo56ue*iQo2t;Vs+ (JFHswwog-+wmgffiK坡田去 zz宀 4_ns Hi3sE mtsztsxts 良、 mts+ zt;+IH%H 43soo!t:lul乍的册塚邢只芒擦oeBCITnlpys皿-fr4_nseH4sE吕、a2.5s%)右 Eo气3%: (JFHewwo邑! (+X0 上 46uQ7J2w0t:v X0.1LHOJ643saJaoxssewOHY+l-l%;了,表达式的计算首先要考虑优先级的问题,这里先把所有的除法转化为乘法,再把除法后的数字取 它的倒数,接下来就是进行乘法计算,每次乘法计算后都把计算的结果保存在计算的 2个数中的前面 的那个数上,并把乘号和后面的数字删除。进行完乘法运算后,进 行一次循环,重新整理下数组,最 后进行加法和减法运算。函数代码如下:void CMyDlg:GetResult()int i=0,x=0,y=1,t,z=1;for(i=0;i=s;i+)/当循环遇到除号时/把 ai+1 的值改为 1/ai+1/把 bi 的值改为乘号if(bi=/)ai+1=1/ai+1; bi=*;/这个循环可以对所有乘法进行计算for(i=0;i=s;i+)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号