简单计算器课程设计报告.docx
- 文档编号:24615282
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:39
- 大小:491.46KB
简单计算器课程设计报告.docx
《简单计算器课程设计报告.docx》由会员分享,可在线阅读,更多相关《简单计算器课程设计报告.docx(39页珍藏版)》请在冰豆网上搜索。
简单计算器课程设计报告
简单计算器
1.基本功能描述
该简单计算器主要实现了双目运算和单目运算功能。
双目运算符包含基本的四则运算及乘幂功能,单目运算符主要包含正余弦,阶乘,对数,开方,倒数等运算,同时也包含角度制的转换、科学型与标准型的转换、输出设计者信息、清除、退格、退出功能。
简单计算器可对输入的任意操作数,包括小数和整数及正数和负数进行上述各种运算并能实现连续运算,并且能在出现错误时给出相应提示。
同时也可以操作与运算按钮相对应的菜单项。
2.设计思路
2.1相关说明
1)相关的变量标志位:
m_num:
与编辑框相关联的变量
num1:
作为临时变量储存当时按下的按钮值
num2:
作为临时变量储存编辑框的值
m_hudu:
角度制的标志位,为0时为弧度
m_jiao:
角度转换的临时变量
point:
bool值,小数点有无标志位,当值为ture时为有小数点
dianhou:
小数点后位数记录位
danshuang:
单双目运算符标志位
zhengfu:
bool值,作为正负数标志位,当为ture时为正数
2)主要功能设计简述:
该简单计算器的重难点主要在一个编辑框要实现输入和输出的显示,小数的实现,正负数的交替输入,退格时数的实现,单双目运算符的不同如何实现等方面。
其中单目运算符sin、cos、tan等要考虑角度转换,之后的运算和其他单目运算符没有差别,基于以上的考虑,想到必须对相关的操作进行相应的标志位,具体的如上列举。
简单计算器,在输入数据时,调用输入数据子程序。
子程序开始时m_num为零。
按下数字按钮后,判断m_num的值是否为小数,对其进行相关处理,然后再判断是否为正数,处理后输出结果。
在sin、cos、tan运算中首先利用角度转换的标志位m_hudu判断当时是度还是弧度,若是弧度可以直接调用函数进行相关计算,若是度则要进行角度的转换,在转换时要记得Pi首先记性宏定义,然后调用数学函数进行计算,最后对相关的各种标志位进行复位、并输出结果到编辑框。
流程图以sin运算为例。
双目运算符运算首先要进行单双目运算符标志位danshuang判断,若不为0,则直接调用等号的函数,可以完成上次的运算,并且同时用num2记录下与编辑框关联的变量m_num的值,同时也记录下此时danshuang标志位的值便于在等号函数中进行调用,在输入第二个操作数后,按等号进行对双目运算符的处理运算,各项复位,并输出结果到编辑框。
流程图以log运算为例。
整个计算器系统中,总的流程是:
输完第一个操作数后,若按下的运算符是双目运算符,则把m_num存入num2,按下输入第二个操作数并按下“=”按钮后算出结果。
若按下的是单目运算符,则直接对其输入数据进行处理得出结果。
在运算中还要判断运算是否合法(如log、ln等),以及结果是否超出显示范围,做出相关提示,按下清零,对各个标志位、编辑框的值等进行清零。
算出后把结果保存并输出显示。
若需要用算出的结果继续运算则回到输入完第一个操作数后继续进相应的流程,若不需要则判断试否需要开始新一轮的运算,不需要则结束。
2.2各块流程图
Y
N
N
图1输入子函数流程图
图2sin运算程序流程图
图3log运算流程图
图4总的流程图
3.软件设计
3.1设计步骤
打开MicrosoftVisualC++6.0应用程序,在文件菜单中点击新建,在弹出的对话框内选择MFCAppWizard[exe]工程,输入工程名liuyunlong,并找到你要保存的位置,点击确定。
如下图所示:
图5建立MFCAppWizard[exe]工程图
在弹出MFC应用程序向导-步骤1对话框中,选择基本对话框(D),若不用修改依次点击“完成”、“确定”按钮。
如下图所示:
图6创建应用程序类型图
此时就建立了一个基于对话窗口的应用程序的大致框架,包括界面、主要的头文件、实现文件等。
如下图所示:
图7对话框基本框架创建完成图
3.2界面设计
3.2.1添加图标
1)在图7所示的ResoureView选项卡中打开Icon资源组,在Icon上单击鼠标右键,在弹出的快捷菜单中选择引入选项,此时弹出“引入资源”对话框,选择要添加的图标,之后单击“引入”按钮,如下图所示:
图8引入图标资源对话框图
2)在Icon资源组中此时会出现一个新的图标项,ID:
IDI_ICON1,将原来的图标项IDR_MAINFRAME用“delete”键删除,鼠标右键单击IDI_ICON1在快捷菜单中选择属性项,在图标属性对话框中将新的图标ID改为IDR_MAINFRAME。
如下图所示:
图9图标属性对话框图
2.2.2添加控件
在图7所示的ResoureView选项卡中打开Dialog资源组,双击IDD_LIUYUNLONG_DIALOG,在右边的工作区中显示出要编辑的对话框。
将对话框中原有的按钮、静态文本框按“delete”键删除,之后开始摆放所需要的控件,包括编辑框和按钮。
按钮的添加以“0”为例,其他按钮类似。
1)在图7中控件的“按钮”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的按钮。
在按钮上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出PushButton属性对话框,在该对话框中输入ID号和标题。
如下图所示:
图10PushButton属性对话框图
2)在图7中控件的“编辑框”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,在该对话框中输入控件的ID值。
如下图所示:
图11Edit属性图
对应的按钮、编辑框属性如下表:
表1按钮和编辑框等对象属性表
控件
ID
标题或说明
编辑框
IDC_SHUCHU
结果显示
按钮
IDC_NUMBER0
0
按钮
IDC_NUMBER1
1
按钮
IDC_NUMBER2
2
按钮
IDC_NUMBER3
3
按钮
IDC_NUMBER4
4
按钮
IDC_NUMBER5
5
按钮
IDC_NUMBER6
6
按钮
IDC_NUMBER7
7
按钮
IDC_NUMBER8
8
按钮
IDC_NUMBER9
9
按钮
IDC_CHANGE
+/-
按钮
IDC_POINT
.
按钮
IDC_ADD
+
按钮
IDC_DIFFERENCE
-
按钮
IDC_MULTIPLY
*
按钮
IDC_DIVIDE
/
按钮
IDC_SGRT
sqrt
按钮
IDC_DAOSHU
1/x
按钮
IDC_JIECHENG
n!
按钮
IDC_LN
ln
按钮
IDC_SIN
sin
按钮
IDC_COS
cos
按钮
IDC_MI10
1O^x
按钮
IDC_LOG
Log
按钮
IDC_arcsin
asin
按钮
IDC_arccos
acos
按钮
IDC_EXP
exp
按钮
IDC_EQUAL
=
按钮
IDC_BACKSPACE
←
按钮
IDC_CLERA
C
单选框
IDC_RADIO_hudu
弧度
单选框
IDC_RADIO_jiaodu
度
3.2.3添加菜单
1)在图7所示的ResoureView选项卡中打开Icon资源组,鼠标右键单击liuyunlongresource,在快捷菜单中单击“插入”,弹出“插入资源”对话框,单击Menu选项,之后单击“新建”。
如下图所示:
图12插入资源对话框图
2)右键单击菜单项,修改菜单资源的ID为IDR_MENU,在工作区右键单击矩形框,选择属性,在标明里写要添加的菜单项名称,同时修改ID。
如下图所示:
图13添加的查看菜单项图
对应的菜单属性如下表:
表2菜单属性表
菜单选项
ID
=
IDC_EQUAL
.
IDC_POINT
+
IDC_ADD
-
IDC_DIFFERENCE
*
IDC_MULTIPLY
/
IDC_DIVIDE
sin
IDC_SIN
cos
IDC_COS
asin
IDC_arcsin
acos
IDC_arccos
Log
IDC_LOG
ln
IDC_LN
sqrt
IDC_SGRT
exp
IDC_EXP
1O^x
IDC_MI10
科学型
ID_MENU_kexue
标准型
ID_MENU_biaozhun
exit
ID_exit
关于计算器
ID_MENU_guanyu
3)帮助菜单弹出对话框:
右键单击Dialog,在快捷菜单中单击插入Dialog,确定,在新生成的对话框中加入静态文本框,并编辑相应的文字。
如下图所示:
图14帮助菜单项弹出的对话框图
根据以上操作最终的界面图:
图15最终界面的显示图
3.3关键功能的实现
1)界面颜色的改变:
首先重载对话框的CLiuyunlongDlg类的OnPaint()成员函数,即WM_PAINT消息。
利用GetClientRect()函数获取窗口客户区的坐标。
然后利用FillSolidRect成员函数用指定的固体色填充矩形,其中颜色由RGB函数进行设定。
2)窗口的伸缩的实现:
首先要在对话框中要伸缩的位置插入一个图像控件,将其拉成一条直线,并取消可见。
其次在实现文件里边定义两个静态变量,用来存储对话框尺寸信息。
为了实现第一次显示为标准型,所以获取显示尺寸和位置信息以及执行SetWindowPos函数的最佳时机应放在对话框创建之后,第一次显示之前。
为此利用WM_INITDIALOG消息的响应函数OnInitDialog来对对话框及控件进行相关的设置和修改。
该函数中利用GetDlgItem函数获得图像控件的窗口句柄,结合GetWindowRect函数得到图像控件的矩形框。
进而进行标准型参数的获取,利用SetWindowPos()函数完成对对话框的宽度、高度等参数的初始化设置。
最后添加相应的菜单响应函数,在响应函数里边利用SetWindowPos()函数完成对对话框的宽度、高度等参数的设置。
3)标准型和科学型选择标记的实现:
首先在对话框类的实现文件中添加ON_WM_INITMENUPOPUP入口到消息映射里面。
其次在对话框类的头文件中添加消息函数声明afx_msgvoidOnInitMenuPopup(CMenu*pPopupMenu,UINTnIndex,BOOLbSysMenu);
再次在对话框类的实现文件中添加相应的voidCLiuyunlongDlgOnInitMenuPopup函数代码,该段代码大部分取自WinFrm.cpp文件的函数CFrameWnd:
:
OnInitMenuPopup()。
最后在实现文件中定义两个全局的布尔型变量kexue、biaozhun,通过这两个变量的值判断执行的是标准型、科学型的哪一个,并给标准型和科学型菜单项添加相应的UPDATE_COMMAND_UI响应函数,在响应函数里调用SetRadio函数来进行标记。
4)帮助菜单中关于计算器菜单的实现:
首先创建新的对话框资源,在创建完对话框资源之后,生成一个相关的对话框类。
其次创建相应的菜单项资源,即添加帮助菜单,并添加相应的CAMMAND消息响应函数,在响应函数里边定义对话框类对象,调用DoModal函数。
5)操作数的实现:
首先通过小数标志位point判断当前是否有小数点,如果有用num1记录当前键入的数值,并将小数点后的位数标志位加一,利用for循环,实现该数在小数点哪一位,然后通过正负标志位zhengfu判断当前数值是正数还是负数,如果是正数直接将m_num和小数num1相加,如果是负号则m_num减去num1;如果没有小数点则直接判断该数的正负,若为正数则m_num乘10之后加上键入的数,若为负号则m_num乘10之后减去键入的数。
并把结果保存到m_num中,利用UpdateData(FALSE),刷新输出到编辑框。
6)退格键的实现:
首先判断当前数值是否是小数,如果不是小数则对编辑框里边的数进行除10操作,然后利用fmod进行取余操作,减去该十分位小数;当该数为小数时,利用小数点后的位数标志位dianhou进行for循环,移动小数点的位置,当只有十分位时停止,减去该位,再次利用for循环将小数点移至原来的数后面,用UpdateData(FALSE),刷新输出到编辑框。
7)清除键的实现:
将编辑框连接的变量m_num,所有的临时变量num1、num2,标志位dianhou、danshuang、point、zhengfu,进行清零复位操作即可。
8)角度值转换的实现:
利用单选按钮框,连接相应的变量m_hudu,标志当前是弧度值,还是一般的度,如果是一般的度,令m_jiao=1,如果是弧度,令m_jiao=(2*Pi)/360,用m_jiao作为角度值转换的临时变量,当前的编辑框值乘以m_jiao,进行转换,而在单选按钮响应函数中用UpdateData(true)更新数据到文档中。
9)单目运算符的运算实现:
首先对输入的数值判断是否合法,如开平方、取对数、取倒数等操作,不合法时输出响应的提示,合法时利用数学函数进行运算,并用m_num记录结果,判断结果是否超过double型的范围,若超过则输出提示,若没有超过就更新到编辑框,最后对标志位dianhou、point、zhengfu复位和临时变量num1清零。
10)双目运算符的运算实现:
首先判断单双运算符标志位是否为0,如果不为0,便调用等号的消息响应函数,实现上次的双目运算。
其次判断num2是否为0,若为0,便将此时编辑框的值赋给num2,再将m_num值置0,设置当前的双目运算符的标志,并将point、zhengfu、dianhou复位。
最后输入数据后,按等号键调用相应的消息响应函数,根据danshuang值来选择相应的算法,进行运算。
4.结论与心得体会
很快两周的时间就过去了,在这段时间里我真的是感触颇多,随着自己这两周的时间一步一步的推进,自己对基于对话框的编程也越来越系统化,真的可以说是获益良多。
这次课程设计是我们做的第三个课程设计,每一个课程设计之后真的是感觉自己取得了平时学习所不能达到的效果。
像以前的我做的带通滤波器的设计、叮咚门铃都使自己在电路理论、模电等方面的知识有一个很好的运用与实践,而这次的简单计算器的设计让自己对面向对象编程有一个更好的认识,对mfc编程的有了进一步的了解,并掌握了一些基本的功能的实现。
我做的简单计算器的设计是基于对话框的,这个计算器除了简单的加减乘除等运算,还要实现开方、指数、取对数、幂、正余弦等运算。
而实现这些功能尤其要注意的是单目运算符和双目运算符的区别以及小数、正负号实现方法。
当时想了好久,最后通过和同学的探讨,决定用相应的标志位对这些情况进行判定,如小数点用布尔值point进行标记,而dianhou标记小数点后的位数。
在这些最基本的功能完成之后,我想增加一些其他功能,为此我打开了电脑自带的计算器,看了一下界面,看到电脑自带的计算器能够进行窗口的伸缩,单击帮助信息,能够实现弹出一个对话框,显示该计算器的基本信息。
对于这个弹出的对话框我参考了课件里最后一章节在单文档中的实现方法,添加新的对话框资源,建立新的对话框类实现对话框的弹出。
而窗口的伸缩我在网上搜了一些资料,利用在对话框中添加一个图像控件将其拉成直线,获取该图像控件的位置,实现对话框的大小变化。
为了辨明此时选中的是标准型,还是科学型,我又想到在类型前加上点,也参考了课件里的单文档中的做法,添加UPDATE_COMMAND_UI响应函数,在响应函数里调用SetRadio函数来进行标记。
可是结果是当点击标准型或是科学型时没有丝毫的反应,当时根据课件看了好长的时间,进行修改仍是不行,后来无奈之下,求助于网上,看了资料后,我明白了,在单文档和多文档中的实现是一样的,可是对于对话框则有些不一样,原因就在于在一个基于对话框的程序中,因为没有OnInitMenuPopup函数,所以不会调用UPDATE_COMMAND_UI响应函数,而是使用了CWnd类的默认处理,为此就要将OnInitMenuPopup函数添加到实现文件里边。
之后再按课件里边的进行就可以了。
这次课设进行的真的是挺开心的,本来自己对编程就感觉挺有兴趣,对于这些东西老想做的更好一点,每次在添加完一个新功能之后自己就感觉很高兴,尤其是那些经过很长时间才解决的问题,给自己的印象更加的深刻。
在今后的学习中自己一定要把基础给打好,基本功扎实,同时也要善于思考,知道不同之间的联系,相同之间的差异,并进行总结,在以后再随后根据情况查询写相关的资料,来完成所要求的功能。
总的来说这次的课程设计既巩固了自己以前的MFC程序设计知识,也拓展了自己的思维,增加了自己的动手能力,最后也很感谢老师给我们的支持以及严格要求!
5.参考文献
[1]揣锦华.面向对象程序设计与VC++实践[M].西安电子科技大学出版社,2005.
[2]张建宏,汤练兵,马德骏.计算机程序设计基础-C语言程序设计[M].北京:
科学出版社,2009.
[3]姚领田.精通MFC程序设计[M].北京:
人民邮电出版社,2006.
6.思考题
1、程序中如何实现小数的显示与运算?
答:
首先在liuyunlongDlg.cpp实现文件中定义一个布尔型变量point来判断是否为小数,定义一个整型变量dianhou记录小数点后的位数。
当输入数时首先判断point是否为true,若为true表示该数是小数,用num1记录当前的键入值,同时对dianhou进行加一,根据dianhou进行for循环,进行除以10操作,再根据该数的正负,来决定是m_num加num1,还是减num1,用UpdateData(FALSE)刷新输出到编辑框。
在实现退格功能是,若point为true,则根据dianhou的值循环对m_num乘以10,将小数点移到只有十分位,利用fmod取余,将编辑框的变量值减去该余数,最后再进行循环将小数点移到原来数字的后边。
2、描述等号对应的消息处理函数中需要处理的问题及相应的实现代码?
答:
等号对应的消息处理函数主要处理双目运算符的运算。
利用单双目运算符的标志位danshuang,判断其值选择相应的双目运算符的算法表达式进行运算,这些双目运算按顺序依次为:
加法、减法、乘法、除法及取对数。
其中在除法和取对数运算中还要判断操作数是否合法,如果不合法输出提示内容,如果合法进行运算。
然后对结果判断是否超过double型数据的显示范围,若超过也输出提示信息。
最后对相应的标志位进行复位。
实现代码如下:
switch(danshuang)//数据判断
{
case1:
m_num=num2+m_num;//两数相加
UpdateData(FALSE);//数据刷新
break;
case2:
m_num=num2-m_num;//两数相减
UpdateData(FALSE);//数据刷新
break;
case3:
m_num=num2*m_num;//两数相乘
UpdateData(FALSE);//数据刷新
break;
case4:
if(m_num==0)//在除法中,判断除数是否为0
GetDlgItem(IDC_SHUCHU)->SetWindowText("输入错误,0不能作除数!
");
else{m_num=num2/m_num;UpdateData(FALSE);}
break;
case5:
if(m_num<=0||num2<=0)//判断操作数是否合法
GetDlgItem(IDC_SHUCHU)->SetWindowText("输入错误,取对数要为正数!
");
else{m_num=log(m_num)/log(num2);UpdateData(FALSE);}//取对数
break;
}
if(m_num>=1.7E308||m_num<-1.7E308)
GetDlgItem(IDC_SHUCHU)->SetWindowText("结果过大,无法显示");
num2=m_num;
num1=0;
dianhou=0;
point=FALSE;
danshuang=0;
zhengfu=TRUE;
3、(选做)若实现了科学型和标准型,说明科学型和标准型实现的关键算法?
答:
我做的科学型和标准型的实现方法和指导书上的推荐方法不同,指导书推荐的方法是通过单选按钮,当选择科学型时进行科学型的按钮被激活,可以运算,当选择标准型的时候进行科学型的按钮不能进行运算。
而我的实现方法是选择伸缩框,初始时是标准型,界面上只有数值和简单的加减乘除等运算按钮,当单击科学型时,对话框进行了扩展,出现了可以科学型运算的部分。
主要的实现方法:
首先要在对话框中要伸缩的位置插入一个图像控件,将其拉成一条直线,并取消可见。
其次在实现文件里边定义两个静态变量,用来存储对话框尺寸信息。
为了实现第一次显示为标准型,所以获取显示尺寸和位置信息以及执行SetWindowPos函数的最佳时机应放在对话框创建之后,第一次显示之前。
为此利用WM_INITDIALOG消息的响应函数OnInitDialog来对对话框及控件进行相关的设置和修改。
该函数中利用GetDlgItem()函数获得图像控件的窗口句柄,结合GetWindowRect()函数得到图像控件的矩形框。
进而进行标准型参数的获取,利用SetWindowPos()函数完成对对话框的宽度、高度等参数的初始化设置。
最后添加相应的菜单响应函数,在响应函数里边利用SetWindowPos()函数完成对对话框的宽度、高度等参数的设置。
7.附录
7.1调试报告
1、errorC2296:
'%':
illegal,leftoperandhastype'double'
解决办法:
因为取余数的运算符%只能用于整数,不能用于浮点数,经过查询资料知道用fmod可进行取余运算。
2、在阶乘运算代码中用“elseGetDlgItem(IDC_SHUCHU)->SetWindowText("不是整数无法进行阶乘运算");UpdateData(FALSE);//数据刷新”不能输出相应的提示语句。
解决办法:
主要是因为在提示语句输出后,立即进行了编辑框的刷新,将其覆盖,所以将updateData(FALSE)提前即可
3、在进行角度制转换的时,相应的资源和代码完成之后,运行发现刚开始没有选中标准型和科学型的任何一个。
解决办法:
经分析应该是没有对单选按钮相关联的变量没有进行初始化,在CLiuyunlongDlg:
:
CLiuyunlongDlg(CWnd*pParent/*=NULL*/):
CDialog(CLiuyunlongDlg:
:
IDD,pParent)中加入m_hudu=0,进行初始化后得以解决。
4、运行时出现以下提示“liuyunlongMicrosoft基础类应用程序已停止工作(出现了一个问题,导致程序停止正常工作。
请关闭改程序”。
解决办法:
应该是新加的扩展与收缩对话
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 计算器 课程设计 报告