简单计算器c++课程设计报告书.docx
《简单计算器c++课程设计报告书.docx》由会员分享,可在线阅读,更多相关《简单计算器c++课程设计报告书.docx(45页珍藏版)》请在冰豆网上搜索。
![简单计算器c++课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2022-11/22/e68e2f99-6523-4328-a3c5-963181b81a1e/e68e2f99-6523-4328-a3c5-963181b81a1e1.gif)
简单计算器c++课程设计报告书
简单计算器
1基本功能描述
简单计算器包括双目运算符和单目运算符。
双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦、阶乘、对数、开方、倒数等运算。
可对输入任意操作数包含小数和整数及正数和负数进行以上的所有运算并能连续运算。
出现错误会给出提示,同时包含清除、退格、退出功能以及有与所有按钮相对应的菜单项。
2设计思路
如图1,是输入数据子函数的流程图。
打开计算器程序,输入数据,判断此次输入之前是否有数字输入,如果有,则在之前输入的数字字符后加上现有的数字字符;如果没有,则直接使编辑框显示所输入的数字字符。
判断是否继续键入数字,如果是,则继续进行前面的判断,如果否,则用UpdateData(FALSE)刷新显示。
如图2,是整个计算器的流程图。
对于输入的算式,判断运算符是双目运算符还是单目运算符。
如果是双目运算符,则把操作数存入数组a[z+2]中,把运算符存入b[z+1]中;如果是单目运算符,则把字符串转化为可计算的数字,再进行计算。
下面判断运算符是否合法,如果合法,则将结果存入a[0],不合法,则弹出对话框,提示错误。
结束程序。
在之前输入的数字字符后面加上现在的数字字符。
Eg:
m_str+=”9”。
直接使编辑框显示所输入的数字字符。
Eg:
m_str=”9”。
之前是否有数字输入?
pass3==1?
Y
Y
N
开始
输入
单目运算符
双目运算符
Y
将字符串转换为可计算的数字
是否每一个操作数都存入a[]数组?
N
把操作数存入a[z+2],把运算符存入b[z+1]。
进行运算
N
运算是否合法?
Y
弹出对话框提示错误
将结果存入a[0]
结束
图2简单计算器总流程图
3软件设计
3.1设计步骤
打开MicrosoftVisualC++6.0,在文件中点击新建,在弹出框选择MFCAppWizard[exe]工程,输入工程名及其存储路径,点击确定,如图3所示。
图3新建MFCAppWizard[exe]工程
将弹出MFCAppWizard-step1对话框,选择基本对话框,点击完成,如图4所示。
图4基本对话框
这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图5所示。
图5新建的对话框
3.2界面设计
1、创建控件
在图5所示的ResoureView选项卡中打开Dialog资源组,双击IDD_LUXIAOYING_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建以“0”为例进行介绍,其他按钮的创建可参照此进行操作。
1)在图5中控件的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。
图6Edit属性对话框
2)在图5中控件的“Button”按钮上单击鼠标左键,在对话框上的合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。
在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出PushButton属性对话框,如图7所示,在该对话框中输入ID值和标题属性。
图7PushButton属性
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表1各按钮和编辑框等对象的属性
对象
ID
标题或说明
编辑框
IDC_RESULT_EDIT
显示
按钮
IDC_0_BUTTON1
0
按钮
IDC_1_BUTTON2
1
按钮
IDC_2_BUTTON3
2
按钮
IDC_3_BUTTON4
3
按钮
IDC_4_BUTTON5
4
按钮
IDC_5_BUTTON6
5
按钮
IDC_6_BUTTON7
6
续表1
对象
ID
标题或说明
按钮
IDC_7_BUTTON8
7
按钮
IDC_8_BUTTON9
8
按钮
IDC_9_BUTTON10
9
按钮
IDC_OR_BUTTON11
+/-
按钮
IDC_DIAN_BUTTON12
.
按钮
IDC_JIA_BUTTON13
+
按钮
IDC_JIAN_BUTTON14
-
按钮
IDC_CHENG_BUTTON15
*
按钮
IDC_CHU_BUTTON16
/
按钮
IDC_CLEAR_BUTTON17
Clear
按钮
IDC_SQRT_BUTTON18
sqrt
按钮
IDC_DAOSHU_BUTTON19
1/x
按钮
IDC_DENGYU_BUTTON20
=
按钮
IDC_LN_BUTTON21
ln
按钮
IDC_MI_BUTTON22
10^x
按钮
IDC_COS_BUTTON23
cos
按钮
IDC_SIN_BUTTON24
sin
按钮
IDC_TUIWEI_BUTTON
Backspace
按钮
IDC_LOG_BUTTON26
log
续表1
对象
ID
标题或说明
按钮
IDC_TAN_BUTTON27
tan
按钮
IDC_JIECHENG_BUTTON28
n!
完成后界面如图8所示
图8计算机界面
2连接变量和代码
1)给编辑框连接变量。
在编辑框上单击鼠标右键,在弹出的菜单中选择建立类向导菜单项,弹出MFCClassWizard对话框,选择MemberVariables选项卡,如图9所示。
2)在ControlIDs列表框中选择IDC_RESULT_EDIT,单击AddVariables按钮,在弹出的对话框中连接变量m_str。
变量类型设定为CString型。
如图10所示。
图9MFCClassWizard对话框中的MemberVariables选项卡
图10m_str属性设置
2)给“0”按钮连接代码。
在“0”按钮上单击鼠标右键,选择建立类向导菜单项,在弹出的对话框中选择MessagesMaps选项卡,然后在ObjectIDs列表框中选择IDC_0_BUTTON1,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图11所示。
图11“0”按钮连接代码对话框
3菜单的设计
选择插入/资源命令,将显示插入资源对话框,如图12所示。
选择Menu,单击新建即可。
图12插入资源对话框
ResoureView选项卡中打开Menu资源组,双击IDR_MENU1,然后给菜单添加相应的标题,并把每个菜单对应的ID值与相应的按钮的一致。
如图13所示。
图13菜单属性对话框
在对话框的任何一个空白域单击鼠标右键,然后在弹出的快捷菜单中选择属性命令,弹出对话属性对话框,如图14所示。
在对话框中的菜单组合框中选择IDR_MENU1。
图14对话属性对话框
最终得到的界面如图15所示。
图15计算器完整界面
3.3关键功能的实现
1)操作数、小数点以及双目运算符的输入
编辑框所关联的变量为m_str,程序开始时为零。
每按下一个数字键按钮、双目运算符按钮或小数点按钮,就把它累加到m_str里并刷新显示。
BOOL型变量pass1判断之前是否有操作符输入,有,则pass为1;无,则为0。
BOOL型变量pass2判断是否有小数点,有,则为0;无,则为1;BOOL型变量pass3判断之前是否有数字输入,有,则为0;无,则为1。
2)单目运算符功能的实现
由于所输入的操作数类型为String类,所以需要将其转化为数字才能进行运算。
首先,将比率rate赋值为10,将每一位输入的字符与’0’字符做差,得到他们ASCII值的差,在遇到小数点之前,将这些差值通过循环求和以及乘以rate值得到字符串所表达的数值的整数部分,然后,当遇到小数点时,将rate赋值为0.1,再通过类似的计算方法得到字符串所表达的数值的小数部分,最后,将所得数值的整数部分和小数部分合在一起赋值给变量a,再通过单目运算符作用于a上即可实现相应功能。
3)双目运算符功能的实现
由于所输入的操作数类型为String类,所以要通过与单目运算符中类似的方法将其转换为数值,再进行相关运算。
对于双目运算符功能中操作数和操作符的区分,可以将它们分别存储在数组a[]中和数组b[]中加以区分,再进行计算。
4)退格键功能的实现
如果m_str中有字符串,则每次按下退位键都将去掉最右边一个字符剩下的字符串重新赋值给m_str,从而实现退位功能。
如果,m_str中本来就没有字符串,则将字符’0’赋值给m_str。
5)正负号功能的实现
由于所输入的操作数类型为String类,所以要通过与单目运算符中类似的方法将其转换为数值,再进行相关运算。
对于正负号功能,只要在原来数值的前面加一个负号,即可实现相应功能。
4结论与心得体会
经过多次调试,设计的计算器可以实现本次要求的所有功能。
此次VC++课程设计,在同学的帮助下,顺利完成,收获也很大。
本学期我们开设了《面向对象程序设计与VC++实践》这门课,其中MFC部分皆是需要实践的,所以,此次课程设计是很及时、很有必要的。
这样,不仅能加深我们对MFC程序设计的掌握,而且,还能让我们真正做到学以致用。
课程设计刚开始的时候,觉着比较轻松,毕竟上课时做过简单计算器,觉着这次的题目也不会太难。
后来,通过老师的讲解,发现这次课程设计与平时做的计算器有很多不同,不仅需要考虑运算的优先级,还需要实现连续运算,而且还有单目运算与双目运算的不同等一系列新的问题。
但是,真正开始做的时候,通过查找资料和与同学的交流,渐渐有了头绪。
在完成过程中,仍然避免不了会遇到一些问题,这时,不仅需要思考,还需要查阅相关资料来解决。
当然,做课程设计,基本知识是必备的。
只有具有了一定的基础知识,才能在课程设计过程中高质高效完成。
同时,也不能请示任何一道题,每一道题都有它自己的难点。
这次课程设计让我学到了很多,不仅巩固了先前学的MFC程序设计知识,而且也培养了我的实践能力,将理论知识与实践联系起来,更令我的创造性思维得到了拓展。
希望以后类似这样的课程设计、这样的实践机会能多一些。
5思考题
1、程序中如何实现小数的显示与运算?
答:
编辑框所关联的变量为Cstring类的m_str,当输入小数点时,直接将字符’.’加在之前已输入字符后面即可。
运算时,通过BOOL型变量pass2判断是否有小数点,有,则为0;无,则为1。
当有小数点时,在把已输入的字符串转化为相应数值时,乘以的比率rate为0.1,且每乘一次,都使rate值变为原来rate值的十分之一,之后由于头文件中加了“math.h”,故,再通过进行相关数学运算即可得到结果。
2、描述等号对应的消息处理函数中需要处理的问题及相应的实现代码?
答:
等号对应的消息处理函数中需要实现双目运算符的功能和连续运算,同时还要解决运算优先级的问题,另外还需要有相应的错误提示。
实现代码:
voidCLuxiaoyingDlg:
:
OnDengyuButton20()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
inti,j,z,s,x=0,y=1,t,m=1;
charb[10];
doublerate=10.0,itemp=0.0,a[20],l;
for(i=0;i<20;i++)
a[i]=100000000.0;
for(i=0;i<10;i++)
b[i]='';
//以下为双目运算;
z=0;
for(i=0;i{
if(isdigit(m_str.GetAt(i)))//isdigit若参数c为阿拉伯数字,则//返回TRUE,否则返回NULL(0)。
//m_str.GetAt(i)取出字符串中的第i个字符//(编号从0起)
{
if(rate==10.0)
{
itemp=itemp*rate+(m_str.GetAt(i)-'0');
if(i==m_str.GetLength()-1)
a[z]=itemp;
}
else
{
itemp=itemp+rate*(m_str.GetAt(i)-'0');
rate=rate/10;
if(i==m_str.GetLength()-1)
a[z]=itemp;
}
}
elseif(m_str.GetAt(i)=='.')
rate=0.1;
elseif(m_str.GetAt(i)=='+')
{
a[z]=itemp;itemp=0;
z++;
b[z]='+';
z++;
rate=10.0;
}
elseif(m_str.GetAt(i)=='-')
{
a[z]=itemp;itemp=0;
z++;
b[z]='-';
z++;
rate=10.0;
}
elseif(m_str.GetAt(i)=='*')
{
a[z]=itemp;itemp=0;
z++;
b[z]='*';
z++;
rate=10.0;
}
elseif(m_str.GetAt(i)=='/')
{
a[z]=itemp;itemp=0;
z++;
b[z]='/';
z++;
rate=10.0;
}
}
s=z;
for(j=0;j<=s;j++)//除法转换成乘法
{
if(b[j]=='/')
{
if(a[j+1]==0)
MessageBox("0不能作为除数!
");
else
{
a[j+1]=1/a[j+1];
b[j]='*';
}
}
}
for(j=0;j<=s;j++)//乘法,有乘号时执行乘法计算,同时注意优先级
{
if(b[j]=='*')
{
if(j-t==2)
{
a[t-m]=a[t-m]*a[j+1];//实现连乘
m=m+2;
}
else
a[j-1]=a[j-1]*a[j+1];//乘法的实现
a[j+1]=100000000.0;
b[j]='';
t=j;
}
}
for(j=0;j<=s;j++)//数值和运算符的传递
{
if(a[j]!
=100000000.0)
{
a[x]=a[j];
x+=2;
}
if(b[j]!
='')
{
b[y]=b[j];
y+=2;
}
}
for(j=0;j<=y-2;j++)//加减法
{
if(b[j]=='+')
a[0]=a[0]+a[j+1];
elseif(b[j]=='-')
a[0]=a[0]-a[j+1];
}
if(abs(a[0])>100000000)
MessageBox("您输入的数值过大!
");
else
m_str.Format("%1f",a[0]);
pass1=0;
UpdateData(0);
}
6附录
6.1调试报告
运行时,backspace按键功能不能实现,点击后无任何反应。
经过检查,程序和关联的相关变量等都没错误,可是该键没有响应。
在与同学讨论后,重新添加改按钮,功能正常实现。
6.2测试结果
1、输入“2”,“+”,“6”,“-”,“3”,“*”,“9”,“=”,并在菜单中同样输入这组操作,均得到结果如图16。
图16结果图1
2、输入“0”,“ln”,得到结果如图17。
图17结果图2
3、输入“30”,“sin”,得到结果如图18。
图18结果图3
6.3关键源代码
1、0到9的输入
voidCLuxiaoyingDlg:
:
On0Button1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="0";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符0
m_str="0";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On1Button2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="1";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符1
m_str="1";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On2Button3()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="2";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符2
m_str="2";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On3Button4()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="3";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符3
m_str="3";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On4Button5()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="4";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符4
m_str="4";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On5Button6()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="5";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符5
m_str="5";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On6Button7()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="6";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符6
m_str="6";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On7Button8()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="7";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符7
m_str="7";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On8Button9()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="8";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符8
m_str="8";
pass3=0;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
On9Button10()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(pass1==1&&pass3==0)
m_str+="9";
if(pass1==1&&pass3==1)//在编辑框1的字符串后加上字符9
m_str="9";
pass3=0;
UpdateData(FALSE);
}
2、加减乘除和小数点的输入
voidCLuxiaoyingDlg:
:
OnJiaButton13()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
m_str=m_str+"+";//加号
pass1=1;
UpdateData(FALSE);
}
voidCLuxiaoyingDlg:
:
OnJianButton14()
{
//TODO:
Addyourcontrolnoti