模拟计算器程序-课程设计

合集下载

简单的计算器模拟程序的设计和实现

简单的计算器模拟程序的设计和实现

简单的计算器模拟程序的设计和实现1.问题描述对任意给定的正确四则运算表达式,程序计算其结果值并输出。

程序无需查错功能,假定所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为 +、-、*、/,表达式以字符 "=" 结束。

程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。

2.设计说明2.1简要的分析根据要求,要先输入包含有+,-,*,/的运算符的表达式,然后经过计算得到正确的答案。

从键盘中输入的是ASCII码,因此要将其转换为十进制的数据然后才能进行计算。

如果输入混合表达式,要将中缀式先变化成后缀式,然后再进行计算。

2.2概要分析2.2.1 定义的数据段用于定义一些中间变量,并将显示在试验界面上,以及提示信息。

data segmentstri db 50 dup(0)exp db 30 dup(0)track db 30 dup(0)instr db 100 dup(0)msg0 db 'please input your formular:',0dh,0ah,'$'msg1 db 0dh,0ah,'wrong input','$'msg2 db 0dh,0ah,') and ( does not match','$'msg3 db 0dh,0ah,'div zero error','$'msg4 db 0dh,0ah,'sorry,minus data appears','$'msg5 db 0dh,0ah,'any key to continue,esc to exit','$'data ends2.2.2 定义的堆栈段声明用于将中缀表达式转换为后缀表达式,以及进行后缀表达式求值过程用到的堆栈段。

计算器java课程设计--简单计算器

计算器java课程设计--简单计算器

计算器java课程设计一简单计算器学号: 姓名: 班级: 101210109好茨4巒戊《JAVA程序设计》课程设计报告简单计算器卫口Tfp10级计科一班吕海莲___________2012-12-25一、设计内容和要求1、简单计算器模拟程序的基本要求模拟Windows中附件里面的计算器软件,能实现整数的加、减、乘、除四则运算。

2、需要实现的主要功能该计算器模拟程序使用Java的awt包和Swing包的类库设计图形界面的计算器显示用户界面并且使用图形界面中的事件event委托机制来处理事件响应,以及用Java语言设计实现整数的加、减、乘、除四则运算。

(附加功能:淸零和异常处理机制)二、系统分析与概要设计1、面板JPanel txtpanel:用于放置文本框Panel btnpanel:用于放置按钮(0・9 和+,-,*/,=)2、显示部分(1)第一个面板:txtpanel位置以及排列方式BorderLayout.NORTHtxtpanel.add(txtinput):添加文本框到txtpanel 面板中(2)第二个面板:btnpanel排列方式:setLayout(gl)3、基本按钮btnpanel.add(b5);btnpanel.add(bl); btnpanel.add( multiply) btnpanel.add(b4) btnpanel.add(b6) btnpanel.add(divide)btnpaneLadd(bO) .add(bdes) btnpaneLadd(equal); btnpaneLadd(subtract)以上是在第二个面板btnpanelH中添加的0到9和+,-,*/,=的按钮。

4、附加功能(1)“清零”:用于清空文本框和下一次的运算(2)“异常处理”除数为零:当除数为零时,弹出“除数不能为零”窗体错误输入:当只单击运算符时,弹出“错误输入”窗体三、详细设计和编码1、总体功能图1、类的定义及关系Jsq类继承JFrame类创建主界面,在主界面上由文本框JTextField和JButton 组件构成,JTextField和JButton组件分别放置在两个不同的面板JPanel 上,同时利用按钮注册监听器,获取事件源。

模拟计算器课程设计报告

模拟计算器课程设计报告

合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程JAVA语言课程设计课程设计名称模拟计算器专业班级07网络工程(1)姓名舒业超指导教师许强张贯虹2010年9月一、需求分析程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入‘=’ 符号后,窗口显示出结果。

