软件课程设计基于MFC的多功能计算器_第1页
软件课程设计基于MFC的多功能计算器_第2页
软件课程设计基于MFC的多功能计算器_第3页
软件课程设计基于MFC的多功能计算器_第4页
软件课程设计基于MFC的多功能计算器_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

题目 基于 MFC 的多功能计算器设计一、设计目标编写一个计算器。二、语言环境编程语言:C+开发环境:VS2017目标软件运行平台:Windows 64 位机三、软件功能:1. 图形化界面。2. 实现计算器的功能。3. 输入加减乘除表达式,可以计算其结果。4. 基本功能:计算表达式,计算阶乘, 计算组合数,次幂,求次幂后取余,简单的分数加减乘除计算。5. 扩展功能:在以上功能完成的基础上,可完成更高精度的计算,实现简单高精度的加减乘除阶乘运算。基于 MFC 的多功能计算器设计摘要计算器是人们日常生活中常见的电子产品之一,在人们的生活中有着非常广泛的应用,随着科学的进步,计算器的种类和功能也更加丰富。本次课程设计旨在基于 MFC框架设计一个多功能计算器,能够实现含括号的表达式计算,三角函数、开方、阶乘、排列组合等数学计算,进制转换,超过 long long 范围的整数运算以及简单的分数四则运算。此次设计的多功能计算器是基于 MFC 的框架,以 C+编程语言完成的,计算器使用中缀表达式求值的算法计算含括号的表达式,使用 C+标准库函数进行相应的数学计算,利用 Boost 库实现高精度的整数运算。本计算器不仅功能丰富,而且具有美观、功能清晰且操作方便的界面。经多次测试,本计算器能即时准确地获得所需的计算结果,并且能在输入错误时进行相应处理,充分降低了计算时的难度,节约了时间。通过本次课程设计,掌握了 MFC 基本框架,对基本算法有了更加深入的了解。关键词:多功能计算器;MFC;C+编程语言;表达式计算;高精度目录课题分析 .3总体设计 .3详细设计 .43.1 普通计算与科学计算 .43.2 高精度计算 .73.3 其他计算 .83.3.1 分数计算 .83.3.2 组合数计算 .83.3.3 进制转换 .8程序调试与问题解决 .94.1 输入表达式错误引发程序异常 .94.2 输入表达式格式有误 .94.3 计算排列组合溢出 .10运行结果 .10总结 .12课题分析本次设计为多功能计算器,需要实现多种功能,为了使界面更加美观,功能更加清晰明了,也为了让使用者便于操作,因此本计算器使用 MFC 中的 Tab Control 控件对计算器进行分页1,将计算器分为了四个板块,分别为:普通计算、科学计算、高精度计算和其他计算。普通计算板块不仅可以实现普通四则运算、次幂及取模的运算,还可以通过使用中缀表达式求值的算法计算表达式的值2;科学计算板块不仅包含普通计算板块中的功能,还可以进行三角函数、阶乘、根号以及对数的运算;高精度板块可以实现大整数的加减乘除次幂与取模计算;其他板块中含有分数的四则运算、组合数计算以及进制转换功能。程序总体功能框图如图 1。图 1 程序功能框图总体设计图 2 所示为整体设计流程框图。由于本次课程设计要实现的功能较多,如果放到一个页面上,既不美观,功能也不清晰,于是本计算器使用了 MFC 中的 Tab Control控件,将计算器分为四个部分,每个部分拥有不同的功能。打开本计算器后,计算器的变量自动初始化,接着用户选择自己所需要的功能模块进行操作。选择普通计算或者科学计算页面后,用户需要点击计算器上的按钮来输入所需计算的表达式,用户所输入的表达式会在编辑框中显示出来,当用户按下等于后,计算器会执行操作,计算当前编辑框中的值,并将结果返回到结果框中进行显示;否则,计算器会继续等待用户输入。选择高精度计算的页面后,用户可以进行超过 64 位整数的加减乘除、次幂以及取模的连续运算。用户通过按钮输入两个变量以及运算符,按下等号即可得到答案,接着用户可以选择继续按下运算符,使用本次得到的答案作为变量继续运算,也可以重新输入进行运算。选择其他计算的页面之后,可以看到该页面分为三个部分,分别是分数计算、组合数计算和进制转换。在分数计算部分,用户通过键盘输入分数的分子和分母,可以进行两个分数之间的加减乘除运算;在组合数计算部分,用户输入两个整数 n 和 m,点击计算后可以得到 A(n,m)与 C(n,m)的值;在进制转换部分,用户输入一个数字,选择当前数字的进制后,再点击需要转换的进制即可得到转换后的结果。图 2 整体设计流程图详细设计3.1 普通计算与科学计算科学计算板块与普通计算板块相比,新增了圆周率的按钮与三角函数、阶乘、根号与对数的计算,其他功能与普通计算板块一致,因此一起说明。首先,给编辑框添加类型为 Value 的控件变量,变量类型为 CString,变量名为result。接下来为每个按键添加事件处理程序,并且给清空键 C 添加 bool 型变量Restarted,初始化为 true;给等号添加 bool 型变量 OperatorPressed,初始化为true;给小数点添加 bool 型变量 pt,初始化为 false;给左括号和右括号分别添加int 型变量 cntleft 和 cntright,初始化为 0。每个按键的事件处理程序如下所述:(1)按下 0 到 9 的数字按钮。先将编辑框中的内容更新到编辑框所对应的变量 result中,判断上一次的按键是否为等于,或者上一次操作是否将编辑框清空,或者当前result 的末尾字符是否为”)” ,若满足三个中任意一个,那么 result 等于现在所按下的字符,否则,在 result 末尾追加当前所按下的字符。更新当前编辑框关联变量result 的值到编辑框内。具体流程如图 3a 所示。图 3a 按下数字按钮 图 3b 按下小数点按钮(2)按下小数点按钮。如果当前数字中没有出现过小数点(pt 为 false)并且最后一位为运算符,则在 result 末尾追加“0.” ,否则判断上一次按键是否为等于或上一次操作是否将编辑框清空或者 result 的末尾是否为右括号,如果满足,那么也在末尾追加“0.” ,否则在末尾追加“.” 。更新变量到编辑框。过程如图 3b 所示。图 3c 按下双目运算符按钮 图 3d 按下单目运算符按钮(3)按下运算符。在本计算器中,有双目运算符和单目运算符两种。如图 3c 所示,按下双目运算符按钮后,首先需要判断当前已输入字符串的末尾是否也是一个运算符,如果是则将之前的运算符替换为现在所按下的运算符,如果末尾是左括号,那么在末尾追加 0 和当前的运算符;若前一位不是运算符且当前不是第一次按键,就在字符串末尾追加该运算符,否则字符串等于该运算符。这样做就避免了输入错误而导致计算错误甚至程序崩溃。如图 3d 所示,按下单目运算符之后,将编辑中的字符转换为数字后进行计算,将结果转化为字符串显示出来即可。如果编辑框中还存在运算符,那么会取第一个运算符之前的数字进行运算。图 3e 按下左括号按钮 图 3f 按下右括号按钮(4)按下括号。如图 3e 所示,按下左括号后,先判断编辑框是否已经清空,若是,则 result 等于左括号,否则,找到从右往左的第一个运算符,在该运算符后面加上一个左括号,左括号个数 cntleft 加一,更新 result 的值到编辑框。如图 3f 所示,按下右括号后,首先要判断右括号的个数是否少于左括号的个数,如果满足才能添加右括号,否则忽略该次添加操作;左括号个数大于右括号个数时,若 result 的最后一位就是左括号,那么在其后面添加 0 和右括号,如果是其他运算符,那么去掉该运算符再添加右括号,如果是数字,则直接添加右括号。右括号个数 cntright 加一,更新result 的值到编辑框。(5)退格按钮与清空按钮。按下退格按钮时,若当前编辑框尚未清空,就将该字符串末尾一位删去,此时需要判断是否删除了左括号、右括号或者是小数点,删除左右括号时,对应的 cntleft 和 cntright 需要减一,删除小数点时,小数点的标志 pt要变为 false。按下清空按钮时,编辑框内容显示 0,所有变量重新初始化。(6)按下等于按钮。该处为本计算器的核心,使用了中缀表达式求值的算法,如图 3g 所示。由于输入的表达式是一个字符串,因此首先需要通过循环将其中的数字与字符提取出来。使用两个栈分别存放数字与运算符3,如果当前运算符优先级比栈顶元素优先级高,则入栈,否则从数字栈中弹出两个元素,从符号栈中弹出一个符号,计算其结果,再将结果压入数字栈。最后表达式的结果即为数字栈的栈顶元素,将该数字转化为字符串后更新到编辑框即可。图 3g 按下等于按钮3.2 高精度计算高精度计算部分可以进行连续的四则运算与取模、次幂的操作,每次两个变量参与运算,得到的结果可以继续作为一个变量参与下一次的运算。在高精度计算当中,按钮的事件响应与普通计算和科学计算中的按键的事件响应是相似的,编辑框关联 CString 类型的变量 result,给清空键添加 bool 类型变量 Restarted,给等号添加 bool 类型变量 OperatorPressed。实现高精度的方法有很多,此处选用了一种较为便捷又准确的操作,使用 C+的 Boost 库中的 multiple precision 工具。输入需要计算的式子,按下等于即可进行计算,如果式子中包含两个及其以上的双目运算符,只计算第一次出现的运算符和其前后的数字所得值,具体流程图如 4 所示。3.3 其他计算3.3.1 分数计算分数计算中,用户输入待计算的两个分数,点击所需要进行的运算类型,再按下图 4 高精度计算等号即可进行计算。计算过程模拟手动计算过程,a/b+c/d = (a*d+b*c)/(b*d),a/b-c/d = (a*d-b*c)/(b*d),a/b*c/d=ac/bd,a/b / c/d = a*d / b*c, 最后再将得到的结果化简。将结果的分子与分母的 GCD(最大公约数)求出,分子与分母同时除以 GCD 即可得到答案。3.3.2 组合数计算组合数计算中,用户输入整数 n 和 m,点击计算按钮,即可求出 A(n,m)与 C(n,m)的值。计算过程与手动计算过程一致,求得 n!,(n-m)!,A(n,m) = n!/(n-m)!,求得m!,C(n,m)=A(n,m)/m!。3.3.3 进制转换进制转换中,用户在转换数字框中输入需要转换的数字,选择该数字当前进制,点击需要转换的进制即可在下方得到转换后的结果。由于输入的 N 进制的数字是字符串,因此计算器会先将输入的字符串转化为十进制的整数,接着调用_itoa_s 函数将该十进制数进行进制转换。程序调试与问题解决4.1 输入表达式错误引发程序异常 图 5 输入错误引发异常将基本功能编写完成开始测试程序时,发现,如果输入的表达式不规范,程序将会出现异常,如图 5 所示。引发该异常的错误输入有很多情况,经过多次反复测试,发现了以下几种会引发该异常的情况:(1)连续输入运算符。(2)右括号个数多于左括号个数。(3)运算符后直接加上右括号。(4)以运算符开头或者左括号后直接加上运算符。经过断点调试发现,计算器每次运算时,数字栈每次弹出两个元素,符号栈弹出一个元素,但是进行以上不规范的操作,导致数字栈中元素只剩下一个时,符号栈中元素的个数仍然大于等于一,因此数字栈空时仍进行弹栈操作,出现错误。做出以下处理:(1)在计算部分,每次判断数字栈或者符号栈是否为空,并且在输入时判断是否连续点击了运算符,如果是,只保留最后一次的运算符。(2)保证右括号的个数恒小于等于左括号个数。(3)如果运算符后直接点击右括号按钮,则去掉该运算符后加上右括号。(4)若表达式以非*/%运算符开头,则在前方补 0,若左括号为运算符,则在左括号与运算符之间补 0。4.2 输入表达式格式有误除引发异常的错误输入外,还有多种错误的输入格式,有以下处理:(1)以小数点或运算符开头。如表达式“*3+5” “(.3+5)”,在这种情况下,在小数点或者运算符前自动补零,使显示正确。(2)数字后加左括号。如输入“3+5(” ,根据 Windows 自带计算器的处理,该

温馨提示

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

评论

0/150

提交评论