![李晓奇 丁健华 吴继超等MFC计算器课程设计报告_第1页](http://file4.renrendoc.com/view/06de7b6b40dc9ca651a826c53c3a6a2a/06de7b6b40dc9ca651a826c53c3a6a2a1.gif)
![李晓奇 丁健华 吴继超等MFC计算器课程设计报告_第2页](http://file4.renrendoc.com/view/06de7b6b40dc9ca651a826c53c3a6a2a/06de7b6b40dc9ca651a826c53c3a6a2a2.gif)
![李晓奇 丁健华 吴继超等MFC计算器课程设计报告_第3页](http://file4.renrendoc.com/view/06de7b6b40dc9ca651a826c53c3a6a2a/06de7b6b40dc9ca651a826c53c3a6a2a3.gif)
![李晓奇 丁健华 吴继超等MFC计算器课程设计报告_第4页](http://file4.renrendoc.com/view/06de7b6b40dc9ca651a826c53c3a6a2a/06de7b6b40dc9ca651a826c53c3a6a2a4.gif)
![李晓奇 丁健华 吴继超等MFC计算器课程设计报告_第5页](http://file4.renrendoc.com/view/06de7b6b40dc9ca651a826c53c3a6a2a/06de7b6b40dc9ca651a826c53c3a6a2a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC表达式计算器课程设计报告实验名称:MFC课程设计指导教师:刘晓军专业:机械工程学院班级:5班学生姓名及学号:丁健华(02011507)李晓奇(02011513)吴继超(02011516)完成日期:2012年10月13日小组成员及分工:李晓奇(主要负责Calculate.cpp代码的编写)李晓奇(主要负责界面的设计和实现、辅助代码的编写)丁健华(主要负责功能的改进与创新、辅助代码的编写)丁健华(主要负责代码的链接、辅助代码的编写)吴继超(主要负责报告的书写、辅助代码的编写)题目:利用MFC框架编写简易表达式计算器【分析】一.设计过程1.Windows消息处理机制的理解首先编写程序需要对Windows程序的消息处理机制(MessageHandle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。2.界面的设计
1)界面的初步设计仿照Windows附件里面的计算器,在资源视图中画好界面,如图:2)修改每个static的属性IDCAPTIONIDD_STATIC4简易表达式计算器IDC_STATIC1待求表达式IDC_STATIC2运算结果IDC_STATIC3系统当前时间3)修改每个button的属性IDC_BUTTON1等于(=)IDC_BUTTON2全清(C)IDC_BUTTON3清除(A)结果如下图:
4)修改每个button的处理机制在类向导Classwizard窗口中进行,如下图:其他button按钮的修改类似5)修改每个edit的类型和名称在类向导Classwizard窗口中进行:单击AddVariable按钮,在如下窗口中进行修改其他edit的修改类似最终结果如下:注:主要使用到Layout菜单中的Align功能对各个按钮进行对齐,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。6)系统菜单的添加在Menu的IDR_MENU1中添加系统菜单:同理在“帮助”菜单中添加“关于”。设计步骤1.添加头文件将Calculate.cpp(见附录)改为Calculate.h将其添加到计算器Dlg.cpp:implementationfile中,如下:#include"Calculate.h"。2.成员函数及其释义:voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/) :CDialog(CMyDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMyDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCMyDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Control(pDX,IDC_EDIT3,m_time); DDX_Control(pDX,IDC_EDIT2,m_result); DDX_Control(pDX,IDC_EDIT1,m_input); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg,CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON3,OnButton3) ON_COMMAND(ID_ABOUT,OnAbout) ON_COMMAND(ID_QUIT,OnQuit) //}}AFX_MSG_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlers3.OnButton1()按钮的处理函数双击“等于(=)”按钮,添加如下代码:voidCMyDlg::OnButton1(){ //TODO:AddyourcontrolnotificationhandlercodehereCStringstr; char*ch; m_input.GetWindowText(str); ch=(LPSTR)(LPCTSTR)str; charch2[50]; strcpy(ch2,ch); Cala(ch2); if(!a.OK) {m_result.SetWindowText("表达式不合法!");//表达式不合法,判别出来并给出相应的错误提示 } else {if(a.Sign) {m_result.SetWindowText("除数为零!");//表达式不合法,可以判别出来并给出相应的错误提示 } else {str.Format("%lf",a.GetV()); m_result.SetWindowText(str); } }}以OnButton1()作为求值处理函数,函数的功能是单击等于(=)按钮,运算结果显示在IDC_EDIT2中4.OnButton2()按钮的处理函数双击“清除(C)”按钮,添加如下代码:voidCMyDlg::OnButton2(){ //TODO:Addyourcontrolnotificationhandlercodehere m_result.SetWindowText("0");m_input.SetWindowText("");m_input.SetFocus();}//函数的功能是把上次输入的表达式清空5.OnButton3()按钮的处理函数双击“全清(A)”按钮,添加如下代码:voidCMyDlg::OnButton3(){ //TODO:Addyourcontrolnotificationhandlercodeherem_input.SetWindowText("");m_input.SetFocus(); }//函数的功能是把上次输入的表达式和运算结果都清除6.OnTimer(UINTnIDEvent)处理函数CWnd::SetTimer(1,500,NULL);//设置时间每隔500ms更新一次。voidCMyDlg::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringch[]={"日","一","二","三","四","五","六"};SYSTEMTIMEst;::GetLocalTime(&st); CStringstr_temp; str_temp.Format("%u/%u/%u星期"+ch[st.wDayOfWeek]+"%u:%u:%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); m_time.SetWindowText(str_temp); CDialog::OnTimer(nIDEvent);}//函数的功能是把运算结果显示在IDC_EDIT3中7.OnAbout()处理函数voidCMyDlg::OnAbout(){ //TODO:Addyourcommandhandlercodehere CAboutDlgabout; about.DoModal();}//关于帮助和版权信息8.OnQuit()处理函数voidCMyDlg::OnQuit(){ //TODO:Addyourcommandhandlercodehere OnOK();}//退出主程序菜单9.全部代码如下://计算器Dlg.cpp:implementationfile//#include"stdafx.h"#include"计算器.h"#include"计算器Dlg.h"#include"Calculate.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg: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//Implementationprotected: //{{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) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/) :CDialog(CMyDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMyDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCMyDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Control(pDX,IDC_EDIT3,m_time); DDX_Control(pDX,IDC_EDIT2,m_result); DDX_Control(pDX,IDC_EDIT1,m_input); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg,CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON3,OnButton3) ON_COMMAND(ID_ABOUT,OnAbout) ON_COMMAND(ID_QUIT,OnQuit) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlersBOOLCMyDlg::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 m_Mu.LoadMenu(IDR_MENU2); SetMenu(&m_Mu);CWnd::SetTimer(1,500,NULL); //TODO:Addextrainitializationhere returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCMyDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCMyDlg::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); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCMyDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}voidCMyDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr; char*ch; m_input.GetWindowText(str); ch=(LPSTR)(LPCTSTR)str; charch2[50]; strcpy(ch2,ch); Cala(ch2); if(!a.OK) { m_result.SetWindowText("表达式不合法!"); } else { if(a.Sign) { m_result.SetWindowText("除数为零!"); } else { str.Format("%lf",a.GetV()); m_result.SetWindowText(str); } }}voidCMyDlg::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringch[]={"日","一","二","三","四","五","六"};SYSTEMTIMEst;::GetLocalTime(&st); CStringstr_temp; str_temp.Format("%u/%u/%u星期"+ch[st.wDayOfWeek]+"%u:%u:%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); m_time.SetWindowText(str_temp); CDialog::OnTimer(nIDEvent);}voidCMyDlg::OnButton2(){ //TODO:Addyourcontrolnotificationhandlercodehere m_result.SetWindowText("0");m_input.SetWindowText("");m_input.SetFocus();}voidCMyDlg::OnButton3(){ //TODO:Addyourcontrolnotificationhandlercodeherem_input.SetWindowText("");m_input.SetFocus(); }voidCMyDlg::OnAbout(){ //TODO:Addyourcommandhandlercodehere CAboutDlgabout; about.DoModal(); }voidCMyDlg::OnQuit(){ //TODO:Addyourcommandhandlercodehere OnOK();}三.总结:在设计当中我认识到开发一项好的软件不是某一个人就能完成的任务。一个团队的小组,一个勤奋的小组非常重要,沟通是解决问题的就好办法。俗话也说得好:“不怕虎一样的敌人,就怕猪一样的队伍”。所以小组中的每个成员的能力与协作能力也是致关重要的。同时,不仅是团队内部的交流,更多需要协调好团队之间的交流。其次呢,在设计过程中我了解了,在开发一个项目时一定要先做好规划,按照软件的开发过程,详细地写好每一个必要的文档。一般的规则是,写文档需要团队协作,这样就允许开发人员和文档编写者利用彼此的长处,取长补短。例如,如果预期读者是系统设计师,开发人员需要提供技术细节,然后文档编写者按照正确语法组织和编辑内容。软件文档的最主要目标是传达一个系统的技术要素和使用方法。第二个目标是提供软件开发过程中的需求,决策,行为,角色和责任的书面记录。只有实现了这两个目标,软件文档才真正提供了有意义的信息。软件的概念就是:程序+文档,程序就是文档,文档集成在程序中。它要求在选择开发环境时不仅要考虑环境对设计、开发的完美支持,而且要考虑对维护、文档的支持;它要求软件人员在设计、开发过程中要考虑维护问题、文档问题;它要求程序与文档存储在同一位置、同一系统中;它要求使用相同工具进行程序与文档的书写、检索;它要求在编写和维护程序的同时形成文档,在书写文档时编写、维护程序。程序与文档合一的概念不仅存在于系统的设计、开发阶段而且存在于系统的维护阶段,它贯穿软件的生命周期。本次MFC简易表达式计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。对C++的OOP编程思想理解进一步加深。但是程序仍然存在一定的问题,比如除数不能为0的Exceptionhandle,符号键多次点击结果混乱,输入的字符除了数字还有其他不合法的字符(如字母、空格和其它标点符号等)。由于时间仓促,如果有更多的时间,这些问题必定会迎刃而解。通过这次课程设计,可以很好的加深对C++的理解,以后对Windows应用程序的开发势必会轻车熟路。四、附录1.Calculate.cpp源代码#ifndefCALCULATE_H#defineCALCULATE_H#include<String.h>classCal{public:structTree{charch[50];Tree*Lchild;Tree*Rchild;};public:intSign;boolOK;public: Cal(char*Ex); boolJudge(char*Ex);voidGetTree(char*Ex,Tree*Node);doubleGetResult(Tree*Node);intGetFig(charch);voidGetstring(char*Ex,ints,char*ch);doubleGetValue(char*ch); doubleGetV(); voidDrop(Tree*Node); ~Cal();private: Tree*Node; doubleResult;};Cal::Cal(char*str){Sign=0;OK=true;charEx[50];strcpy(Ex,str);if(Judge(Ex)){Node=newTree;GetTree(Ex,Node);Result=GetResult(Node);}else OK=false;}Cal::~Cal(){ if(OK)Drop(Node);#ifdefMYDEBUG cout<<"end"<<endl;#endif}voidCal::GetTree(char*Ex,Tree*Node){intlength=strlen(Ex); inttag=length;charBch[50]; inti;#ifdefMYDEBUG cout<<"Ex:"<<Ex<<endl;#endif if(Ex[length-1]==')') { intacout=-1; for(i=length-2;i>=0;i--) { if(Ex[i]==')') acout--; if(Ex[i]=='(') { acout++; if(acout==0) { tag=i; break; } } } if(i<0) { Sign=1; return; } if(tag==0) { Ex[length-1]='\0'; Getstring(Ex,1,Bch); GetTree(Bch,Node); } if(tag!=0) { intl_tag=tag; intt=0; for(intj=tag-1;j>=0;j--) { if(Ex[j]==')') t--; if(Ex[j]=='(') t++; if(Ex[j]=='+'||Ex[j]=='-'||Ex[j]=='*'||Ex[j]=='/'&&t==0) { l_tag=j; if(Ex[j]=='+'||Ex[j]=='-') break; } } if(t==0) { Getstring(Ex,l_tag+1,Bch); Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; GetTree(Bch,Node->Rchild); *(Node->ch)=Ex[l_tag]; *(Node->ch+1)='\0'; Ex[l_tag]='\0'; GetTree(Ex,Node->Lchild); } else { Sign=1; return; } } } else {intt=0; for(i=length-1;i>=0;i--) { if(Ex[i]==')') t++; if(Ex[i]=='(') t--; if(Ex[i]=='+'||Ex[i]=='-'||Ex[i]=='*'||Ex[i]=='/'&&t==0) if(tag==length) { tag=i; if(Ex[tag]=='+'||Ex[tag]=='-'&&t==0) { Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; Getstring(Ex,tag+1,Bch); strcpy(Node->Rchild->ch,Bch); Node->Rchild->Lchild=NULL; Node->Rchild->Rchild=NULL; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0'; Ex[tag]='\0'; GetTree(Ex,Node->Lchild); break; } }if(tag!=length&&(Ex[i]=='+'||Ex[i]=='-')&&t==0) { tag=i; Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0';Getstring(Ex,tag+1,Bch); GetTree(Bch,Node->Rchild); Ex[tag]='\0'; GetTree(Ex,Node->Lchild); break; } }if(i<0&&tag!=length) { Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; Getstring(Ex,tag+1,Bch); strcpy(Node->Rchild->ch,Bch); Node->Rchild->Lchild=NULL; Node->Rchild->Rchild=NULL; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0'; Ex[tag]='\0'; GetTree(Ex,Node->Lchild); } if(i<0&&tag==length) { strcpy(Node->ch,Ex); Node->Lchild=NULL; Node->Rchild=NULL; } }}doubleCal::GetResult(Tree*Node){if(Node->Lchild!=NULL&&Node->Rchild!=NULL){switch(*(Node->ch)) { case'+':returnGetResult(Node->Lchild)+GetResult(Node->Rchild); case'-':returnGetResult(Node->Lchild)-GetResult(Node->Rchild); case'*':returnGetResult(Node->Lchild)*GetResult(Node->Rchild); case'/': if(GetResult(Node->Rchild)==0) { Sign=1; return-1; } else returnGetResult(Node->Lchild)/GetResult(Node->Rchild); }}else{ doubleValue=GetValue(Node->ch); //deleteNode; returnValue;} }boolCal::Judge(c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人升职申请书范文
- 2025年度挖机租赁与安全教育培训合同
- 摄影协会申请书
- 幼儿园离园申请书
- 现代办公技术的创新与发展趋势分析
- 2025年事业单位门卫值班安排及交接班合同
- 宏观经济学知到智慧树章节测试课后答案2024年秋河南大学
- 航空消防知到智慧树章节测试课后答案2024年秋大兴安岭职业学院
- 二零二五年度空调设备售后服务质量保证合同
- 2025年度生态保护区树木砍伐及赔偿协议
- 拼音练习字帖(打印版)
- 拖拉机驾驶员培训(课件)
- 写字楼招租推广方案
- 安踏单店货品管理资料课件
- 药店信息处理与保密技巧
- 两办意见八硬措施煤矿安全生产条例宣贯学习课件
- 蒙曼品最美唐诗:全三册
- 未成年法制安全教育课件
- 锂电新能源项目融资计划书
- 《体育与健康说课》课件
- 人教版化学九年级下册同步练习:第九单元 溶液
评论
0/150
提交评论