故需先定义一个类,继承Frame类,来实现一个窗口的显示,还需添加两个文本框,一个用于输入运算表达式,另一个显示运算结果,并以等‘=’号为表达式结束符,并触发运算的开始,所以还需设置一个键盘监听器,监听‘=’号的输入。

该计算器还要两个C(清除)、A(全清除)按钮,并予以监听,触发后进行相应操作。

如果用户输入的表达式不合法,需判别出来并给出相应的错误提示。

二. 设计1.设计思想:该程序有较好的用户操作界面,组件布局采用手动布局,并对相应组件设置监听器,触发后执行相应操作。

该程序主要的算法功能是如何利用栈实现运算符优先级的比较。

先是定义申请两个堆栈,一个作为运算数栈,另一个作为运算符栈,这两个堆栈是扫描表达式时的存储容器,在扫描过程中,扫描的单位是一个字符,扫描到的运算数入数栈,运算符入运算符栈,待比较优先级后,运算数出栈进行运算。

对于表达式的非法性判断,通过捕获异常来处理,捕获到异常后,弹出一个错误提示对话框,提示表达式的非法,并要求用户全清除后重新输入正确并完整的表达式。

2.功能设计定义一个myframe类来继承Frame类,实现窗口的显示,并在其中进行手动布局,即添加一个表达式输入文本框、一个结果显示文本框、C(清除)以及A(全清除)按钮。

在表达式文本框中输入完整表达式之后按下‘=’号后,通过键盘监听器的监听,开始进行运算。

运算过程如下:先在窗口类中将表达式提取出来,此时表达式为串字符串,需通过一个方法将其进行切割,切割成字符数组形式,然后将字符数组传递给一个Calculator类中的Calculator1方法(即运算引擎)进行表达式的计算,在这个方法执行结束时可返回运算的结果,接着将结果显示在结果文本框中即可。

微机原理模拟计算器设计课程设计

微机原理模拟计算器设计课程设计

微机原理模拟计算器设计课程设计(共27页)-本页仅作为预览文档封面,使用时请删除本页-课程名称微机原理及应用院部名称机电工程学院专业电气工程及其自动化班级吴映阳指导教师李国利金陵科技学院教务处制摘要学了微型计算机原理与应用课程之后,为了巩固和检测所学知识,我选择基于8088CPU的模拟计算器设计。

要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图并且用仿真软件仿真。

仿真正确后再连接硬件电路,电路连接完成后进行调试。

设计过程中我们用到了8088CPU、可编程计时器8253、可编程并行输入/输出芯片8255A、74LS138、2*8矩阵式键盘、六位七段LED数码管。

原理图设计完成之后用PROTUES仿真软件对原理图进行了仿真得到了预期的结果。

我们的模拟计算器能实现5位十进制数以内的及减法运算和2位十进制数以内的乘除法运算。

关键词:模拟计算器,8088CPU,PROTUES,8255A目录一、概述 (4)二、硬件电路 (4)、CPU控制模块 (4)、键盘输入模块 (6)、可编程并行通信接口芯片8255A (7)、可编程计数器/定时器 (8)、总原理图 (9)三、软件设计框图 (10)四、源程序 (11)五、调试过程 (26)六、课程设计体会 (26)七、参考文献 (27)模拟计算器设计一、概述设计思路:首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现5位十进制数以内的及减法运算和2位十进制数以内的乘除法运算。

运算完成后将运算的结果储存并显示到LED显示器上。

二、硬件电路设计硬件电路键盘输入及LED数码管通过8255A接口与系统总线连接,键盘的16个按键组成8*2矩阵,其中8根矩阵线作为8255A的输出线与PB7~PB0连接,2根矩阵线作为8255A的输入线与PC7、PC6连接。

proteus仿真计算器课程设计

proteus仿真计算器课程设计

proteus仿真计算器课程设计一、课程目标知识目标:1. 学生能理解Proteus仿真软件的基本原理和操作流程;2. 学生能掌握利用Proteus进行简单计算器电路设计与仿真;3. 学生能了解并描述计算器电路中的基本电子元件及其功能;4. 学生掌握基本的数字电路知识,如逻辑门、触发器等。

