VC++MFC计算器课程设计.docx
《VC++MFC计算器课程设计.docx》由会员分享,可在线阅读,更多相关《VC++MFC计算器课程设计.docx(12页珍藏版)》请在冰豆网上搜索。
VC++MFC计算器课程设计
Windows程序设计作业报告
设计题目:
MFC计算器
系别:
信息与自动化工程
专业:
电子与通信工程
姓名:
高小雨
学号:
2013704011
一、设计目的及要求
1.1设计目的
能够熟练掌握MFC中的各个控件,消息的处理与添加,能够独立完成一些简单的算法,并且能够具体实现一些功能,真正可以利用功能比较强大的MFC编译出较好的程序代码。
本设计完成的是一个具有比较齐全运算功能的计算器。
1.2设计要求
利用MicrosoftVisualC++的MFC制作一个多功能计算器,要求:
(1)能够实现最基本的加、减、乘、除四则基本运算;
(2)添加了计算类型,分别是弧度制、度数制;
(3)界面有正负、清空、等于方便用户计算使用;
(4)重点是此计算器具有倒数、多次方、开方、三角函数、反三角函数、指数、阶乘等高级运算。
1.3软件、硬件环境
本程序采用MicrosoftVisualC++6.0的英文版本进行编译。
VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。
二、课程设计步骤
2.1Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制有个比较清晰的了解。
Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。
2.2界面的设计
仿照Windows附件里面的计算器,在Dialog视图中画好界面,主要使用的菜单中的相关控件,并合理布置各个按钮的位置,使界面更加整洁。
在各个控件的属性里依次定义好名称,之后屏幕显示的就是如图一样的可视计算器界面:
三、课程设计内容
3.1概要设计
依次将各个功能按钮设置相关的ID和控件类,一下为各类按键的一个举例,以下为数字0的属性设置,及其ID和标题名称,其余数字键属性设置与其相似。
下图是清零键C的属性,及其ID和标题名称
下图为四则运算加、减、乘、除中“+”的ID和标题名称
下图是弧度按键的属性设置
下图为计算器中三角函数和反三角函数的属性设置
下图是做的一个简单的运算,结果如图中的显示,为double型。
3.1.1程序总体框架描述
3.1.2程序常用类声明
按键0~9的ID设置
IDC_BUT0IDC_BUT1IDC_BUT2IDC_BUT3IDC_BUT4IDC_BUT5IDC_BUT6IDC_BUT7IDC_BUT8IDC_BUT9
计算类型的ID设置
弧度:
IDC_HUDU
角度:
IDC_JIAODU
次方的ID设置
10^x:
IDC_BUTTON_10Xx^y:
IDC_XDEY
2^x:
IDC_2DEXx^2:
IDC_BUTTON_SQRT
三角函数的ID设置
sin:
IDC_SINcos:
IDC_COStan:
IDC_TAN
tanh:
IDC_TANHarctan:
IDC_ARCTANarcos:
IDC_ARCCOS
cosh:
IDC_COSHarcsin:
IDC_ARCSINsinh:
IDC_SINH
四则运算的ID设置
+:
IDC_BUTTON_ADD-:
IDC_BUTTON_MINUS
*:
IDC_BUTTON_MUTIPLY/:
IDC_BUTTON_DIV
清空、等于、正负号、exp、ln、Log、1/x的ID设置
C:
IDC_BUTTON_CLEAR=:
IDC_BUTTON_EQUAL
+/—:
IDC_BUTTON_SIGNexp:
IDC_BUTTON_EXP
ln:
IDC_LNlog:
IDC_LOG1/x:
IDC_BUTTON_RECI
下图是基于基本对话框中的所有函数:
3.2主要代码
计算器主要功能的实现,0—9数字键的代码如下:
//用于数字按钮的调用
1.voidCCounterDlg:
:
onButtonN(intn)
2.{
3.if(m_coff==1.0)
4.m_second=m_second*10+n;//作为整数输入数字时
5.else
6.{
7.m_second=m_second+n*m_coff;//作为小数输入数字
8.
9.}
10.UpdateDisplay(m_second);//更新编辑框的数字显示
11.}
12.//添加各个按钮的消息响应函数
13.voidCCounterDlg:
:
OnBut0()
14.{
15.//TODO:
Addyourcontrolnotificationhandlercodehere
16.onButtonN(0);
17.}
18.////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19.voidCCounterDlg:
:
OnBut9()
20.{
21.//TODO:
Addyourcontrolnotificationhandlercodehere
22.onButtonN(9);
23.}
24.//用于显示数据
25.voidCCounterDlg:
:
UpdateDisplay(doublen)
26.{
27.m_display.Format(_T("%f"),n);//将double型转换成字符型
28.inti=m_display.GetLength();
29.while(m_display.GetAt(i-1)=='0')//格式化输出,将输出结果后的零截去
30.{m_display.Delete(i-1,1);i--;}
31.UpdateData(false);//更新编辑框变量m_display
32.}
33.//用于计算结果
34.voidCCounterDlg:
:
Calculate(void)
35.{
36.//将前一次数据与当前数据进行运算,作为下一次的第一操作数,并在编辑框显示
37.switch(m_operator.GetAt(0))
38.{
39.case'+':
40.m_first+=m_second;
41.break;
42.case'-':
43.m_first-=m_second;
44.break;
45.case'*':
46.m_first*=m_second;
47.break;
48.case'/':
49.if(fabs(m_second)<=0.000001)//求m_second的绝对值如果为零时
50.{
51.m_display="除数设置有误";
52.UpdateData(false);
53.return;
54.}
55.else
56.m_first/=m_second;break;
57.}
58.m_second=0.0;
59.m_coff=1.0;
60.m_operator=_T("+");
61.UpdateDisplay(m_first);//更新编辑框显示内容
62.}
63.
64.voidCCounterDlg:
:
OnButtonAdd()
65.{
66.//TODO:
Addyourcontrolnotificationhandlercodehere
67.Calculate();
68.m_operator="+";//-*与之相同
69.}
70.voidCCounterDlg:
:
OnButtonDiv()
71.{
72.//TODO:
Addyourcontrolnotificationhandlercodehere
73.Calculate();
74.m_operator.Format(_T("%s"),"/");
75.}
76.//添加三角函数一个函数
77.voidCCounterDlg:
:
TrigFunction()
78.{
79.switch(m_duType)
80.{
81.case0:
82.m_second=m_second;//弧度
83.break;
84.case1:
85.m_second=m_second*m_PI/180;//角度
86.break;
87.
88.}
89.}
90.voidCCounterDlg:
:
OnBnClickedHudu()
91.{
92.//TODO:
Addyourcontrolnotificationhandlercodehere
93.m_duType=0;//系统默认m_duType=0,计算器默认为弧度计算
94.}
95.
96.voidCCounterDlg:
:
OnBnClickedJiaodu()
97.{
98.//TODO:
Addyourcontrolnotificationhandlercodehere
99.m_duType=1;//主要是作为以后函数算法的判断标准
100.}
101.voidCCounterDlg:
:
OnSin()
102.{
103.//TODO:
Addyourcontrolnotificationhandlercodehere
104.TrigFunction();
105.m_second=sin(m_second);
106.UpdateDisplay(m_second);
107.}//其余的三角函数与之类似
108.//计算阶乘的代码
109.//添加函数intjiecheng(intn)利用递归返回阶乘值
110.intCCounterDlg:
:
jiecheng(intn)
111.{
112.if(n==0||n==1)
113.return1;
114.else
115.if(n>1)
116.returnn*jiecheng(n-1);//递归函数求阶乘f(n)=n*f(n-1)
117.}
118.//在n!
的按钮消息处理里,如果输入的不是整数则不能进行阶乘运算
119.voidCCounterDlg:
:
OnNjiecheng()
120.{
121.//TODO:
Addyourcontrolnotificationhandlercodehere
122.if((m_second-(int)m_second)>0)
123.{
124.m_display=("你输入的不是整数,请输入整数!
");
125.UpdateData(false);//如果是非整数,则结束运算,重新开始
126.return;
127.}
128.else
129.{
130.m_second=(int)jiecheng(m_second);
131.UpdateDisplay(m_second);
132.}
133.}
134.//次方代码
135.voidCCounterDlg:
:
OnButton10x()
136.{
137.//TODO:
Addyourcontrolnotificationhandlercodehere
138.m_second=pow(10,m_second);
139.UpdateDisplay(m_second);//刷新显示结果
140.}//其余的求次方与之类似
四、课程设计总结
本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了自己独立制作程序的能力。
对MFC编程的理解进一步加深。
经过一个多星期的仔细研究,认真揣摩代码,在网上也查阅了不少相关资料,终于能够完整的编译出一套不错的计算器源程序,同时使其具备了很多高级的功能。
当然其中也遇到了许多问题,刚开始的时候按键设置好后,不显示数值,才发现数据改变后没有用UpdateDisplay(false)。
还有在自己写代码时发现,当除数为0的时候,程序出错,才想起来,除数不能为0,经过一番思索与多次尝试解决了这样的一个问题。
在用递归函数求阶乘时出现了求得的结果不对照,结果发现是递归函数用得不对,阶乘函数必须有一个返回值,且值不能为负。
本来想美化一下按键,结果自己水平有限,希望能得到老师的指点。
我以后会更加多多练习一些编程相关的知识,让自己在这方面的越来越熟练,编程技巧越来越丰富。