基于QT的计算器的实现

2018-12-22 10:55张会
电脑知识与技术 2018年32期
关键词:计算器

张会

摘要:该文利用 Qt框架,应用Qt信号槽机制实现了一个带括号的加减乘除的四则混合运算功能的计算器。该计算器是一个集继承、图形界面、事件处理等面向对象编程知识的综合应用的实例程序。

关键词:Qt;后缀表达式; 计算器;C++

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)32-0276-03

1 背景

Windows系统的“标准计算器”只能实现不判断优先级的简单的加减乘除计算,而不能正确实现带括号的四则混合计算,该文利用Qt图形库,采用C++语法规则,在Qt Creator集成开发环境下,实现了一个基于Qt的计算器,此计算器能帮助学生进一步理解C++中的面向对象程序设计思想。

2 Qt的特点

Qt被用于高性能的跨平台软件开发,它是一个标准的技术成熟的C++框架,Qt不仅拥有扩展的C++类库,还提供了大量可用来快速编写应用程序的工具[1] ,Qt是采用C++实现的框架。 Qt Creator是一款新的轻量级集成开发环境(IDE), IDE支持跨平台运行,支持的系统包括 Mac OS X 、Linux( 32 位 及 64 位) 以及Windows等系统。Qt Creator的设计目标是方便开发人员利用 Qt这个应用程序框架更加快速、轻易地完成相关开发任务[2]。

3 功能设计

计算器主要实现了以下功能:

1)输入包含括号的四则混合运算计算式。

2)单击等号按钮自动按先计算乘除再计算加减,有括号先计算括号的计算原则进行四则混合运算功能。

3)退格功能, 单击退格按钮,实现把输入的计算表达式最后一个数字或运算符删除,以实现对错误输入的内容删除后进行修改。

4)清空功能,单击C清空按钮,可以直接将输入的所有内容清除掉,而不需要用退格键逐一删除,

5)小数点只能输入一次,当一个小数已经输入了一个小数点后,此数无法再输入一个小数点,从而保证小数点在一个小数中的唯一性。

6)计算完一次结果后,当重新输入计算表达式想实现再次计算时,会自动把前一次的结果直接清除掉,而不需要单击清空按钮清除上次计算结果后再计算。

7)计算器的健壮性, 如对除数是否为0进行判断。

8)具有较好的人机交互界面, 如单击C清空按钮及刚运行计算器时,单行文本框内显示“0” 。

4 系统设计与实现

4.1 界面设计

通过在Qt Creater环境中新建一个Qt Widgets Application应用程序,并新建一个继承于QMainWindow类的Computer窗口类,在Qt Creater界面设计器中加入一个单行文本框QLineEdit控件computEdit对象及5行4列的20个QPushButton按钮控件,每个按钮对象的text属性设置为0-9数字、+-*/运算符、左右括号、退格、C、小数点和=值,界面效果如图1所示。

4.2 成员变量的定义

其中expression用于存放通过按钮所输入的计算表达式,如图1中的computEidt对象中的:4*(3-2*3)-10/2.5=。resultExpression用于存放包含计算结果的表达式,如图1中的computEidt对象中的4*(3-2*3)-10/2.5=-16。把expression中的中缀表达式转换为后缀表达式后存放于list变量中。利用栈的先进后出的原则把运算符及后缀表达式中的各运算暂数放于stack变量中。

4.3 计算表达式的生成

而在Qt中为了能实现事件处理如鼠标左键单击事件,可以通过对控件的信号函数添加槽函数,当单击图1的各按钮时,会发出一个click信号,再在各按钮的click信号函数上添加on_xxxButton_clicked()槽函数来实现把数字、括号、+-*/.按钮上的text连接到expression中,再把连接了文本的expression通过setText(expression)把新生成的expression置于单行文本框computEdit中,以实现单击按钮在computEdit文本框中有相应数字或运算符连接追加在其后。如下给出数字1按钮的click信号函数的槽函数的代码,其他按钮的槽函数类似。代码如下:

4.4 计算功能的实现

