C++简单计算器毕业课程设计报告定稿文档格式.docx
《C++简单计算器毕业课程设计报告定稿文档格式.docx》由会员分享,可在线阅读,更多相关《C++简单计算器毕业课程设计报告定稿文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
图1输入数据子函数流程图
图2简单计算器总流程图
3软件设计
3.1设计步骤
打开MicrosoftVisualC++6.0,在文件中点击新建,在弹出框内选择MFCAppWizard[exe]工程,输入工程名09107xuzhujie及其所在位置,点击确定,如图3所示。
图3新建MFCAppWizard[exe]工程
将弹出MFCAppWizard-step1对话框,选择基本对话框,点击完成,如图4所示。
图4基本对话框
这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图5所示。
图5新建的对话框
3.2界面设计
1、创建控件
在图5所示的ResoureView选项卡中打开Dialog资源组,双击IDD_09107xuzhujie_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。
1)在图5中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。
图6Edit属性对话框
2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。
在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出PushButton属性对话框,如图7所示,在该对话框中输入控件的ID值和标题属性。
图7PushButton属性
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表1各按钮和编辑框等对象的属性
对象
ID
标题或说明
编辑框
IDC_xianshi
结果显示
按钮
IDC_BUTTON0
IDC_BUTTON1
1
IDC_BUTTON2
2
IDC_BUTTON3
3
IDC_BUTTON4
4
IDC_BUTTON5
5
IDC_BUTTON6
6
IDC_BUTTON7
7
IDC_BUTTON8
8
IDC_BUTTON9
9
IDC_change
+-
IDC_point
.
IDC_add
+
IDC_difference
-
IDC_multiply
*
IDC_devide
IDC_sqrt
sqrt
IDC_daoshu
1x
IDC_jiecheng
n!
IDC_ln
ln
IDC_sin
sin
IDC_cos
cos
IDC_pow
x^y
IDC_Onequal
=
IDC_backspace
Backspace
IDC_Onclear
Clear
完成后界面如图8所示。
图8计算器界面
2、连接变量和代码
1)给编辑框连接变量。
在编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFCClassWizard对话框,选择MemberVariables选项卡,如图9所示。
图9MFCClassWizard对话框中的MenberVariable选项卡
在ControlIDs列表框中选择IDC_xianshi,单击AddVariables按钮,在弹出的对话框中连接变量m_num。
变量类型设定为doubel型。
如图10所示。
图10m_num属性设置
2)给“1”按钮连接代码。
在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择MessagesMaps选项卡,然后在ObjectIDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图11所示。
图11“1”按钮链接代码对话框
3、菜单的设计
选择插入资源命令,将显示插入资源对话框。
如图12所示。
选择Menu,点击新建即可。
图12插入资源对话框
ResoureView选项卡中打开Menu资源组,双击IDR_MENU1,然后给菜单添加相应的标题,并把每个菜单对应的ID值与相应的按钮的一致。
如图13所示。
图13菜单属性对话框
在对话框的任何一个空白域单击鼠标右键,然后在弹出的快捷菜单中选择Properties命令,弹出DialogProperties对话框,如图14。
在对话框中的菜单组合框中选择IDR_MENU1。
图14对话属性对话框
最终的得到的界面如图15。
图15计算器完整界面
3.3关键功能的实现
1)操作数的输入
编辑框所关联的变量为m_num,程序开始时为零。
每按下一个数字键按钮,就把它累加到m_num里并刷新显示。
BOOL型变量ele来判断是否有小数点和一个整型数dint来表示小数点后的数据的位数。
当ele=TRUE时,表示有小数点,否则则表示无小数点。
按下小数点按钮后执行ele=TRUE。
当按下一个数字键时,首先根据ele判断是否按下小数点,若有则把小数点后数的位数加1,dint则为此次键入的数所处的位数,将键入的数除以dint个10然后累加到编辑框所关联的变量m_num上,若没有则把m_num乘以10,然后累加到编辑框所关联的变量m_num上。
2)单目运算符功能的实现
由于单目运算符中必须有执行运算的函数,因而头文件中要加入math.character'
0xa3'
C:
\DocumentsandSettings\周同\桌面\09107xuzhujie\09107xuzhujieDlg.cpp(230):
errorC2018:
unknowncharacter'
0xbb'
\DocumentsandSettings\周同\桌面\09107xuzhujie\09107xuzhujieDlg.cpp(231):
errorC2143:
syntaxerror:
missing'
;
'
before'
if'
”
原因为分号是在中文输入法状态下输入,将其改为英文输入状态下了分号即可。
2、重做时调用其他工程中的对话框资源后编译链接运行后还是本来有的那个对话框,后来将原先的对话框资源删除并将调用的对话框的ID改为原先的对话框的ID,再次编译链接运行之后没有反应了,经过多次摸索发现调用过来的对话框是关联了菜单了,而新建的工程里没有菜单,因此将调用的对话框取消与菜单的关联,再次再次编译链接运行之后一切正常。
3、用GetDlgItem(IDC_NAME_EDIT)->
SetWindowText("
"
);
来提示操作错误时,总是没有任何效果,经老师帮助得以解决。
因为UpdateData(FALSE)是将变量传到前台显示,SetWindowText就是设置前台显示的新内容。
所以在SetWindowText后如果还有UpdateData(FALSE)则其效果会被后者覆盖,因此程序中SetWindowText之后不用UpdateData(FALSE)即可。
4、当操作数超过10位数时,用backspace会出现错误结果,一番研究研究发现用int(m_num)取整有问题,int只有4个字节,当超过其范围时就会出错。
因此将取整的方法改为先用fmod取其除以1的余数得到其小数位,然后用m_num减去其小数位即可。
7.2测试结果
1.输入“90.5”,“-”,“60.7”,“+”,“2.36”,“=”,并在菜单中同样输入这组操作,均得到结果如图16。
图16结果图1
结果正确,证明可以实现双目运算符的连续运算,菜单功能正常。
2.输入“901”,“+-”,“backspace”,“+”,“120”,“sin”,结果如图17.
图17结果图2
因为π取的是3.,因此与0.5有小小偏差,认为结果正确。
证明可以实现单目运算符的连续运算与backspace回格功能。
3.输入“0”,“ln”,结果如图18.
结果图18
证明错误提示功能实现正常。
7.3关键源代码
1、09107xuzhujieDlg.!
键的程序:
if(m_num!
=0)num2=m_num;
if(fmod(num2,1)==0)
{m_num=1;
for(i=1;
i<
=num2;
i++)m_num*=i;
对数进行求阶乘
UpdateData(FALSE);
数据刷新
num2=m_num;
if(m_num>
=1.7E308||m_num<
-1.7E308)
GetDlgItem(IDC_xianshi)->
结果过大,无法显示"
}
elseGetDlgItem(IDC_xianshi)->
不是整数无法进行阶乘运算"
m_num=0;
num1=0;
dint=0;
ele=FALSE;
ele2=TRUE;
8、1x键的程序:
if(num2!
=0)
{
m_num=1.0num2;
对数进行求倒数
数据刷新
}
错误,0不能求倒数"
9、sin键的程序:
(cos的代码类似)
m_num=sin(num2*3.180);
对数进行正弦
10、ln键的程序:
0)
m_num=log(num2);
对数进行求ln
错误,操作数需大于0"
11、=键的程序:
switch(addt)数据判断
case0:
为实现连续按下两次等号后能清零
break;
case1:
m_num=num2+m_num;
两数相加
case2:
m_num=num2-m_num;
两数相减
case3:
m_num=num2*m_num;
两数相乘
case4:
if(m_num==0)在除法中,判断除数是否为0
错误,0不能作除数"
else{m_num=num2m_num;
case5:
m_num=pow(num2,m_num);
取模
addt=0;
12、清除键Clear的程序:
输出框清0
变量1为0
num2=0;
变量2为0
小数无位数
整数位数无
当前无小数
13、退格键Backspace的程序:
if(ele==FALSE)判断当前是否有小数点,如果没有
m_num=m_num10-fmod(m_num10,1);
去掉小数位
else
if(ele==TRUE&
&
dint>
0)如果是小数
for(i=0;
dint-1;
i++)移动小数点
m_num=m_num*10;
移动至只有一个小数位
m_num=m_num-fmod(m_num,1);
i++)小数点移至原来位置
m_num=m_num10;
dint=dint--;
if(dint==0)ele=FALSE;
if(m_num==0)ele2=TRUE;
14、退出键Exit的程序:
OnOK();
15、关联关于对话框代码:
CAboutDlgdlgAbout;
dlgAbout.DoModal();