基于MFC的含四则混合运算的计算器

  今天无意间发现win7系统的标准型计算器连最基本的四则混合运算都没做,刚刚好公司给了我一个工作任务,就是用MFC实现一个含四则混合运算的计算器

  我在网上查询资料,发现大部分只是实现了基本的加减乘除运算,而含四则混合运算的也没有能够说得清楚明白。于是我搜索四则混合运算算法,发现要实现四则混合运算,就要用到逆波兰算法,而使用逆波兰算法,就要先把算术式从中缀表达式转换为后缀表达式

  所谓中缀表达式,就是我们平常的算术式,例如:1+2-3*4/5。

  而后缀表达式,就是将运算符写在操作数之后,上面算术式的后缀表达式为:12+34*5/-。具体是怎么来的呢,让我们看看后缀表达式的算法:

  1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则;

  2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”;

  3))从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出;

  4)如果不是数字,该字符则是运算符,此时需比较优先关系,做法如下:

    将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。

  5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

  可能很多人不是很理解这个过程,下面我们以1+2-3*4/5作为例子展示给大家。

  我们用vector容量来装后缀表达式,构建一个栈来装运算符。遍历算术式,遇到数字“1”,压进vector;遇到“+”,直接进栈;遇到“2”,压进vector;遇到“-”,“-”的优先级不高于“+”,“+”出栈,压进vector,“-”进栈;遇到“3”,压进vector;遇到“*”,“*”的优先级比“-”高,进栈;遇到“4”,压进vector;遇到“/”,“/”的优先级不比“*”高,“*”出栈,压进vector,此时栈顶为“-”,“/”的优先级比“-”高,进栈;遇到“5”,压进vector。遍历完成,此时vector为{12+34*},运算符栈为{-/},将运算符栈的内容压进vector,因为栈是后进先出,所以压进后vector的内容为{12+34*5/-}。如此,便完成了后缀表达式。

  下面介绍逆波兰算法。引用上面的例子,转换后的后缀表达式为12+34*5/-,构建一个新的栈,遍历后缀表达式,遇到数字直接进栈,遇到运算符,把栈顶2个数字拿出来进行运算,遍历完就是最后的结果。“1”“2”进栈,遇到“+”,把“1”“2”拿出来进行+运算,结果为“3”,把“3”进栈,继续遍历,“3”进栈,“4”进栈,此时栈为“3”“3”“4”,遇到“*”,把“3”“4”拿出来进行*运算,结果为“12”,把“12”进栈,此时栈为“3”“12”,继续遍历,“5”进栈,遇到“/”,把“12”“5”拿出来进行/运算,结果为“2.4”,把“2.4”进栈,遇到“-”,把“3”“2.4”拿出来进行-运算,结果为“0.6”,把“0.6”进栈,遍历完成,最后结果为“0.6”。这就是逆波兰算法的过程。

  下面,我们正式用MFC实现四则混合运算的计算器。

  新建项目,选择MFC,选择MFC应用程序,输入名称,点击下一步;

  点击下一步,选择基于对话框,一直点下一步,完成;

  

  项目建成后,将界面设计成计算器模样;

  

  给2个编辑框添加变量,一个输入算术式,一个输出结果,双击每个按键,添加输入函数,如此,基本框架已经定好,开始编写程序。

  先添加头文件#include <vector>、#include <stack>和using namespace std。

  先对OperatorEnable进行初始化,BOOL OperatorEnable = FALSE。

  这是我头文件的程序:

  

  数字按键的程序如下,0到9的程序一样,把数字改一下:

  

  运算符的程序如下,程序一样,把运算符改一下:

  

  清除按键程序如下:

  

  等号按键的程序如下:

  

  

  转换后缀表达式的程序如下:

  

  

  

  逆波兰算法过程程序如下:

  

  

  

  判断运算符优先级程序如下:

  

  到此,程序已经完成。可以实现四则混合运算。以下进行测试:

  随机输入一段算术式,按下等号,输出结果,然后在电脑计算器上进行运算,得出结果进行对比。

    

  

  好了,基于MFC的含四则混合运算的计算器已经完成,这个实现过程让我对MFC有了更深的认识。下一篇,我会写一篇基于MFC的单色BMP图片生产软件。

  

  

