一种带括号和优先级的四则运算计算器的设计与实现

时间:2022-08-22 07:05:59

一种带括号和优先级的四则运算计算器的设计与实现

摘要:随着生活的便捷化,计算器成为日常生活中必不可少的工具,它可以让人们轻松的获得计算结果,缩短计算时间,提高计算效率,降低劳动强度。目前,很多计算器带有许多复杂函数的强大功能,却缺少最基本的带括号和识别运算符优先级的功能,该文利用堆栈和数组,设计一种带有括号和优先级的四则混合运算计算器,并基于C#语言,实现该计算器的主要功能。

关键词:计算器;优先级;括号

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)16-3798-04

Abstract: With the convenience of life, calculator become an indispensable tool in our daily life, which can make people easily get calculated results, shorten the time of calculation to improve the computational efficiency and reduce labor intensity. At present some calculators own many powerful features such as complex functions, but they are lacking in the most basic “with brackets” identification and operation with different priorities. In this paper, it will show you through using the stack and array to design the mixed computing calculator, which has some core features of “calculation with brackets and priorities”, based on C Sharp language.

Key words: calculator; priority; bracket

1 功能描述

目前,随着智能手机的普及,几乎人手一部智能手机,而几乎每部手机上都自带计算器功能。计算器成为人们生活中不可或缺的计算工具,它具有快速计算加、减、乘、除的能力,科学计算器还具有各种强大的函数功能,而往往日常生活中我们并不需要计算各种复杂的函数,我们只需要计算带括号具有优先级别的表达式,如果用这种计算器计算该表达式,要先把乘除算出结果,然后再做加减[1]。试想,能不能有一种更好的计算器,可以识别括号和运算符的优先级,能直接计算带括号的表达式呢?基于此,该文设计并实现一种带括号、可识别运算符优先级、并能完成加、减、乘、除运算的计算器。

2 界面设计和属性设置

1)打开VS 2008开发工具,新建一个Windows应用程序,命名为Calculator,其属性设置为:Text:计算器 ;StartPosition:CenterScreen ;MaximizeBox:False ;AutoSizeMode:GrowAndShrink。

2)在窗体上依次拖放2个TextBox,Name分别为txtInput、txtOutput,Multiline均为True。

3)在窗体上依次拖放19个Button控件,button1― button19的Name属性分别为:btn1、btn2、btn3、btn4、btn5、btn6、btn7、btn8、btn9、btn0、btnDot、btnLeftBracket、btnRightBracket、btnAdd、btnSub、btnMul、btnDiv、btnClear、btnEql。他们的Text属性分别为:1、2、3、4、5、6、7、8、9、0、・、(、)、+、-、*、/。如图1所示(设置好属性后)。

3 算法分析

1) 数字按钮事件函数,即文中digitalButtonDown()函数

因为按钮0到9都是用来在文本框里输入数字文本的,其事件都相同,只是事件内的文本内容不同,故可以统一来处理。先定义一个Input()函数,用来在文本框内输入文本,再定义digitalButtonDown()函数,用来统一处理数字按钮事件,同时将digitalButtonDown()分别绑定到各按钮的MouseDown()事件下。

2) 中缀表达式转化为后缀表达式,即文中的InfixToSuffix()函数:

计算带括号的式子,关键是要遵循四则混合运算法则:先乘除后加减,有括号要先计算括号内表达式,括号里的表达式也要遵循这一原则[2]。怎么实现先乘除后加减呢?这就要先定义操作符的优先级,乘除的优先级高于加减,而低于括号。为此,我们设计一个堆栈stack3]和两个数组pre、later,数组pre用来暂存中缀表达式,stack用来暂存操作符优先级数,数组later用来暂存操作数或中间结果。通过以下算法,把中缀表达式转化为后缀表达式[4],算法如下:将输入文本框中待计算的数字和运算符加入数组pre,逐个扫描数组pre,若

① 数组元素pre是数字时,直接加入数组later中。

②数组元素pre是+-*/运算符时,比较该元素和栈stack顶部的元素的优先级:当栈顶元素的优先级大于等于该元素的优先级时,将栈顶元素弹出加入数组later中,循环执行这一步骤,直到栈顶元素的优先级小于该元素的优先级,此时将该元素加入数组later中。

③ 数组元素pre是"("时,直接压入栈stack。

④ 数组元素pre是")"时,将栈stack里的元素循环弹出,弹出的元素加入定义的数组later,直到遇见元素"(",注意:循环结束后将stack中的"("也弹出,但不加入数组later中。

最后得到的数组later就是后缀表达式。

3) 计算后缀表达式,即文中的Calculate()函数:

① 数组later元素是数字,直接加入另外定义的栈stack1中。

② 若是运算符,取出stack1中栈顶的两个数,进行相应的操作,即若运算符是+,就让两数相加,相加结果加入栈stack1中。循环执行这一步骤,直到later中元素全取出。最后stack1.pop()弹出计算结果。

4) 操作符函数,即文中Operator()函数

由于执行两个数的加、减、乘、除运算,操作数个数相同,只是操作符不一样,故定义一个操作符函数Operator(),方便加、减、乘、除运算。

4 代码编写

本程序需要用到一些公共变量,例如用来接收操作数、中间结果、运算结果,判断输入的是否为括号等,因此首先在代码的通用段声明以下变量:

6 总结

本文通过对计算器功能的描述,设计计算器的界面,并用C#语言来实现带括号和优先级别功能的计算器,该计算器为计算带括号的表达式提供了方便,若在此基础上添加一些功能函数,会是一种非常实用的科学计算器。

参考文献:

[1] 任凯.基于JAVA 的简单计算器的设计与实现[J].电脑知识与技术,2011,7(15):3566-3567.

[2] 杨建武,李蓉.基于编译原理的表达式计算器设计[J].现代计算机,2009(7):151-153.

[3] 张钟用VC++ 6实现计算器具有优先功能[J].电脑编程技巧与维护,2009(3):17-19.

[4] 中缀表达式转后缀表达式[EB/OL].http:///antineutrino/article/details/6763722.

上一篇:论国际对华反倾销的现状及启示 下一篇:浅谈高中音乐课程改革