资源描述
C+课程设计报告(20-20年度第学期)计算器的设计与实现专业计算机科学与技术学生姓名班级学号指导教师完成日期目录1概述31.1课程设计目的31.2课程设计内容32系统需求分析32.1系统目标32.2主体功能32.3开发环境33系统概要设计43.1系统功能划分43.2系统流程图54系统详细设计54.1设计步骤54.2界面设计74.2实现高级按钮控件类105测试115.1测试方案115.2测试结果116小结12参考文献14附录15附录1源程序清单15C+课稈设计报告(2011)计算器的设计与实现1概述1.1 课程设计目的1、巩固并加深学生对C+语言程序设计知识的理解;2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;3、进一步掌握和应用VC+6.0集成开发环境;4、提高运用C+语言解决实际问题的能力;5、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的MIS系统;6、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。1.2 课程设计内容课题名称:计算器的实现说明:实现一个计算器。要求:1)用“计算器”的标准视图执行简单的计算。2)用其科学型视图执行高级的科学计算。2系统需求分析2.1 系统目标我们在学习生活中,常会遇到一些繁杂的数值运算,这时候我们就必须用到科学计算器,所以便着手开发了这个计算器程序,以便用于自己的学习工作。要计算功能有以下几个方面:加法,减法,乘法,除法,求幂,求模,求平方根,求Sin,求Cos。2.2 主体功能1、十进制数的加、减、乘、除、乘方、取模等简单计算。2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运算。3、以角度、弧度两种方式实现上述部分函数。2.3 开发环境VC+6.03系统概要设计3.1 系统功能划分表3-1系统功能表序号文件名主要功能备注1+加法求和两个操作数2-减法求差两个操作数3*乘法求积两个操作数4/除法求商两个操作数5%求模两个操作数6A求x的y次幕两个操作数7S求平方根一个操作数8Sin求正弦一个操作数9Cos求余弦一个操作数10In求对数一个操作数11n!求阶乘一个操作数12=等于13C寄存器清零1)假设执行操作“+”,先输入一个数,再输入“+”,再输入另一个数,最后输入“+”。整个功能“+”就执行完毕。2)执行操作“Sin”,先输入一个数,在输入“Sin”,整个功能“Sin”就执行完毕。3)执行操作“n!”,先输入一个数,再输入“n!,整个功能“n!”执行3.2 系统流程图图3-1系统流程图4系统详细设计4.1设计步骤打开MicrosoftVisualC+6.0,在文件中点击新建,在弹出框内选择MFCAppWizardexe工程,输入工程名cao及其所在位置,点击确定,如图4-1所示。图4-1新建MFCAppWizardexe工程将弹出MFCAppWizard-step1对话框,选择基本对话框,点击完成,如图4-2所示。图4-2基本对话框这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图4-3所示。衰骨的章音SSA工程揭M疥E工昙囲口聖吐-国蓉習1-dCCtioDIg|(AllcIsbinieimtber貝T|CCaDDIgi二卧4齒!-ia-口oiire&uurccB由二JDiaDog由UIc4n申口SBrinqTable由_Version)岂tao.n:-SDD.CAO.DIALOG(Dialog|二回AZ口函因.i味逛曰出匚血出四回耳嘔國比氏I-?ml.-“L3団FdHI.?;4-咅站直回和11奎.nRcdy图4-3新建的对话框4.2 界面设计界面设计主要是创建控件,在图4-3所示的ResoureView选项卡中打开Dialog资源组,双击IDD_ZH0UT0NG_DIAL0G,在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。1)在图4-3中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,如图4-4所示,在该对话框中输入ID属性。11图4-4Edit属性对话框2)在图4-2中Controls的“Butto按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出PushButton属性对话框,如图4-5所示,在该对话框中输入控件的ID值和标题属性。图4-5PushButton属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性表4-1各按钮和编辑框等对象的属性对象ID标题或说明编辑框IDCxianshi结果显示按钮IDCBUTTONO0按钮IDCBUTTON11按钮IDCBUTTON22按钮IDCBUTTON33按钮IDCBUTTON44按钮IDCBUTTON55按钮IDCBUTTON66按钮IDCBUTTON77按钮IDCBUTTON88按钮IDCBUTTON99按钮IDCchange+/-按钮IDCpoint按钮IDCadd+按钮IDCdifference-按钮IDCchu/按钮IDCtantan按钮IDCexpexp按钮IDCmultiply*按钮IDCsqrtsqrt按钮IDCdaoshu1/x按钮IDCjiechengn!按钮IDClnIn按钮IDCsinsin按钮IDCcoscos按钮IDCpowxAy按钮IDCOnequal=完成后界面如图4-6所示。1Pll|&|i11nn147FI-OU上_1上丄63:pI|C05IIsin图4-6设计界面E3加入标准型和科学型按键:S3caoEditr科学型r标准型E1M-JTI丄丄上丄1E-y4图4-7加入标准型和科学型按键界面C+课程设计报告(2011)运行界面效果如图4-8:13L-.广弧度47+/-0y图4-8科学型界面4.3 实现高级按钮控件类因为本程序大多使用按钮来完成我们所需的计算,所以在这里,我使用高级按钮控件来实现操作,具体过程如下:利用ClassWizard添加一个新类(1) 添加成员变量和成员函数添加成员变量:public:CRectm_ClientRect;/用来保存按钮的客户的矩形区域CRgnm_ClientRgn;/用来保存按钮的客户区域,非矩形UINTm_State;/按钮所处状态CPointm_Point;/当前鼠标位置BOOLm_IsTimerOn;/标识计时器是否已经打开利用ClassWizard添加消息映射和响应函数:再利用ClassWizard覆盖父类中的两个关键的虚函数:/AFX_VIRTUAL(CAdvButton)public:virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);protected:virtualvoidPreSubclassWindow();/AFX_VIRTUAL其中对于所有的对于按钮的绘制工作都是在Drawltem函数中完成的。(2) 添加创建按钮控件代码按钮的创建分两步完成。首先,调用构造函数对按钮对象进行初始化;其次,调用Create函数创建按钮。(3) 屏蔽Enter键直到现在为止,虽然计算器的界面已经完成。但是,它还有一个缺陷:当Enter键按下时,对话框应付突然关掉。这是因为对话框默认具有焦点的控件是OK键,当Enter键按下时,框架会自动执行当前拥有焦点的控件的响应函数,所以对话框自然就关闭了。要屏蔽这一功能,只要执行下面的代码就可以。voidCCalculatorDlg:OnOK()/CDialog:OnOK();/屏蔽掉此句代码5测试5.1测试方案先用标准型进行简单的四则运算:+-*/,测试完成后。再用科学型进行稍复杂的运算:sin,cos,tan,log,ln,n!等,核对其计算结果的正确性。5.2 测试结果经测试标准型计算器,进行简单的四则运算,结果均正确,如图5-1所示。图5-1四则运算测试结果图测试科学型计算器,进行sin,cos,tan,log,ln,n!等运算,结果均正确,求丄丄9-in=I_J-J_-1sin30(如图5-2所示)。图5-2求sin30测试结果图(一)图5-3求sin30测试结果图(二)6小结通过一个多星期的折腾,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。看着劳动成果,很欣慰!刚开始,可以说是完全没有头绪,于是上网查,找到了些与我题目相似的源代码,然后对之进行修改,测试,最后得到我这次课程设计所需要的代码.通过计算器的设计这一课题的设计和实现,我对简单的C语言编程有了进一步C+课稈设计报告(2011)的认识,对MicrosoftVisualC+6.0这个程序的操作更加熟练了一些。回顾此次的课程设计,我学到了很多东西不仅巩固了书本的知识并且与实践相结合提高具体操作能力,在设计的过程中发现自己的不足,有些知识掌握的不够牢靠,通过这次的课程设计之后我把前面所学的知识又重新温故了一遍。同时,在老师和同学身上我学到了很多非常实用的知识,在此对给过我帮助的同学和老师表示由衷的感谢!17参考文献1 谭浩强.C程序设计(第三版)M.北京:清华大学出版社,2005.2 谭浩强.C程序设计题解与上机指导(第三版)M.北京:清华大学出版社,2005.3 甄炜.C+语言和面向对象程序设计教程M.北京:机械工业出版社,2005.附录附录1源程序清单/CalculatorDlg.cpp:implementationfile#includestdafx.h#includeCalculator.h#includeCalculatorDlg.h#includemath.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE=_FILE_;#endif/CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialogpublic:CAboutDlg();/DialogData/AFX_DATA(CAboutDlg)enumIDD=IDD_ABOUTBOX;/AFX_DATA/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CAboutDlg)/DDX/DDVsupportprotected:virtualvoidDoDataExchange(CDataExchange*pDX);/AFX_VIRTUAL/Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg():CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoidCAboutDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg,CDialog)/AFX_MSG_MAP(CAboutDlg)/Nomessagehandlers/AFX_MSG_MAPEND_MESSAGE_MAP()/CCalculatorDlgdialogCCalculatorDlg:CCalculatorDlg(CWnd*pParent/*=NULL*/):CDialog(CCalculatorDlg:IDD,pParent)/AFX_DATA_INIT(CCalculatorDlg)m_result=_T();m_isDegree=-1;m_sentific=-1;/AFX_DATA_INIT/NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_hAccel=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDD);DtoR=1;m_coff=0.1;m_bCoff=0;m_errorState=ErrNone;m_bOperandAvail=FALSE;m_operator=OpNone;voidCCalculatorDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCalculatorDlg)DDX_Text(pDX,IDC_DISPLAY,m_result);DDX_Radio(pDX,IDC_DEGREE,m_isDegree);DDX_Radio(pDX,IDC_SENTIFIC,m_sentific);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCalculatorDlg,CDialog)/AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND_RANGE(IDC_0,IDC_9,OnOperandInput)ON_BN_CLICKED(IDC_ADD,OnAdd)ON_BN_CLICKED(IDC_MINUS,OnMinus)ON_BN_CLICKED(IDC_DIVID,OnDivid)ON_BN_CLICKED(IDC_MULTIPLY,OnMultiply)ON_BN_CLICKED(IDC_EQUAL,OnEqual)ON_BN_CLICKED(IDC_SQRT,OnSqrt)ON_BN_CLICKED(IDC_SIGN,OnSign)ON_BN_CLICKED(IDC_RECIPROCAL,OnReciprocal)ON_BN_CLICKED(IDC_POINT,OnPoint)ON_BN_CLICKED(IDC_CLEAR,OnClear)ON_BN_CLICKED(IDC_LOG,OnLog)ON_BN_CLICKED(IDC_LN,OnLn)ON_BN_CLICKED(IDC_FACTORIAL,OnFactorial)ON_BN_CLICKED(IDC_EXP,OnExp)ON_BN_CLICKED(IDC_SENTIFIC,OnSentific)ON_BN_CLICKED(IDC_SIN,OnSin)ON_BN_CLICKED(IDC_SQUAR,OnSquar)ON_BN_CLICKED(IDC_TAN,OnTan)ON_BN_CLICKED(IDC_STANDARD,OnStandard)ON_BN_CLICKED(IDC_DEGREE,OnDegree)ON_BN_CLICKED(IDC_RAD,OnRad)ON_BN_CLICKED(IDC_COS,OnCos)/AFX_MSG_MAPEND_MESSAGE_MAP()C+课稈设计报告(2011)/CCalculatorDlgmessagehandlersBOOLCCalculatorDlg:OnInitDialog()CDialog:OnInitDialog();/AddAbout.menuitemtosystemmenu./IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT(IDM_ABOUTBOX&0xFFF0)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOXAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);/Settheiconforthisdialog.Theframeworkdoesthisautomatically/whentheapplicationsmainwindowisnotadialogSetIcon(m_hIcon,TRUE);/SetbigiconSetIcon(m_hIcon,FALSE);/Setsmallicon/TODO:AddextrainitializationhereGetWindowRect(rcSentific);CWnd*m_pMark=GetDlgItem(IDC_DISPLAY);ASSERT(m_pMark);CRectrect;m_pMark-GetWindowRect(rect);rcStandard=rcSentific;rcStandard.right=rect.right+5;m_bIsExpand=0;m_sentific=1;OnStandard();m_result=0.;m_isDegree=1;UpdateData(FALSE);returnTRUE;/returnTRUEunlessyousetthefocustoacontrolvoidCCalculatorDlg:OnSysCommand(UINTnID,LPARAMlParam)if(nID&0xFFF0)=IDM_ABOUTBOX)CAboutDlgdlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID,lParam);/Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow/todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,/thisisautomaticallydoneforyoubytheframework.19计算器的设计与实现voidCCalculatorDlg:OnPaint()if(IsIconic()CPaintDCdc(this);/devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);/CentericoninclientrectangleintcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;/Drawtheicondc.DrawIcon(x,y,m_hIcon);elseCDialog:OnPaint();/Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags/theminimizedwindow.HCURSORCCalculatorDlg:OnQueryDragIcon()return(HCURSOR)m_hIcon;voidCCalculatorDlg:OnOperandInput(UINTnID)ASSERT(nID=IDC_0&nID=0&szButton0=1;i-)m_operand*=i;UpdateDisplay();/m_func=FuncNone;voidCCalculatorDlg:OnDegree()/TODO:Addyourcontrolnotificationhandlercodeherem_isDegree=0;DtoR=(2*PI)/360;UpdateData(FALSE);voidCCalculatorDlg:OnRad()/TODO:Addyourcontrolnotificationhandlercodeherem_isDegree=1;DtoR=1;UpdateData(TRUE);voidCCalculatorDlg:OnCos()/TODO:Addyourcontrolnotificationhandlercodeherem_func=FuncCos;Run_Func();voidCCalculatorDlg:ExpandToSentific()if(m_bIsExpand)SetWindowPos(NULL,0,0,rcSentific.Width(),rcSentific.Height(),SWP_NOMOVE|SWP_NOZORDER);SetVisibleCtrl();elseSetWindowPos(NULL,0,0,rcStandard.Width(),rcSentific.Height(),SWP_NOMOVE|SWP_NOZORDER);SetVisibleCtrl();UpdateData(FALSE);voidCCalculatorDlg:SetVisibleCtrl()CWnd*pCtrl=GetWindow(GW_CHILD);CRectrcTest;CRectrcControl;CRectrcShow;GetWindowRect(rcShow);while(pCtrl!=NULL)pCtrl-GetWindowRect(rcControl);if(rcTest.IntersectRect(rcShow,rcControl)pCtrl-EnableWindow(TRUE);elsepCtrl-EnableWindow(FALSE);pCtrl=pCtrl-GetWindow(GW_HWNDNEXT);25
展开阅读全文