时间: 2024-10-13 20:57:15

基于MFC的含四则混合运算的计算器的相关文章

软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想

对于小学四则混合运算出题软件的设计,通过分析设计要求,我觉得为了这个软件在今后便于功能上的扩充,可以利用上学期所学习的<编译原理>一课中的LL1语法分析及制导翻译的算法来实现.这样做的好处有以下几点: 1. 由于LL1制导翻译是一项成熟且可靠的技术,并且其递归下降算法易于改编为算式生成算法: 2. 我们有系统的方法可以获得较复杂表达式的LL1文法,则可以方便地生成形式丰富的算式: 3.由于四则混合运算中需要考虑运算优先级的问题,那么采用LL1分析器可以很方便的实现计算表达式的功能: 4.当用户

JAVA实现简单四则混合运算

JAVA实现简单四则混合运算,说明:该计算器支持实则混合运算,如 2*(3+1 )/ 4-3 *9+ 8/ 3*4- 5,则输出:-19.333332 需要说明的事括号必须是英文的.源码如下仅供学习: 运行后直接在Console里面敲然后回车即可 [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

C语言写的秒速计算四则混合运算项目

开发语言:C语言 开发工具:Visual Studio 2017 整理时间:2017年8月2日 源代码:500行: 开发方式:C语言多文件模式开发 实现功能:在文件中写入四则混合运算表达式(无论有多长...),按运行即可得出结果. 四则混合运算表达式形如: (19+67)*33-45/5+17*52+39/3+.... 意义:在实际快速计算的同时,对学习也有如下意义:对堆栈的学习应用,多多文件的学习巩固 项目演示截图: 其他C语言项目参考:

第四次作业 结对编程 (四则混合运算)

一 需求分析 本次我们做的程序是数学的四则混合运算,并且增加了部分人性化的功能,接下来,我们谈谈这个程序的相关需求,此程序是一个1—10的四则混合运算,那么可以想到主要用于小学生,(ps 个人想法,不排除其他高年级的使用,因为用户可以输入任意的随机数范围),此外,本程序还可能会出现在家庭.教育机构和部分教学网站上面,因为他们可能会给学生出一些简单的数学题目,可以自由设置测试时间,题目数量等内容,而这一程序正好解决了这一个问题,我想,产品的需求必须首先知道用户需要什么,要以客户为中心.而这个产品正

MathExamV2.0四则混合运算计算题生成器

MathExamV2.0四则混合运算计算题生成器----211606360 丁培晖 211606343 杨宇潇 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 ? Estimate ? 估计这个任务需要多少时间 60 100 Development 开发 ? Analysis ? 需求分析 (包括学习新技术) 360 440 ? Design Spec ? 生成设计文档 20 20 ? D

加/减/乘/除四则混合运算(C 语言)

逆波兰表达式(也称为后缀表达式) C 语言简单实现,(也称为后缀表达式) 本示例旨在展示逆波兰表达式原理,作简单的混合运算,不作容错处理也不保证结果,若混合运算字符串中有负数等,自行调试解决 列如计算: 20.5+(100-(3+2)*8)/(8-5) - 10 后缀表达式为:20.5 100 3 2 + 8 * - 8 5 - / 10 - + C  语言代码如下: #include <stdio.h> #include <stdlib.h> #include <strin

201574010343/201571030318《小学四则混合运算》结对项目报告

github代码地址:https://github.com/zxt555/demo2/tree/master/src 一:需求分析 1. 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分: 2.系统随机产生一百以内的两个数进行运算选择加.减.乘.除运算. 3.系统随机产生一百以内的两个数进行运算. 4.练习时,用户从键盘输入结果,正确和错误均有提示,错误的话提示下会有正确的结果. 5. 根据实

四则混合运算

主题运算: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO; namespace shuxuefudao{ public partial class Form1 :

201571030318/201574010343《小学四则混合运算》结队报告 马麒

GitHub源码地址:https://github.com/xuexibuhaoderen/SoftWareTest 需求分析 1. 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分: 2. 题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下: (3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做).带括号算式.真分数算式练习: (4)程序允许用户进行多轮测