MFC计算器课程设计.doc_第1页
MFC计算器课程设计.doc_第2页
MFC计算器课程设计.doc_第3页
MFC计算器课程设计.doc_第4页
MFC计算器课程设计.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算器实验报告2013年6月11日星期二系统设计要求用MFC制作一个计算器,它能在实数范围内进行加、减、乘、除运算。在运算时要考虑运算符的优先顺序。要求能显示输入的算式和输出的结果。设计思路充分利用CString 的功能:1. 读入表达式在该过程中,只需要考虑会输入哪些算式,不需要考虑算式的合理性。2. 解析表达式2.1 将CString类的表达式转化为易操作的char类字符数组。2.2 在运算时,要区分运算符和数字,将它们分别存到两个数组中,由于加减乘除运算符都是二元的,所以数字的个数一定比运算符的个数多一个。3. 运算3.1 在运算时,第i个运算符要做的是将第i个数字与第i+1个数字相运算,运算完后将值赋给第i个数字,而i后面的每一个数字都可以往前面挪一个;运算符自运算过的运算符后的每一个都可以往前挪一个。形象地表示为:ai=ai*ai+1(红色括号内为变化后的值)第i个数字Float(a)12345 (0)Char(b)+-*/(0)ai=ai/ai+1第i个运算符得到结果:Float(a)12125 (0)Char(b)+-/ (0)在进行一次运算后,若后面补过来的运算符是与它同等级的,则此时的i依旧没变,所以再对该i进行运算。3.2 运算符的优先级。乘除的优先级大于加减,所以先对乘除进行以上的计算,同样同等级的i不变,若变化后的bi不为乘除,则i+,看下一个运算符。4.附加功能4.1 括号括号采用递归运算。运算的函数得到一个CString类型的形参,返回一个float型的值。要处理括号,则截取括号里的字符串,递归调用运算的函数,将返回的值存到float 型的数组中去。4.2 三角函数,指数函数,对数函数采用和括号相类似的方式,在解析时,若读到有三角函数,则递归计算三角函数括号内的式子,将返回的值用中的函数计算。4.3十进制与十六进制的转换将十六进制转化为十进制,只要从左向右,第i个数字乘以16的i-1次幂即可;将十进制转化为十六进制,则要将对16取模,再将得到的char数组倒置一下。系统功能模块图计算器系统加减乘除进制间转换三角函数 指数函数 对数函数系统流程图Input转化为十进制转化为十六进制ProcessingCos Sin Tan Exp Ln( )Output类的层次图Member FunctionClick FunctionOnNum1OnNum2;OnPoint;OnPlusOnDivide;OnLeft;OnRight;OnCosOnTan;OnAOnF;OnExp;OnLn;OnClear;OnDec;OnHex;OnEqualProcessing & CalculatingProcessingCmathcos;tan;sin;exp;logMember Variablesm_strInput输入的表达式m_strOutput输出的结果Class CCalculatorDlg UML关键程序代码1. 显示输入UpdateData(true);m_strInput+=0;UpdateData(false);2. 将CString转化为字符数组const int len=m_strInput.GetLength();char m100;memcpy(m,m_strInput,len);3. 将存在字符数组的数字转为float型数字存在float型的数组里for(i=0;i=0&mj=0&mj=9)numcountNum=numcountNum*10+(mj-0);j+;c+;/没有小数点的读法if(mj=.)c+;float t=static_cast(0.1);j+;while(mj-0=0)&(mj-0=9)numcountNum+=t*static_cast(mj-0);t*=static_cast(0.1);j+;c+;/有小数点countNum+;/取数字4. 取运算符if(mi=+|mi=-|mi=*|mi=/)opcountOperator=mi;c+;countOperator+;/取运算符5. 运算(以乘法为例)for(i=0;icountOperator;)/先计算乘除if(opi=*|opi=/)if(opi=*)count1+;numi*=numi+1;opi=opi+1;int j;for(j=i+1;jcountNum-1;j+)/每算完一次后该数字后面的数字都往前挪一个,运算符也都往前挪一个numj=numj+1;numj=0;for(j=i+1;jcountOperator-1;j+)opj=opj+1;opj=0;elsei+;6. 遇括号和cmath中的函数递归(以括号为例)CString b=a;b = b.Left(b.Find();b = b.Right(b.GetLength()-1-b.ReverseFind();numcountNum=Processing(b);c+=2+b.GetLength();countNum+;7 左右括号不符合报错if(m_strInput.Find()*m_strInput.ReverseFind()0)AfxMessageBox(Syntax Error!);总结1. 功能:该计算器能在实数范围内进行加减乘除四则混合运算,并通过加括号改变运算次序,能计算三角函数值(弧度制),能计算指数函数和对数函数(以e为底),能将数字在十进制与十六进制间进行转化。2. 缺点:2.1该计算器默认为十进制数,对于按钮和都可以运行。例如输入12,按,得到的是18,按得到的是C2.2该计算器能实现的加括号计算,可是对括号的要求是只能嵌套,而不能并列,这是由于在递归调用函数时,只能截取左右括号之间的字符串,不能保证他们是一对括号。3. 功能实现展示:3.1加减乘除+括号3.2 带小数3.3 带三角函数3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论