




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
可视化程序设计课程设计报告模拟计算器姓 名: 班 级: 学 号: 指导教师: 成 绩: 完成时间:2009年12月30日完成地点:软 件 实 验 室(9)一、 设计题目(问题)描述和要求题目:模仿windows计算器描述:使用Microsoft Visual Studio .NET 2005完成一个功能与windows自带的计算器功能相似的小程序。要求完成以下功能:能够完成加、减、乘、除、开平方、取倒数、百分数运算;能够使用“BackSpace” 、“C” 、“.” 、“+/-” 、“CE”的功能。二、 系统分析与概要设计根据题目描述和要求,系统要求能够制作出来一个与Windows自带计算器功能相似的小软件。我们需要使用基于对话框的MFC应用程序来完成此任务,所建项目名为:计算器。本项目中不需要添加心得类,只需要使用系统自动生成的CAboutDlg,C计算器App,C计算器Dlg三个类即可。其中主要实现该项目功能的类为:C计算器Dlg类。概要设计:(1) 我们先要对对话框的可视部分进行编辑,向上面添加一个“EditControl”控件和23个“Button”控件。其中“EditControl”控件用来显示数据及运算结果,“Button”控件用来实现各种操作功能。(2) 我们需要为“EditControl”控件添加一个变量“n”,用来接收及显示数据;为23个“Button”控件分别添加“事件处理程序”,来实现具体功能。(3) 在声明模块 (计算器Dlg.h) 中我们需要声明七个变量:n,n_2,setxiaoshu,xiaoshui,setnew,operate,innum。26个成员函数:1-23是控件功能函数“afx_msg void OnBnClickedButton1()”,其余三个函数是另行添加的功能函数:void setempty(void)(置空中间变量),void inum(int i)(处理字符输入),void operation(char ope)(执行选定运算)。(4) 在功能模块(计算器Dlg.cpp)中我们需要为声明过的26个成员函数添加不同的功能代码。(5) 把添加后的代码调试后运行,即可实现上述计算及命令功能。三、 详细设计和编码1、 数据类型定义变量定义:double n,n_2; bool setnew,setxiaoshu; int operate,innum,xiaoshu。函 数 定 义 :afx_msg void OnBnClickedButton1(); Afx_msg void OnBnClickedButton23(); void setempty(void), void inum(int i), void operation(char ope)。2、 各模块算法描述对于09这几个数字按键,处理函数算法为:void OnBnClickedButton11() if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=0; C计算器Dlg:inum(innum); UpdateData(false);其余9个函数中只需把innum的值赋为19就行了。Backspace键的算法为:void OnBnClickedButton1() if (n=0) xiaoshui=0; else if (xiaoshui0) n=(long(n*pow(10.0,(xiaoshui-1)*pow(10.0,-(xiaoshui-1); xiaoshui=xiaoshui-1; if (xiaoshui=0) setxiaoshu=false; setnew=false; else n=long(n/10); xiaoshui=0; setnew=false; UpdateData(false); CE键的算法为:void OnBnClickedButton2() C计算器Dlg:setempty(); UpdateData(false); C键的算法为:void OnBnClickedButton3() C计算器Dlg:setempty(); n_2=0; operate=0; UpdateData(false);“=”号的算法为:void OnBnClickedButton23() C计算器Dlg:operation(operate); operate=0; setnew=true; UpdateData(false);单目运算符“%”,“sqrt”,“1/x”的算法为:void OnBnClickedButton21()operate=%; C计算器Dlg:operation(operate); UpdateData(false); operate=0; setnew=true;Sqrt与1/x只需把operate的值改变即可。双目运算符“+”,“-”,“*”,“/”的算法为: void OnBnClickedButton19() C计算器Dlg:OnBnClickedButton23(); n_2=n; C计算器Dlg:setempty(); setnew=false; operate=-; +,*,/只需把operate的值改变即可。“.”号的算法为:void OnBnClickedButton7() setxiaoshu=true; “+/-”号的算法为:void OnBnClickedButton14()n=-n; UpdateData(false); Operation的算法为:Void operation(char ope) switch (ope) case +:n=n_2+n;break; case -:n=n_2-n;break; case *:n=n_2*n;break; case /:n=n_2/n;break; case x:if(n!=0) n=1/n;else n=0;break; case q:if(n0) n=sqrt(n); else n=0;break; case %:n=n/100;break; default:; setempty的算法为: void setempty(void) xiaoshui=0; setxiaoshu=false; n=0; Inum的算法为:Void inum(int i)if (n=fabs(n) if (!setxiaoshu) n=10*n+i; else xiaoshui=xiaoshui+1; n=n+pow(10.0,-xiaoshui)*i; else if (!setxiaoshu) n=-10*n+i; n=-n; else xiaoshui=xiaoshui+1; n=-n+pow(10.0,-xiaoshui)*i; n=-n; setnew=false; 3、 程序关键算法流程图 主函数流程YY项目开始生成对话框手动输入运算数据及运算类型得出结果?显示运算结果退出?退出程序程序重新初始化项目终止NN双目运算符(+、-、*、/)流程NYY开始录入第一个数据选择运算类型(+、-、*、/)再次录入数据得出结果?得出运算结果继续运算?退出程序重新初始化N单目运算符(%、1/X、sqrt)的流程NY开始录入数据选择运算类型(%、1/X、sqrt)得出运算结果继续运算?退出程序重新初始化四、 调试分析也许是我的运气比较好,在本项目的编译调试中并没有遇到太大的问题,只是刚开始无法显示正确结果,后经仔细检查才发现,原来因为粗心误把临时变量n_2当做控件绑定变量n来用了,经过修改后运算成功。本项目是一个基于对话框的MFC应用程序,基本上包含了我们本学期所有的上机实践内容,也是对本学期所学知识的一个综合利用。本项目的原模板代码较长,不易理解。于是我通过网络收集资料加上自己的仔细推敲终于做了一些改进。就是把原模板中那些为按钮控件添加变量实现的功能做了修改。也就是说本程序中只需为“编辑框”控件添加一个变量即可,其余控件不必添加。并且删掉了一些冗余(即与功能无关的)代码:如新加入的关于框。这样一来为该项目节省下了20余兆的空间容量,这也是在本次课程设计中收获比较大的一个方面。本项目完全使用的是Windows编程方式,运用消息响应机制来完成用户的各种运算操作。通过对“按钮”控件添加事件处理程序来实现各种功能,通过为“编辑框”控件添加变量来接受并显示运算结果,并通过变量与控件之间的互相传值把功能模块与显示模块连接统一起来,从而比较全面的完成目标。五、 测试结果 对Backspace键的测试输入七个7按过三次Backspace键后结果对加法功能的测试输入78按“+”键然后输入45结果为对“-”功能的测试输入98按“-”键后输入8结果为对“*”键的测试输入9按“*”后输入9结果为对“/”键的测试输入49按“/”键后再输入7结果为对“%”键的测试输入4按下“%”键结果为对“1/X”键的测试输入8按“1/X”键后结果为对“sqrt”键的测试输入144按“sqrt”键后结果为对“C”和“CE”键的测试输入879546按“C”键或“CE”键后结果为对“+/-”键的测试输入78按“+/-”键后结果为对“.”键的测试输入98按“.”键后输入312结果为六、 小结经过两周实验课时的努力,在老师的用心指导与我的潜心钻研下,我终于完成了首个用可视化程序设计方法制作的计算器软件。在这次程序设计中,让我对windows编程有了新的体会。一个程序的严密性是最重要的,而简单的实现加减乘除等运算和“backspace”,“CE”,“C”的功能并不是太难,难得是设计的合理程度。所谓的合理就是在各种情况下用户的输入都是预期的结果.而不是受到前次输入数据的干扰,这一点可以说是本项目中最难解决的一个问题。 如实现不按等号的连续运算“ 3+12+12”可以直接通过按这5个键再按“=”号来实现,而不用按“3 + 12 = + 12 =”,也就是避免了中间按等号的麻烦操作。如果按了等号,在显示出计算结果后直接输入数据不会和上次显示的结果混为一个数,如按下“3+12=”得出“15”后,再输入新数据“12”,不会显示“1512”,而是重新显示“12”,这是本项目中比较成功的一点。对于其它双目运算符“-”、“*”,“/”和单目运算符“%”、“1/X”、“sqrt”的实现也有相同效果。但是,本项目还是有缺陷的,就是“Backspace”键的实现,调用了类型转换long int(double),这样就局限了退格的范围为10-10的范围,在输入0 . 0 8时候,计算器默认应该显示的依次是0,0.,0.0,0.08,但由于数据会自动去掉最后的“0”,所以中间会只显示“0.”,按下第二个“0”时显示无改变,直至按下“3” 后才会显示0.03这个预期的结果。虽然这个对于这个不足之处我想了又想,但由于课时将尽,还要准备即将来临的期末考试,我目前还没能找到一个解决此问题的好办法,只有等以后有时间在对之进行优化了,这也是本项目中最大的美中不足。虽然如此,在本次课程设计中我还是收获了很多,我明白了不管学习什么编程语言或方法,实践都是最重要的,怎样把抽象思想具体化,怎样把解决问题的想法实现,怎样把别人的东西引为己用从而提高设计效率,这些才是我们学习的最终目的。尽管刚做出来的产品不是很完善,但只要我们有信心,有毅力,就一定能想到办法去不断的改进我们的产品,让它的功能更加适用,用户界面更加人性化。我会为这个目标一直坚持下去的。七、 附录计算器Dlg.h中添加的代码:pragma once/ C计算器Dlg 对话框class C计算器Dlg : public CDialog/ 构造public:C计算器Dlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_MY_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV 支持/ 实现protected:HICON m_hIcon;/ 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedButton1();public:afx_msg void OnBnClickedButton10();protected:/ 显示数据double n; /新添加的变量和函数double n_2;bool setxiaoshu,setnew;int xiaoshui,innum,operate;public:afx_msg void OnBnClickedButton13();public:afx_msg void OnBnClickedButton16();public:afx_msg void OnBnClickedButton9();public:afx_msg void OnBnClickedButton12();public:afx_msg void OnBnClickedButton15();public:afx_msg void OnBnClickedButton4();public:afx_msg void OnBnClickedButton5();public:afx_msg void OnBnClickedButton6();public:afx_msg void OnBnClickedButton11();public:afx_msg void OnBnClickedButton14();public:afx_msg void OnBnClickedButton17();public:afx_msg void OnBnClickedButton2();public:afx_msg void OnBnClickedButton3();public:afx_msg void OnBnClickedButton7();public:afx_msg void OnBnClickedButton18();public:afx_msg void OnBnClickedButton19();public:afx_msg void OnBnClickedButton20();public:afx_msg void OnBnClickedButton8();public:afx_msg void OnBnClickedButton21();public:afx_msg void OnBnClickedButton22();public:afx_msg void OnBnClickedButton23();public:/ 置空中间变量void setempty(void);public:/ 处理字符输入void inum(int i);public:/ 执行选定运算void operation(char ope);计算器Dlg.cpp中添加的代码:#include stdafx.h#include 计算器.h#include 计算器Dlg.h#include math.h#ifdef _DEBUG#define new DEBUG_NEW#endifclass CAboutDlg : public CdialogBEGIN_MESSAGE_MAP(C计算器Dlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON1, &C计算器Dlg:OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON10, &C计算器Dlg:OnBnClickedButton10)ON_BN_CLICKED(IDC_BUTTON13, &C计算器Dlg:OnBnClickedButton13)ON_BN_CLICKED(IDC_BUTTON16, &C计算器Dlg:OnBnClickedButton16)ON_BN_CLICKED(IDC_BUTTON9, &C计算器Dlg:OnBnClickedButton9)ON_BN_CLICKED(IDC_BUTTON12, &C计算器Dlg:OnBnClickedButton12)ON_BN_CLICKED(IDC_BUTTON15, &C计算器Dlg:OnBnClickedButton15)ON_BN_CLICKED(IDC_BUTTON4, &C计算器Dlg:OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON5, &C计算器Dlg:OnBnClickedButton5)ON_BN_CLICKED(IDC_BUTTON6, &C计算器Dlg:OnBnClickedButton6)ON_BN_CLICKED(IDC_BUTTON11, &C计算器Dlg:OnBnClickedButton11)ON_BN_CLICKED(IDC_BUTTON14, &C计算器Dlg:OnBnClickedButton14)ON_BN_CLICKED(IDC_BUTTON17, &C计算器Dlg:OnBnClickedButton17)ON_BN_CLICKED(IDC_BUTTON2, &C计算器Dlg:OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &C计算器Dlg:OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON7, &C计算器Dlg:OnBnClickedButton7)ON_BN_CLICKED(IDC_BUTTON18, &C计算器Dlg:OnBnClickedButton18)ON_BN_CLICKED(IDC_BUTTON19, &C计算器Dlg:OnBnClickedButton19)ON_BN_CLICKED(IDC_BUTTON20, &C计算器Dlg:OnBnClickedButton20)ON_BN_CLICKED(IDC_BUTTON8, &C计算器Dlg:OnBnClickedButton8)ON_BN_CLICKED(IDC_BUTTON21, &C计算器Dlg:OnBnClickedButton21)ON_BN_CLICKED(IDC_BUTTON22, &C计算器Dlg:OnBnClickedButton22)ON_BN_CLICKED(IDC_BUTTON23, &C计算器Dlg:OnBnClickedButton23)END_MESSAGE_MAP()/以下为添加功能代码void C计算器Dlg:OnBnClickedButton1() /Backspace键if (n=0) xiaoshui=0; /n=0时候,把小数点置空. else if (xiaoshui0) /n为小数时候的处理方案 n=(long (n*pow(10.0,(xiaoshui-1)*pow(10.0,-(xiaoshui-1); / 把该数乘以(原小数位数-1)得到数取整后在扩大, xiaoshui=xiaoshui-1; / 每次执行删除一位,小数点要前移一位. if (xiaoshui=0) setxiaoshu=false; / 如果小数点为了,执行setxiaoshu=false,结束小数输入过程 setnew=false; / 不是重新输入数据,这点同所有的setnew=false else /n为整数 n=long(n/10); /n除以,取整. xiaoshui=0; /小数点为 setnew=false; / 可以继续输入数据 UpdateData(false);void C计算器Dlg:OnBnClickedButton10()/1键if (setnew) C计算器Dlg:OnBnClickedButton3();else innum=1; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton13()/2键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=2; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton16()/3键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=3; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton9()/4键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=4; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton12()/5键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=5; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton15()/6键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=6; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton4()/7键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=7; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton5()/8键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=8; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton6()/9键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=9; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton11()/0键if (setnew) C计算器Dlg:OnBnClickedButton3(); else innum=0; C计算器Dlg:inum(innum); UpdateData(false);void C计算器Dlg:OnBnClickedButton14()/+/-键n=-n; /按一次改变n为-n UpdateData(false);void C计算器Dlg:OnBnClickedButton17()/“.”键setxiaoshu=true; / 按下开始输入小数部分void C计算器Dlg:OnBnClickedButton2()/CE键C计算器Dlg:setempty(); UpdateData(false);void C计算器Dlg:OnBnClickedButton3()/C键C计算器Dlg:setempty(); n_2=0; operate=0; UpdateData(false);void C计算器Dlg:OnBnClickedButton7()/键C计算器Dlg:OnBnClickedButton23(); n_2=n; C计算器Dlg:setempty(); setnew=false; operate=/; void C计算器Dlg:OnBnClickedButton18()/“*”键C计算器Dlg:OnBnClickedButton23(); n_2=n; C计算器Dlg:setempty(); setnew=false; operate=*; void C计算器Dlg:OnBnClickedButton19()/“-”键C计算器Dlg:OnBnClickedButton23(); n_2=n; C计算器Dlg:setempty(); setnew=false; operate=-; void C计算器Dlg:OnBnClickedButton20()/“+”键C计算器Dlg:OnBnClickedButton23(); / 自动完成上次未完成的运算.当上一次计算完双元运算没有按等号键时候,如只按 /下+ 1而没有按=的时候,直接按+.可以实现连续计算,从而省去每次都按=的麻烦,更符合使用的习惯 n_2=n / 因为是双元运算,按下+后,把输入值存入另一个数据中,开始输入新的数据 C计算器Dlg:setempty();/ 置空n的各项参数,便于以后重新输入新n值时不影响 setnew=false; /setnew=false(由数字录入部分做出相应).不是在重新输入数据,下面按数字键时接着录入部分执行相应操作 operate=+; / 操作符为+,,由OnBnClickedButton23()处理加法运算void C计算器Dlg:OnBnClickedButton8()/“sqrt”键operate=q; C计算器Dlg:operation(operate); UpdateData(false); operate=0; setnew=true;void C计算器Dlg:OnBnClickedButton21()/“%”键operate=%; C计算器Dlg:operation(operate); Updat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 病案室考试题及答案
- 变频技术考试题及答案
- 编程c考试题及答案
- 巴西地理考试题及答案
- python等级考试题及答案
- 危运公司开停工管理制度
- 一个公司无规矩管理制度
- 幼儿园学生饮食管理制度
- 日间化疗患者管理制度
- 培训班学校人事管理制度
- 临边作业的安全防护
- 第讲-公路工程基本建设项目概算预算编制办法
- 影视文学教程整本书课件完整版电子教案全套课件最全教学教程ppt(最新)
- 强对流天气的中尺度分析课件
- 固定污染源排污登记表(样表)
- 城市雕塑艺术工程量清单计价定额2020版
- T∕CGMA 033002-2020 压缩空气站节能设计指南
- 住宅景观水系的维护及设计优化
- 水利水能规划课程设计计算书
- 蛇形管制造典型工艺
- 阿曼原油评价
评论
0/150
提交评论