计算器设计报告.docx
《计算器设计报告.docx》由会员分享,可在线阅读,更多相关《计算器设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
![计算器设计报告.docx](https://file1.bdocx.com/fileroot1/2023-5/31/0112941a-eb33-4eb3-98ea-3fa809ec6553/0112941a-eb33-4eb3-98ea-3fa809ec65531.gif)
计算器设计报告
一、项目简介
本设计将实现一个简单计算器。
其功能参照Windows附件中自带的计算器。
这个计算器实现了简单的四则运算功能,还实现了模运算和指数运算,具有简洁的图文外观。
它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互让使用人员能快捷简单地进行操作。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间。
在课程设计中,系统开发平台为Windows7,程序设计设计语言采用VisualC++,在程序设计中,采用了面向对象的解决问题的方法。
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。
在程序设计中,可以用面向对象程序设计方法解决问题。
由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。
而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。
二、功能介绍
它的设计按软件工程的方法进行,系统具有良好的界面;必要的交互信息;简约美观的效果。
使用人员能快捷简单地进行操作。
即可单击按钮进行操作。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
(1)包含的功能有:
加、减、乘、除运算,开方、求模等功能.
(2)计算器上数字0——9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据和结果都显示在窗口顶部的同一个标签中。
(4)计算功能基本上是用公式计算方法实现。
(5)程序可以能自动判断输出数据的正确性,保证不出现结果中以0开头等不正常现象。
功能模块的实现:
基于dialog类添加Caculator类,在这个类中实现高级的按钮控件。
在此类中对于所有的对于按钮的绘制工作都是在对话框资源管理中完成的,实现按钮对鼠标单击动作执行不同的计算,在UpdateData(false)函数后显示文本。
三、系统实现概述
1、窗体设计
打开MicrosoftVisualC++6.0,在文件中点击新建,在弹出框内选择MFCAppWizard[exe]工程,输入工程名Calculator及其所在位置,点击确定,如图1所示。
图1
将弹出MFC应用程序向导-步骤1对话框,选择基本对话框,点击完成,如图2所示。
图2
这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图3所示。
图3
2、编辑资源
(1)编辑对话框及控件资源
在图5所示的ResoureView选项卡中打开Dialog资源组,双击IDD_CALCULATOR_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
而按钮的创建则以“1”为例进行介绍,其他按钮的创建可参照以下步骤进行操作。
a)在图5中Controls的
编辑框按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图4所示,在该对话框中输入ID属性。
图4
b)在图3中Controls的
按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。
在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出PushButton属性对话框,如图5所示,在该对话框中输入控件的ID值和标题。
图5
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
利用VisualC++提供的资源编辑器对对话框资源进行编辑。
删除对话框中默认的OK和Cancel按钮。
添加一个Edit控件,其控件ID为IDC_EDIT1。
添加若干按钮控件,其ID如表a所示。
按钮名称
按钮ID
用途
0
IDC_0
按键0
1
IDC_1
按键1
2
IDC_2
按键2
3
IDC_3
按键3
4
IDC_4
按键4
5
IDC_5
按键5
6
IDC_6
按键6
7
IDC_7
按键7
8
IDC_8
按键8
9
IDC_9
按键9
.
IDC_POINT
小数点
=
IDC_EQUAL
等号
+
IDC_ADD
加号
-
IDC_MINUS
减号
*
IDC_MUTIPLY
乘号
/
IDC_DIVID
除号
Backspace
IDC_BACKSPACE
退格
√
IDC_SQUAREROOT
开方
%
IDC_PERCENT
百分号
1/x
IDC_RECIPROCAL
倒数
帮助信息
IDC_HELP
帮助信息
+/-
IDC_SIGN
相反数
Mod
IDC_MOD
求余
n!
IDC_FACTORIAL
n的阶乘
Sin
IDC_SIN
正弦函数
Cos
IDC_COS
余弦函数
Tan
IDC_TAN
正弦函数
Log
IDC_LOG
常用对数函数
Ln
IDC_LN
自然对数函数
x^y
IDC_POWER
以x为底的y次幂
二进制
IDC_CHANGE
十进制转为二进制
And
IDC_AND
逻辑运算符
Not
IDC_NOT
逻辑运算符
Or
IDC_OR
逻辑运算符
Xor
IDC_XOR
逻辑运算符
π
IDC_PI
圆周率
00
IDC_HUNDRED
乘百
表a
完成后界面如图6所示。
图6
(2)连接变量和代码
a)给编辑框连接变量。
在编辑框上单击鼠标右键,在弹出菜单中选择建立类向导菜单项,弹出MFCClassWizard对话框,选择MemberVariables选项卡,如图7所示。
图7
在ControlIDs列表框中选择IDC_DISPLAY,单击AddVariables按钮,在弹出的对话框中连接变量m_edit_value。
变量类型设定为CString型。
如图8所示。
图8
b)给“1”按钮连接代码。
在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择MessagesMaps选项卡,然后在ObjectIDs列表框中选择IDC_1,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图9所示。
图9
(3)菜单的设计
选择插入/资源命令,将显示插入资源对话框。
如图10所示。
选择Menu,点击新建即可。
图10
ResoureView选项卡中打开Menu资源组,双击IDR_MENU1,然后给菜单添加相应的标题,并把每个菜单对应的ID值与相应的按钮的一致。
如图11所示。
图11
在对话框的任何一个空白域单击鼠标右键,然后在弹出的快捷菜单中选择属性命令,弹出对话属性对话框,如图12。
在对话框中的菜单组合框中选择IDR_MENU1。
图12
最终的得到的界面如图13。
图13
四、关键技术
(1)操作数的输入
编辑框所关联的变量为m_temp,程序开始时为零。
每按下一个数字键按钮,就把它累加到m_temp里并刷新显示。
BOOL型变量UpdateData来判断是否有小数点和一个整型数dint来表示小数点后的数据的位数。
当UpdateData=TRUE时,表示有小数点,否则则表示无小数点。
按下小数点按钮后执行UpdateData=TRUE。
当按下一个数字键时,首先根据ele判断是否按下小数点,若有则把小数点后数的位数加1,dint则为此次键入的数所处的位数,将键入的数除以dint个10然后累加到编辑框所关联的变量m_temp上,若没有则把m_temp乘以10,然后累加到编辑框所关联的变量m_temp上。
BOOLCCalculatorDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
OperatorPressed=FALSE;
After=FALSE;
m_edit_value="0";
value1=0,value2=0,result=0;
Restarted=TRUE;
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
(2)单目运算符功能的实现
由于单目运算符中必须有执行运算的函数,因而头文件中要加入math.h,如m_temp=sqrt(m_temp).按下按钮即可实现其功能。
voidCCalculatorDlg:
:
OnSquareroot()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
doublem_temp=atof(m_edit_value);//将字符串类型的m_edit_value转化为浮点数类型的m_temp
if(m_temp>=0)
{
m_temp=sqrt(m_temp);//求开方
m_edit_value.Format("%g",m_temp);//将m_temp的值返回到m_edit_value中,默认精度为六位
UpdateData(false);
}
else
{
MessageBox("负数不能开方");
}
}
(3)双目运算符功能的实现
双目运算符需要两个操作数才能运算,所以在执行双目运算符按钮的函数代码中,要把m_temp中的值保存到变量temp2中,然后把m_temp清零。
这样即可保存第一个操作数。
另外先定义了一个整形变量addt,在不同的双目运算符中给addt赋不同的值,然后在等号中用switch语句来匹配addt值来判断需要执行何种双目运算。
为实现连续运算,程序有所改动,参见(6)。
(4)退格键功能的实现
当按下一次退格按钮时,若m_temp为整数,只需对其中数据除以10再取整即可,若按下一次退格按钮为小数,则根据小数点后数据的位数dint进行操作,先对m_temp执行(dint-1)次乘以10运算,然后取整,接着执行(dint-1)次除以10的运算即可。
完成后需要把dint将减小1。
voidCCalculatorDlg:
:
OnBackspace()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
charstr[256];
intlength;
length=m_edit_value.GetLength();//得到m_edit_value的长度,赋给length
for(inti=0;i{
str[i]=m_edit_value.GetAt(i);//将m_edit_value中(除最后一个)每个位置的值赋给str
}
m_edit_value.Format("%g",atof(str));//将字符串类型的str转化为浮点数类型,并返回给m_edit_value
UpdateData(false);
}
对于单目运算符:
每次运算完之后都会对m_temp清零,因此其结果也要赋给temp2,下次运算是则会用到num2,于是第一次运算时直接将m_temp的值赋给temp2,对其进行运算。
以开根号为例,在消息处理函数代码中将“m_temp=sqrt(m_temp);”改为“temp2=m_temp;m_temp=sqrt(temp2);temp2=m_temp;”。
但是第一次运算执行完成之后m_temp被清零,所以之后将m_temp的值不能赋给temp2,代码改为“if(m_temp>=0)m_temp=sqrt(temp2);temp2m_temp;”。
其他单目运算符同理。
为实现连续运算是不需要按下等号即可实现,又在所有的运算符按钮的消息处理函数代码前加上了“if(addt!
=0)Onequal();”。
既若之前有按下双目运算符和两个操作数则连续运算再按下任一运算符时会自动调用等号的处理函数将上次的运算完成并保存结果方便下一次的运算。
五、进一步的设想
根据实验结果,本设计基本完成了设计要求,但是由于键盘数目的限制,数码数目的限制使得这个计算器不能拥有强大的计算功能。
还有就是考虑到课程时间的限制和本人技术的水平,没有更多的完善系统功能,而是尽量简单的设计。
如果有时间和更多的经历投入,相信本设计可以达到更好的功能。
例如:
1、一键清空按钮
2、动态设置计算器大小
3、拥有历史数据记忆
4、对弧度、梯度的运算
5、更多的数进制转换
6、一些统计函数的运算
6、个人贡献
几个星期的课程设计以后,根据老师的指导书与讨论小组的共同努力,终于把这个简易的计算器完成了。
在整个工作任务中,我负责了图形设计这个部分,跟MFC打了一下交道。
尽管跟windows附件里的计算器外观差远了,但我还是尽量把它做得“人性化”一点。
犹记得接到课程设计任务之后,毫无经验,幸亏下课时与一些同学一起围观老师之后,得知参考丛书里面含有MFC,因此就去泡图书馆,一心想找到与自己课题有关的书籍。
通过不断的筛选,终于在我们学校的图书馆里找到了所谓的“神器”。
一个不懂得好好使用他的工具的话,就算他找到的是“神器”也没有用。
由于鄙人资质不足,之后通过上网的渠道,边用边学边理解,终于也根据要求完成了界面的设计,并且尝试去连接一些代码。
总的来说,接触新鲜的事物,总是充满激情。
如今,该是开香槟的时候了。