mfc计算器实验报告Word文档格式.docx
《mfc计算器实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《mfc计算器实验报告Word文档格式.docx(29页珍藏版)》请在冰点文库上搜索。
系统设计说明
1.计算器界面
计算器界面包括主题“高级计算器”和背景图片以及电子日历。
在计算区上有显示文本框和数字按钮以及运算符按钮。
在计算区上部分有运算模式选择模块和小提示语句。
2.模块功能简介
系统分为多个模块,分别为计算模块、错误分析模块、界面显示模块和模式选择模块。
其中计算模块用来进行各种基本的加、减、乘、除的运算并且显示运算结果;
错误分析模块用来进行错误处理;
界面显示模块用来美化计算器界面;
模式选择模块用来进行运算模式的选择和切换,以实现不同的运算要求。
3.系统结构图
系统技术文档
1.系统各模块主要流程图
(1)单步运算流程图
(2)算式运算流程图
2.软件总体测试方案与测试记录
运行程序,然后查看计算器界面和设计是否相同,进行运算模式的切换,看是否能正确的进行模式切换,查看日历显示是否正确。
经测试没有发现错误,系统运行正常。
3.局部测试方案与测试记录
运行程序,在不同的运算模式下输入数据然后进行调试。
在单步运算模式下应分别测试加、减、乘、除以及除数为0和被除数小于除数这两种特殊情况。
在算式运算模式下除了要测试与单步运算相同的内容外,还应注意算术优先级是否正确,运算结果是否正确。
注意清零功能是否能够正确实现。
系统运行结果和记录
1.软件运行界面图
2.软件运行数据输入和结果界面图
(1)单步运算界面图
1单步运算模式显示界面
2计算5.6÷
9的输入过程和结果界面
3清零时的界面
4除数为0时的错误判断界面
(2)算式运算界面图
1算式运算模式显示界面
2计算2.3+3.6÷
6-2×
6.5+66.8的输入过程和结果界面
系统使用说明书:
首先进行模式选择,在单步运算时,先点击下一个数字,再点击运算符,再点击下一个数字,然后点击等于号显示结果,如果被除数为零,则提示错误,按清零键后重新输入。
在算式运算时,随便输入一个算式,计算器可识别算式错误不显示,显示的就是输入的算式,点等于号后显示结果,如果被除数为零,则提示错误,按清零键后重新输入,如果输入一个运算符后,只能输入数字不能再输入运算符,如果此时点击运算符,则不会显示在算式中。
C++程序设计设计性实验收获与总结:
1.通过这次实验,我进一步了解并掌握了MFC控件的基本用法,在之前制作简单计算器的基础上,增加了新的功能,制作了高级计算器。
2.在制作算式运算模式的过程中,由于涉及到算术优先级和运算符号的匹配问题,因此用到了二叉树的数据存储结构,通过对数据组织、存储、以及二叉树的后序遍历及其它操作实现了算式运算的识别和计算。
3.通过使用动态链接库,将计算器的基本计算功能在程序外进行实现,使得整个程序结构化更加鲜明,也使得程序的修改和维护更加方便简单。
4.通过这次实验,使我对C++语言有了更深的掌握,提高了我的编程能力和VisualC++的使用能力。
5.在这次的高级计算器制作之后,我掌握了面向对象技术相关的一些软件开发技术,包括利用MFC开发Windows应用程序以及使用动态链接库。
参考文献
1.谭浩强编著《C程序设计(第三版)》北京清华大学出版社2005
2.谭浩强编著《C程序设计题解与上机指导(第三版)》北京清华大学出版社2005
3.Decoder编著《C/C++程序设计》北京中国铁路出版社2002
4.朱站立编著《数据结构(C语言版)》西安西安交通大学出版社2006
附录:
源程序代码
(1)动态链接库源程序代码
_declspec(dllexport)doubleAdd(doublea,doubleb)
{returna+b;
}
_declspec(dllexport)doubleSub(doublea,doubleb)
{returna-b;
_declspec(dllexport)doubleMultiply(doublea,doubleb)
{returna*b;
_declspec(dllexport)doubleDivide(doublea,doubleb)
{returna/b;
}
(2)计算器源程序代码
#include"
stdafx.h"
MyGrant_Caculator.h"
MyGrant_CaculatorDlg.h"
//#include<
String>
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
charoper,ch[20];
intdian=0,q=0;
CStrings1,stri;
intm=0,k=0,n=0,a=0;
//m=0输入单步运算,m=1输入算式运算
CStringtt,aa,ss;
CStringstr,num[20];
doubleaaa;
ints=0,i=0,j,www;
doublex1,x2,x;
_declspec(dllexport)doubleAdd(doublea,doubleb);
_declspec(dllexport)doubleSub(doublea,doubleb);
_declspec(dllexport)doubleMultiply(doublea,doubleb);
_declspec(dllexport)doubleDivide(doublea,doubleb);
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
IDD)
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CMyGrant_CaculatorDlgdialog
CMyGrant_CaculatorDlg:
CMyGrant_CaculatorDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyGrant_CaculatorDlg:
IDD,pParent)
{//{{AFX_DATA_INIT(CMyGrant_CaculatorDlg)
m_text=_T("
"
);
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
voidCMyGrant_CaculatorDlg:
//{{AFX_DATA_MAP(CMyGrant_CaculatorDlg)
DDX_Text(pDX,IDC_EDIT1,m_text);
BEGIN_MESSAGE_MAP(CMyGrant_CaculatorDlg,CDialog)
//{{AFX_MSG_MAP(CMyGrant_CaculatorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_num1,Onnum1)
ON_BN_CLICKED(IDC_num2,Onnum2)
ON_BN_CLICKED(IDC_num3,Onnum3)
ON_BN_CLICKED(IDC_num4,Onnum4)
ON_BN_CLICKED(IDC_num5,Onnum5)
ON_BN_CLICKED(IDC_num6,Onnum6)
ON_BN_CLICKED(IDC_num7,Onnum7)
ON_BN_CLICKED(IDC_num8,Onnum8)
ON_BN_CLICKED(IDC_num9,Onnum9)
ON_BN_CLICKED(IDC_Dian,OnDian)
ON_BN_CLICKED(IDC_num0,Onnum0)
ON_BN_CLICKED(IDC_Add,Onadd)
ON_BN_CLICKED(IDC_Sub,Onsub)
ON_BN_CLICKED(IDC_Multiply,Oncheng)
ON_BN_CLICKED(IDC_Divide,Onchu)
ON_BN_CLICKED(IDC_Deng,OnDeng)
ON_BN_CLICKED(IDC_Esc1,OnEsc1)
ON_BN_CLICKED(IDC_RADIO1,OnRadio1)
ON_BN_CLICKED(IDC_RADIO2,OnRadio2)
ON_BN_CLICKED(IDC_EDIT2,OnEdit2)
ON_NOTIFY(DTN_CLOSEUP,IDC_DATETIMEPICKER1,OnCloseupDatetimepicker1)
//CMyGrant_CaculatorDlgmessagehandlers
BOOLCMyGrant_CaculatorDlg:
OnInitDialog()
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);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialog:
OnSysCommand(nID,lParam);
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
OnPaint();
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMyGrant_CaculatorDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
Onnum1()
{//TODO:
Addyourcontrolnotificationhandlercodehere
if(m==0)
s1=s1+"
1"
;
m_text=s1;
elseif(m==1)
{q=0;
num[i]=num[i]+"
m_text=m_text+"
UpdateData(false);
Onnum2()
2"
q=0;
Onnum3()
3"
Onnum4()
if(m==0)
4"
{num[i]=num[i]+"
Onnum5()
5"
{q=0;
Onnum6()
6"
{num[i]=num[i]+"
Onnum7()
7"
Onnum8()
8"
Onnum9()
9"
OnDian()
{if(dian==