技能目标:1. 学生能独立使用Proteus软件进行电路设计;2. 学生能通过Proteus软件进行电路仿真,并对结果进行分析;3. 学生能运用已学知识解决实际计算器电路设计中遇到的问题;4. 学生能通过团队协作,共同完成一个具有基本功能的计算器电路设计。

情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发创新意识和实践欲望;2. 学生在团队合作中学会沟通、协作,培养团队精神和责任感;3. 学生通过动手实践,体验成功的喜悦,增强自信心;4. 学生树立正确的价值观,认识到科技发展对国家和社会的重要性。

本课程针对高年级学生,结合电子技术课程内容,以Proteus仿真软件为载体,使学生掌握基本电子元件和数字电路知识。

课程注重实践操作和团队协作,旨在提高学生的实际动手能力和创新能力,为后续深入学习电子技术打下坚实基础。

通过本课程的学习,学生将能够独立完成一个简单计算器电路的设计与仿真,并在过程中培养良好的情感态度和价值观。

二、教学内容1. 计算器电路设计基础理论:- 简介计算器电路的组成和原理;- 学习基本电子元件:电阻、电容、二极管、三极管等;- 了解并掌握数字电路基础知识:逻辑门、触发器、计数器等。

2. Proteus仿真软件操作:- 学习Proteus软件的基本界面和功能;- 掌握Proteus软件的电路设计、仿真和调试方法;- 学习如何利用Proteus软件绘制电路图、设置元件参数等。

3. 计算器电路设计与仿真:- 根据计算器功能需求,设计电路原理图;- 利用Proteus软件进行电路仿真,观察并分析仿真结果;- 针对仿真过程中出现的问题,进行调试和优化。

计算器小程序课程设计

计算器小程序课程设计

计算器小程序课程设计一、教学目标本课程旨在让学生掌握计算器小程序的基本概念、原理和操作方法,培养学生运用计算器解决实际问题的能力。

具体目标如下:1.知识目标:(1)了解计算器小程序的分类及其应用领域。

(2)掌握计算器小程序的基本语法和操作步骤。

(3)熟悉常见的数学函数和图形函数,并能应用于实际问题。

2.技能目标:(1)能够独立安装和使用计算器小程序。

(2)能够运用计算器小程序解决数学、科学和工程等领域的问题。

(3)具备编写简单的计算器小程序的能力。

3.情感态度价值观目标:(1)培养学生对计算技术的兴趣,提高信息素养。

(2)培养学生独立思考、合作交流的学习习惯。

(3)培养学生勇于探索、创新的精神风貌。

二、教学内容本课程的教学内容主要包括以下几个部分:1.计算器小程序概述:介绍计算器小程序的概念、分类及其应用领域。

2.计算器小程序基本语法:讲解计算器小程序的基本语法,包括变量、数据类型、运算符等。

3.计算器小程序操作方法:介绍计算器小程序的操作步骤,如输入、输出、循环、条件判断等。

4.数学函数和图形函数:讲解计算器小程序中的数学函数和图形函数,并举例说明其应用。

5.实际问题求解:通过案例分析,让学生学会运用计算器小程序解决实际问题。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:教师通过讲解计算器小程序的基本概念、原理和操作方法,为学生提供系统的知识结构。

2.讨论法:学生分组讨论实际问题,交流解题思路,培养合作精神。

3.案例分析法:分析典型案例,让学生学会将理论知识应用于实际问题。

4.实验法:学生动手编写计算器小程序,验证理论知识,提高实践能力。

四、教学资源为实现教学目标,我们将采用以下教学资源:1.教材:《计算器小程序教程》。

2.参考书:为学生提供丰富的课外阅读资料,拓展知识面。

3.多媒体资料:制作课件、视频等,辅助课堂教学。

4.实验设备:为学生提供计算器编程环境,进行实践操作。

课程设计—模拟计算器设计..

