题目基于MFC的多功能计算器设计一、设计目标编写一个计算器。二、语言环境编程语言:C++开发环境:VS2017目标软件运行平台:Windows64位机三、软件功能:1.图形化界面。2.实现计算器的功能。3.输入加减乘除表达式,可以计算其结果。4.基本功能:计算表达式,计算阶乘,计算组合数,次幂,求次幂后取余,简单的分数加减乘除计算。5.扩展功能:在以上功能完成的基础上,可完成更高精度的计算,实现简单高精度的加减乘除阶乘运算。基于MFC的多功能计算器设计摘要计算器是人们日常生活中常见的电子产品之一,在人们的生活中有着非常广泛的应用,随着科学的进步,计算器的种类和功能也更加丰富。本次课程设计旨在基于MFC框架设计一个多功能计算器,能够实现含括号的表达式计算,三角函数、开方、阶乘、排列组合等数学计算,进制转换,超过longlong范围的整数运算以及简单的分数四则运算。此次设计的多功能计算器是基于MFC的框架,以C++编程语言完成的,计算器使用中缀表达式求值的算法计算含括号的表达式,使用C++标准库函数进行相应的数学计算,利用Boost库实现高精度的整数运算。本计算器不仅功能丰富,而且具有美观、功能清晰且操作方便的界面。经多次测试,本计算器能即时准确地获得所需的计算结果,并且能在输入错误时进行相应处理,充分降低了计算时的难度,节约了时间。通过本次课程设计,掌握了MFC基本框架,对基本算法有了更加深入的了解。关键词:多功能计算器;MFC;C++编程语言;表达式计算;高精度目录课题分析...........................................................................................................................................4总体设计...........................................................................................................................................4详细设计...........................................................................................................................................53.1普通计算与科学计算............................................................................................................53.2高精度计算..........................................................................................................................83.3其他计算..............................................................................................................................83.3.1分数计算....................................................................................................................83.3.2组合数计算................................................................................................................93.3.3进制转换....................................................................................................................9程序调试与问题解决.........................................................................................................................94.1输入表达式错误引发程序异常.............................................................................................94.2输入表达式格式有误..........................................................................................................104.3计算排列组合溢出.............................................................................................................10运行结果.........................................................................................................................................11总结.................................................................................................................................................13课题分析本次设计为多功能计算器,需要实现多种功能,为了使界面更加美观,功能更加清晰明了,也为了让使用者便于操作,因此本计算器使用MFC中的TabControl控件对计算器进行分页[1],将计算器分为了四个板块,分别为:普通计算、科学计算、高精度计算和其他计算。普通计算板块不仅可以实现普通四则运算、次幂及取模的运算,还可以通过使用中缀表达式求值的算法计算表达式的值[2];科学计算板块不仅包含普通计算板块中的功能,还可以进行三角函数、阶乘、根号以及对数的运算;高精度板块可以实现大整数的加减乘除次幂与取模计算;其他板块中含有分数的四则运算、组合数计算以及进制转换功能。程序总体功能框图如图1。图1程序功能框图总体设计图2所示为整体设计流程框图。由于本次课程设计要实现的功能较多,如果放到一个页面上,既不美观,功能也不清晰,于是本计算器使用了MFC中的TabControl控件,将计算器分为四个部分,每个部分拥有不同的功能。打开本计算器后,计算器的变量自动初始化,接着用户选择自己所需要的功能模块进行操作。选择普通计算或者科学计算页面后,用户需要点击计算器上的按钮来输入所需计算的表达式,用户所输入的表达式会在编辑框中显示出来,当用户按下等于后,计算器会执行操作,计算当前编辑框中的值,并将结果返回到结果框中进行显示;否则,计算器会继续等待用户输入。选择高精度计算的页面后,用户可以进行超过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所示。由于输入的表达式是一个字符串,因此首先需要通过循环将其中的数字与字符提取出来。