计算带括号的式子,关键是要遵循四则混合运算法则:先乘除后加减,有括号要先计算括号内表达式,括号里的表达式也要遵循这一原则[3]。要实现这种复杂的四则混合运算,在文中首先通过trans()方法将expression中的中缀表达式转换成为后缀表达式,再使用comput()方法将存放在list中的后缀表达式进行计算得到最终的计算结果。因此在computEdit中输入了计算表达式后,当单击“=”按钮时,在computEdit中将会显示如图1中所示的计算结果,在“=”按钮的槽函数中通过调用trans()和comput()自动实现四则混合计算。计算完后,清空stack,list,expression三个变量中的值,以便再次计算,若不清空,则这个三个变量将会把上一次的计算结果值進行二次计算。“=”按钮代码如下:

1)trans()方法算法描述及实现

输入的计算表达式存放于expression中,expression中包含数字及运算符,依次取出expression中的字符,若expression开始字符不是运算符而是数字字符串时则将数字字符串取出暂存于temp中。若expression中的开始字符是运算符,则首先将暂存于temp中的数字字符串追加入list中,再分析expression中的第一个运算符是 “*、/、(”则将高优先级的运算符直接入stack栈。若是“)”则把栈中的运算符依次出栈并追加到list后面,形成后缀表达式,直到“(”出栈,但“(”不追加在list后面,从而达到将“()”在后缀表达式中删除的目的,再在expression中将起始位置处的“)”删除。若是“+、-”,则先将stack中的运算符依次出栈并追加在list中,直到栈为空,之后再将“+、-”入栈,并移除expression中的首字符。以此方式直到expression为空后,若栈中还有运算符则依次将栈中的运算符出栈追加在list后面。如有中缀计算表达式为:“4*(3-2*3)-10/2.5”,经过上述算法处理后形成于list中的后缀表达式为:“4 3 2 3 * - * 10 2.5 / -”。代码实现如下:

2)comput()方法算法描述及实现

将tans()方法生成的list中存放的元素依次取出入栈stack变量,一旦在入栈的过程中遇到运算符,则将栈顶数字字符串出栈后转换成数字后进行计算,为保证计算的先后顺序,将栈顶元素取出的元素顺序置于operand2,operand1中,再使用从list中取出的运算符进行计算,并将计算的中间结果result入栈,以备下次计算。以此为循环,直到list为空。

4.5 退格按钮的实现

在输入计算表达式时,有可能会误输入,退格功能是用于从所输入的表达式中的最后一位开始,每按一次退格键,依次从后向前逐个删除输入的数字或运算符。在设计算法时,首先判断表达式中的长度是否为1,若为1,则将computEdit中的值置为0,同时使用remove()方法将expression中的唯一这一位字符移除;若computEdit中的表达式长度不为1,同时expression不为空,则使用remove()方法先将expression中的最后一位移除,再将expression用setText()置于computEdit中,从而显示删除后的计算表达式。代码如下:

4.6 清空按钮的实现

清空的目的是直接清除compuEdit中的所有内容,以便重新输入计算表达式并计算,因此在实现清空按钮的功能时,只需要将expression,list,stack置空,将computEdit控件中的内容置为0即可,代码如下:

5 结束语

该文通过使用Qt应用框架实现了人机交互界面的计算器,采用Qt信号槽机制实现计算器的加减乘除及带括号的四则混合运算功能。该程序是一个集继承、图形界面、事件处理等面向对象编程知识的综合应用的实例程序,通过对该程序的理解及掌握,能更好地培养《C++程序设计》初学者面向对象编程思维及编程兴趣。

参考文献:

[1] Monteiro F R, Garcia M A P, Cordeiro L C, et al. Boundedmodel checkin gof C++ program sbasedon the Qtcross‐platform frame work[J]. Software Testing Verification & Reli-ability, 2017,5: 179-180.

[2] Saleem K, Bellahsene Z, Hunt E. PORSCHE Performance ORiented SCHEma mediation [J]. Information Systems, 2008, 33(78): 637-657.

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

[4] 王彩霞. 一种带括号和优先级的四则运算计算器的设计与实现[J]. 电脑知识与技术, 2014(16): 3798-3802.

【通联编辑:谢媛媛】

猜你喜欢
计算器
坏了的计算器
坏了的计算器
[计算器不是万能的]
计算器
高中数学教学中应用图形计算器的实践探索
一个损坏的计算器
一个损坏的计算器
计算器
《用计算器开方》测试题