课程设计—模拟计算器设计..

嵌入式课程设计课题:基于uCOS/uCGUI的模拟计算器实现报告:张昌世自动化091 109031027小组成员:刘锋自动化091 109031023陈奇英自动化091 109031001彭桂贤自动化091 109031002指导老师:陈才摘要:计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于工程、学习、商业等日常生活中,极大的方便了人们对于数字的整合运算。

现今的计算器已经不仅仅停留在传统的硬件上,而是越来越软件化,它可以在手机里,在电脑上,在许许多的的电子产品上。

所以有必要在自己平时学习的开发板上做个带界面显示的计算器来证明下自己的能力。

引言:简单的计算器包括0~9的数字输入键,小数点输入键,+、-*、/、=运算键等,还可以加入其他运算:如三角运算(sin,cos,tan,cot等),一些当木运算(平方,开方,阶乘等)。

由于条件和能力有限,所以就做个能实现四则运算的简易计算器。

计算器的程序设计实际上富有一定的难度,虽然乍一想很简单,只要实现下加减乘除运算,然后显示出来就可以了,但实际上运算结果跟图像界面的数据交换,还有浮点数的处理等都很折腾人。

通过本次设计,体会到了学习的不易,还有自己能力上的不足!一、课题描述:在STM32开发板上实现简易的计算器。

计算器界面显示在TFT彩屏上,采用触摸屏上模拟按钮来实现数据及运算符的输入。

最后把运算的结果显示在彩屏。

最基本要求:有加减乘除运算,有带小数点的运算。

二、课题分析a)、硬件要求:处理器选择:STM32F103ZE,这款处理器具有512K的flash,64K的RAM,足够大的空间,可以让程序员的可以有更大的发挥空间,而不用为节省空间而上脑筋。

TFT彩屏:带触摸的TFT彩屏,3.2寸,分辨为240*320的真彩彩屏。

JLink仿真器:使用JLink v8仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。

模拟计算器数字输入及显示课程设计

模拟计算器数字输入及显示课程设计

摘要本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个4*4的键盘,一个排阻(10K)做P0口的上拉电阻(接线图在附录2),它可以实现结果低于65535的加、减、乘、除运算。

显示部分:采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为单片机的字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口作为数码管的位控制端。

按键部分:采用4*4键盘。

采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。

执行过程:开机即显示0,等待键入数值,当键入数字,将通过数码管显示出来,在键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当在键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

注:结果不能超出65535。

(具体操作见后面仿真图)目录1 概述1.1MCS-51单片机在自动化仪表中的作用 (3)1.2掌握单片机仿真软件Proteus的使用方法 (3)1.3设计方法 (3)1.4基本功能 (4)2 系统总体方案及硬件设计2.1计算器总体思想 (5)2.2硬件的选择与连接 (6)3 软件设计3.1显示程序设计 (7)3.2键盘识别程序设计 (8)3.3运算程序设计 (10)3.4风鸣器程序设计 (10)4 Proteus软件仿真 (12)5课程设计体会 (16)参考文献 (18)附1:源程序代码 (19)附2:计算器模拟系统电路图 (31)1 概述1.1MCS-51单片机在自动化仪表中的作用单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模拟计算器学生姓名:**** 指导老师:****摘要本课程设计的课题是设计一个模拟计算器的程序,能够进行表达式的计算,并且表达式中可以包含Abs()和Sqrt()运算。

在课程设计中,系统开发平台为Windows ,程序设计设计语言采用C++,程序运行平台为Windows 或*nix。

本程序的关键就是表达式的分离和处理,在程序设计中,采用了将输入的中缀表达式转化为后缀表达式的方法,具有可靠的运行效率。

本程序做到了对输入的表达式(表达式可以包含浮点数并且Abs()和Sqrt()中可以嵌套子表达式)进行判定表达式是否合法并且求出表达式的值的功能。

经过一系列的调试运行,程序实现了设计目标,可以正确的处理用户输入的表达式,对海量级数据都能够通过计算机运算快速解决。

