


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机与信息工程学院程序设计基础课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:专业班级:电子信息工程(1)班指导教师:高攀1课程设计的题目编写一个能实现简单功能的计算器2题目要求1. 有一个计算器图形。2. 能实现加、减、乘、除及乘方的运算。3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数 字键要改变颜色例如:输入数字1时,在计算器图形上的1键变为红色。4. 屏幕、图形颜色、形状自定3总体设计3.1总体框架加法单调的图1系统框架3.2 系统功能说明在VC+6.0中绘制计算器界面,各控件的设置对09控件设定相应的ID和其他属性:图2
2、“1 ”控件设置对“ +、-、*、 ”控件设定相应的ID和其他属性:图2“ +”控件设置对其它控件设定相应的ID和其他属性:图3其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。 拖出的控件有上面的一个 Edit控件用于显示数字,Butt on控件用于处理鼠标的 消息。4程序详细设计4.1系统主调模块图5程序流程图4.2各模块详细设计 421建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTIONMessage Han dlerIDD CALC DIALOG简易计算器N/AIDC NUM00OnNumOIDC NUM11On Num1IDC
3、NUM22OnNum2IDC NUM33On Num3IDC NUM44OnNum4IDC NUM55OnNum5IDC NUM66On Num6IDC NUM77OnNum7IDC NUM88On Num8IDC NUM99OnNum9IDC NEG+/-OnNegIDC PTOn PtIDC DIV/On DivIDC MUL*On MulIDC MIN-On MinIDC ADD+On AddIDC BACKSPACEBACKOnBackspaceIDC CECEOnCeIDC CLEARCOn ClearIDC EQU=On EquIDC DISN/AN/AOn Cal(double
4、num)变量定义:double poz; 保存小数点的位置,初始化为1,表示poz-1个小数点。double m_Dis; /Edit控件上需要显示的数字BOOL poin t_flag; 小数点表示位,判定是否是小数,是小数为1,不是小数为0。double numfirst; 保存计算过程中的前一个数字,double numseco nd;/保存计算过程中的第二个数字char op;/记录当前的计算符号,可以为+'-',; ' *' , ' /' , ' =' , ' c' , ' n' 变量初始
5、化:poz=1;m_Dis = 0.0;nu mfirst=0;nu msec on d=0;op=0;442设计思路a) 首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。符号需要一个 char op来存储。b) 然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst=0 && numseco nd=0也就是程序刚开始运行还没有开始录入数字的状态。
6、二种是numfirst!=0 && numsecond=0 也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给 numfirst,第三种是 numfirst!=0 &&numsecond!=0 ,表示可以 通过op来把两数合并为一个数。c) 考虑到该计算器支持连续的计算,比如3.33+1.33*88/96= ?。所以必须在点符号Button也要计算岀之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。d) 因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效
7、果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别岀来小数和整数。成员函数及其释义因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共 同的函数OnCal(double num)来简化源代码长度,增加模块性。void CCalcDlg:OnCal( double num)/分三种状态来处理if (numfirst!=0 && numsecond!=0)if (point_flag=TRUE)/判定为小数poz*=0.1; / 小数进位m_Dis=m_Dis+poz*num; 递增UpdateData( false )
8、; /把结果从内存传递到屏幕elsem_Dis=m_Dis*10+num; UpdateData( false );if (numfirst!=0 && numsecond=0)if (point_flag=TRUE)poz*=0.1;m_Dis=m_Dis+poz*num; UpdateData( false );else /判定为整数m_Dis=m_Dis*10+num;/ 递增 UpdateData( false );if (numfirst=0 && numsecond=0)if (point_flag=TRUE)poz*=0.1;m_Dis=m_Dis
9、+poz*num;UpdateData( false );elsem_Dis=m_Dis*10+num; UpdateData( false );424以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。void CCalcDlg:OnAdd()/根据numfirst和numsecond和op的值分为5种状态。if (numfirst!=0 && numsecond=0&&op= '+')numsecond=m_Dis;numfirst=numfirst+numsecond; /之前按
10、的是加把两个数赋值到前一个数m_Dis=numfirst;赋值给屏幕numsecond=0; /从新赋值为0,清空,不影响下一次判断UpdateData(FALSE);m_Dis=0; /屏幕的值同时清空if (numfirst!=0 && numsecond=0&&op= '-')numsecond=m_Dis;numfirst=numfirst-numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;if (numfirst!=0 && numsecond=
11、0&&op= '*')numsecond=m_Dis;numfirst=numfirst*numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;if (numfirst!=0 && numsecond=0&&op= '/')numsecond=m_Dis;numfirst=numfirst/numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;if (numfirst=0
12、&& numsecond=0) /该状态为程序启动还没有开始录入输入的状态numfirst=m_Dis; /屏幕的值赋值到 numfirstUpdateData(FALSE);m_Dis=0;op='+' ; / 最后记录最后一个操作是+poz=1;小数点位置归位point_flag=FALSE;默认小数点标志为整数,也就是 0,也就是FALSE“ +/按钮的处理函数void CCalcDlg:OnNeg()m_Dis=-m_Dis;/换个符号,其他都一样UpdateData(FALSE);poz=1;point_flag=FALSE;'.'按钮
13、的处理函数void CCalcDlg:OnPt()point_flag=TRUE; / 把标志位改为"小数点”状态“ Backspace ”按钮的处理void CCalcDlg:OnBackspace()/主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换char buffer30; / 定义个装字符的数组_gcvt(m_Dis, sizeof (m_Dis),buffer); /把m_Dis存的数字转换为 stringfor (int_i=0;i<30;i+)-if (bufferi= '.' && bufferi+1=0
14、 )/ 判断是否为整数point_flag=FALSE; /标志位设置为"整数位” break ;if (point_flag=TRUE) / 如果是小数for (int j=0;j<30;j+)if (bufferj=0) bufferj-1=0; /把'0之前的字符赋值为0 ',就相当于剪掉最后一位break;else /如果是整数bufferi-1=0; / 剪掉'.'之前那位m_Dis=strtod(buffer,NULL); 再用 strtod 弄成浮点数 UpdateData(FALSE);poz=1;'CE'按钮处理
15、函数void CCalcDlg:OnCe()if (numfirst!=0 && numsecond=0)/CE只能修改第二个数字m_Dis=0; /把屏幕的值赋值为0UpdateData(FALSE);/ 并显示出来'C'按钮处理函数void CCalcDlg:OnClear()op=NULL; /清空符号numfirst=0;/清空第一个数字numsecond=0;/清空第二个数字point_flag=FALSE;/ 改为默认整数位poz=1;小数点归位m_Dis=0;UpdateData(FALSE); / 屏幕显示归 0键盘响应:void CCalcDl
16、g:O nKeyDow n( UINT n Char, UINT nRepC nt, UINT n Flags) switch( nChar)case VK_NUMPAD0:On NumO();break;case VK_NUMPAD1:On Num1();break;case VK_NUMPAD2:On Num2();break;case VK_NUMPAD3:On Num3();break;case VK_NUMPAD4:On Num4();break;case VK_NUMPAD5:On Num5();break;case VK_NUMPAD6:On Num6();break;case
17、VK_NUMPAD7:On Num7();break;case VK_NUMPAD8:On Num8();break;case VK_NUMPAD9:On Num9();break;case VK_ADD:OnAdd();break;case VK_SUBTRACT:OnMi n( );break;case VK_MULTIPLY:OnMul();break;case VK_DIVIDE:OnDiv();break;case VK_BACK:OnBackspace();break;case VK_DECIMAL:On Pt();break;case VK_DELETE: OnBackspace
18、();break;case VK_RETURN: OnEqu();break;CDialog:O nKeyDow n(n Char, nRepC nt, nF lags);BOOL CCalcDlg:PreTra nslateMessage(MSG* pMsg)Sen dMessage(pMsg->message,pMsg->wParam,pMsg->lParam); return CDialog:PreTra nslateMessage(pMsg);5程序运行结果6课程设计总结通过这次课程设计,我又收获到很多,平时的在做作业时,因为题 形与结构都是很简单的,并且每一章的内容都是有相应的例题可以参 考,所以在做题时没有遇到过很麻烦的问题,而这次不同了,一个课题 拿到手时,给我的感觉是无从下手,而且要求很多,使得题目要求更大 了。我将整个程序分块完成的将整个大的程序的实现分8个功能,每 个功能都通过一个相应的函数来实现.在调试时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 襄阳教师就业协议书
- 维修设备劳务协议书
- 竹苗培育合同协议书
- 自带车辆安全协议书
- 药材基地建设协议书
- 虚拟艺人签约协议书
- 解散员工补偿协议书
- 自建道路补偿协议书
- 药品发放免责协议书
- 行政法学知识拓展试题及答案
- 阑尾腹腔镜下阑尾切除术护理查房
- 云南省德宏州2022-2023学年八年级下学期期末考试英语试题(含答案)
- QC小组培训教材流程
- 蒸汽冲管方案
- 宋小宝小品《碰瓷》完整台词
- 2023年高速公路收费员面试
- 家长课堂(预防接种)
- 无菌技术操作培训-课件
- 结合工作实际谈如何改进工作作风、提高工作效率、改进工作方法六篇
- 医院医学伦理委员会相关表格模版(共3个)
- 道德与法治一年级下册《大家一起来合作》教学设计
评论
0/150
提交评论