关键词C++程序设计;数据结构;表达式运算;栈;中缀表达式;后缀表达式;字符串处理;表达式合法判定;目录1 引言 (3)1.1课程设计目的 (3)1.2课程设计内容 (3)2 设计思路与方案 (4)3 详细实现 (5)3.1 表达式的合法判定 (5)3.2 中缀表达式转化为后缀表达式 (5)3.3 处理后缀表达式 (7)3.4 表达式嵌套处理 (8)4 运行环境与结果 (9)4.1 运行环境 (9)4.2 运行结果 (9)5 结束语 (12)参考文献 (13)附录1:模拟计算器源程序清单 (14)1 引言本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。

该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。

利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

该算法的复杂度为O(n),能够高效、快速地求解表达式的值,提高用户的效率。

1.1课程设计目的数据结构主要是研究计算机存储,组织数据,非数值计算程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

模拟计算器程序主要利用了“栈”这种数据结构来把中缀表达式转化为后缀表达式,并且运用了递归的思想来解决Abs()和Sqrt()中嵌套表达式的问题,其中还有一些统计的思想来判定表达式是否合法的算法。

1.2课程设计内容本次课程设计为计算器模拟程序,主要解决表达式计算的问题,实现分别按表达式处理的过程分解为几个子过程,详细的求解过程如下:1 用户输入表达式。

2 判定表达式是否合法。

3 把中缀表达式转化为后缀表达式。

4 求出后缀表达式的结果。

5 输出表达式的结果。

通过设计该程序,从而做到方便的求出一个表达式的值,而不需要一步一步进行运算。

2 设计思路与方案本课程设计需要考虑许多的问题,首先是表达式的合法判断,然后是字符串表达式提取分离的问题,核心部分就是中缀表达式转化为后缀表达式。

对于第一个问题,我是分步来判断,首先表达式中是否含有其它非法字符,然后判断括号是否合法,接着判断运算法两边是否合法,比如除法时,除数不能为零。

对于第二个问题,我是直接转换的,从左到右遍历中缀表达式,把数据全部取出来。

对于核心问题,利用了“栈”这种“后进先出”的数据结构,利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

上面是数据处理的算法部分。

本程序用户界面总共分为3个模块,分别是操作提示,数据输入,数据输出。

如图2.1所示。

图2.1 用户界面除了实现基本的功能外,我还增加了其它一些功能,比如支持输入数据为浮点数,更重要的是本程序还支持表达式的嵌套运算,例如:A(1+2*S(2))我的实现方法是利用函数的递归调用来解决此问题,即把1+2*S(2)看成一个子表达式,这个子表达式中2也看成子表达式。

这样使得程序的适用范围更加的广泛,适应性更强,能支持更复杂的表达式的运算。

这也是本程序的优点之一。

3 详细实现3.1 表达式的合法判定表达式的合法判定过程如图3.1所示图3.1表达式的合法判定过程首先是其它字符的判定,从左到右遍历中缀表达式,看是否存在其它非法的。

然后是判定括号是否的匹配是否和合法,首先把“(”对应为1,相应的“)”对应为-1。

从左到右遍历表达式,如果遇到括号就加上其对应的值,用sum来保存其累加值。

如果在中途出现sum小于零的情况,即出现“..... )”那么的情况,即非法。

在遍历的最后,还要判断sum的值是否为零,如果为零就是合法,否则就是非法。

代码如下:for(i=0;i<s.length();i++){ //检验括号是否合法,以及是否存在非法字符if(!IsNum(s[i]) && !IsSign(s[i]) && s[i]!='('&& s[i]!=')' && s[i]!='A' && s[i]!='S' && s[i]!='.')return false; if(s[i]=='(')sum+=1;else if(s[i]==')')sum-=1;if(sum<0)return false; //括号匹配不合法}运算符判断是否合法,也是遍历一遍表达式,遇到“/”,看其后面的除数是否为零。

这里要考虑表达式中出现负数的情况,因此特殊考虑“-”号,判断它的前面是“(”还是没有字符了,那么就是负数。

3.2 中缀表达式转化为后缀表达式中缀表达式转化为后缀表达式,利用两个“栈”,一个“数据栈”,一个“运算符栈”来把中缀表达式转换成后缀表达式。

最后利用后缀表达式来求解表达式的值。

设一个stack存后缀数据,一个rout栈存运算符。

算法流程如下:(1)从右向左依次取得数据ch。

(2)如果ch是操作数,直接加进stack中。

(3)如果ch是运算符(含左右括号),则:a:如果ch = '(',放入堆栈rout中。

b:如果ch = ')',依次输出堆栈rout中的运算符,直到遇到'('为止。

c:如果ch不是')'或者'(',那么就和堆栈rout顶点位置的运算符top 做优先级比较。

1:如果ch优先级比rtop高,那么将ch放入堆栈rout。

2:如果ch优先级低于或者等于rtop,那么输出top到stack 中(直到!top或者满足 1),然后将ch放入堆栈rout。

可以看出算法复杂度是O(n)的,因此效率是比较高的,能够在1s内处理百万级别长度的表达式。

算法的主要思想是利用“栈”的后进先出的特性,以及运算符的优先级,这里我们定义运算符的优先级;代码如下:int GetKey(char c){ //定义运算符的关键字int key;switch(c){case '+':key=1;break;case '-':key=1;break;case '*':key=2;break;case '/':key=2;break;case '(':key=4;break;case ')':key=5;break;}return key;}中缀转化为后缀处理的核心代码如下:/* 双栈,sta1存放后缀表达式,sta2存放运算符符号*/stack<pair<double,int> > sta1,sta2;for(i=0;i<k;i++){if(!num[i].second)sta1.push(num[i]); //为数据,直接放入sta1else if(num[i].second==4)sta2.push(num[i]); //为'(',直接放入sta2 /* 为')',从sta2中取出运算符,push到sta1中,直到遇到')' */else if(num[i].second==5){while(sta2.top().second!=4){sta1.push(sta2.top());sta2.pop();}sta2.pop(); //取出'('括号}/*为'+','-','*'或者'/'运算符,取出sta2中的运算符,push到sta1中,直到比sta2栈顶中的优先级大*/else {while(!sta2.empty() && sta2.top().second>=num[i].second && sta2.top().second!=4){sta1.push(sta2.top());sta2.pop();}sta2.push(num[i]); //放入当前运算符}}最后,后缀表达式就存放在sta1栈中,把sta1栈中的结果存放到SufExp 中就得到了后缀表达式。

3.3 处理后缀表达式这里也是运用“栈”来处理,运用栈模板在求值过程顺序扫描后缀表达式,每次遇到操作数便将它压入堆栈;遇到运算符,则从栈中弹出两个操作数进行计算,然后再把结果压入堆栈,等到扫描结束时,则表达式的结果就求出来了。

算图 3.3 处理后缀表达式流程核心代码如下:double Expression::GetAns(){int i;double temp,num1,num2; //num1和num2为运算符两遍的操作数stack<double> sta; //数据栈for(i=0;i<Size;i++){if(!SufExp[i].second){ //为数据sta.push(SufExp[i].first);}else { //为运算符num1=sta.top(); //取出第一个操作数sta.pop();num2=sta.top(); //取出第二个操作数sta.pop();temp=Cal((char)SufExp[i].first,num2,num1);sta.push(temp); //放入操作数结果}}Ans=sta.top();return Ans; //返回最终结果}3.4 表达式嵌套处理如果遇到A()和S()中含有表达式,而不是单纯的数字,例如A(1.1+3.4*S(2.5)),那么就需要对其字表达式“1.1+3.4*S(2.5)”进行递归处理,这个子表达式中还含有子表达式“2.5”,然后再递归处理,依次类推下去。

相关文档
最新文档