logo资料库

面向对象软件开发技术 基于QT的计算器课程报告.docx

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
面向对象软件开发技术 基于 QT 的计算器课程报告 班级: 学号: 姓名:
目录 一、 课程设计题目与要求 .................................. 1 二、 需求分析 ............................................ 1 1. 问题描述 ........................................... 1 2. 系统环境与运行要求 ................................. 1 三、概要设计 ............................................. 2 1. 系统流程设计 ....................................... 2 2. 系统模块设计 ....................................... 2 四、详细设计 ............................................. 3 1. 类的函数成员和数据成员设计 ......................... 3 2. 基本运算设计 ....................................... 4 3. 界面设计 ........................................... 5 4. 输入检测设计 ....................................... 7 5. 记忆存储设计 ....................................... 7 6. 退格键和清除键的实现 ............................... 7 7. 括号运算符的实现 ................................... 7 五、测试 ................................................. 8 六、结论 ................................................ 10
一、课程设计题目与要求 仿照 Windows 系统的计算器软件,为教材第 12.4 节通用计算器设计界面,开发一款实 用的计算器软件。 计算器软件基本功能: 计算器包括双目运算和单目运算功能。双目运算符包含基本的四则运算及次幂(^)功 能,单目运算符包含阶乘,对数,开方,三角函数,反三角函数等运算。另外,该计算器可对 输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算;出现错 误会显示错误同时禁止输入。计算器还需要包含清除,退格,退出,最小化等功能以及有与所 有按钮相对应的菜单项。 二、需求分析 计算器的产生和发展是建立在电子计算机基础之上的,现代社会很需要一个健全、高效 率的计算器。此次设计的计算器应用软件从 QT 编程环境中开发,是一个简单的窗体应用程 序,实现简单的计算器功能。以微软自带的计算器为模板,设计了简单易懂的计算器。这款 计算器不仅实现了简单的四则运算的功能,连续运算,以及三角函数等功能。它还实现窗口 的最大化,最小化,小键盘的操作。虽然这个简单的计算器实现的功能相比于微软的计算器 的功能较少,但是同样具有简洁的外观,即时准确的获得所需要要计算的结果,充分降低了 数字计算器的难度和所需要的时间,对人们生活和学习具有有很大的帮助。 通过对市面上的各种计算器以及手机、电脑计算器软件进行分析、使用之后,我了解到 一个计算器所应该有的功能以及界面的排版,通过《面向对象软件开发技术》这门课程掌握 了 C++语言的基础设计,知道了怎么使编写的计算器程序向微软附近计算器靠拢。 1. 问题描述 在本学期的课程学习中学习了 C++类的使用、设计、基类及派生类以及创建动态对象等, 在 VS 中实现了计算器的功能。QT 是一个跨平台的 C++图形用户界面库,QT 提供给应用程序 开发者建立图形用户界面所需要的功能,并且 QT 很容易扩展。本次结课设计结合 QT 与 C++ 语言,设计一个可供用户使用的计算器。要实现 QT 与 C++的结合,信号槽是 QT 框架最重要 的机制之一。信号槽就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击 了一下,它就会发出一个信号(signal)。如果有对象对这个信号感兴趣,它就会使用连接 (connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来 处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。信号和槽是 Qt 特有的信息传输机制,是 Qt 设计程序的重要基础,它可以让互不干扰的对象建立一种联系。 通过编写槽函数,我们可以控制输出在 QLineEdit 的 Qstring,而这个 Qstring 又是通过程 序计算得到的结果经过转换(double 转 Qstring),因此将两者结合起来,使得屏幕显示出 正确的计算结果,实现计算器的功能。 2.系统环境与运行要求 下载安装 qt-opensource-windows-x86-5.13.1.exe,下载路径为 http://download.qt.io/official_releases/qt/5.13/5.13.1/qt-opensource-windows-x86-5.13.1.e xe 安装并接受许可,勾选 Qt 5.13.1 中的 MinGW 7.3.0 64-bit 以及 Qt Creator 4.10.1 中的 Qt Creator 4.10.1 CDB Debugger Support,完成系统环境的搭建。 注意安装路径及工程的文件夹路径不能有中文。 1
能够完成 QT 的成功运行,首先程序中不能有错误,其次是有满足的运行环境。在本次的程 序中,因为搭建成功的 dialog 的 pro 文件中是基于 C++11 的标准,在这种情况下, make_unique 指针不能使用,改为 C++14 的标准之后才可使用。 三、概要设计 1. 系统流程设计 2. 系统模块设计 (1)操作数的输入 在.ui 文件中加入 QPushButton,通过转到槽函数,实现信号与槽的连接,可以实现发 送确定的数字。 (2)运算结果的显示 将输入的 Qstring 转为 string 类型的数据,使用 dolt 函数得到的 double 类型的计算 结果,在将结果转换为 Qstring 类型在 QLineEdit 显示出。 (3)运算符类对象工厂 需要通过运算符工厂加入所需要使用的运算符,防止由于添加新的功能而需要不断添加 程序分支带来的不必要麻烦。 (4)数字及运算符的检测 通过 isLetter 来判断是否是数字,并通过 it++实现数字的连续输入,并转换为 2
string 类型作为表达式被读取。通过 isYsf 来判断是否是运算符,并通过 it++转换为 string 类型的数据。在检测的时候也是通过对比两个 string 类型数据来判断是哪一个运算符,然 后执行相关的运算结果。 (5)检错 通过在 calculator.cpp 中的检错函数,写入判断相应表达式的条件,比如,除括号类 运算符之后必须是数字、无数字时输入运算符错误等,防止出现因为表达式的输入错误而使 程序异常终止的情况。 四、详细设计 1. 类的成员函数和数据成员设计 在程序中使用了类对象工厂的设计。若不使用类对象工厂,每添加一个新的功能,都需 要在代码中添加新的分支,这样非常繁琐,不利于程序的扩展,因此使用泛型解决这个问题, 设计一个计算器通用程序框架。首先根据运算符的名字来自动创建相应运算符类队形,实现 一个类注册的机制:设计者在完成一个运算符类的定义后能够以运算符的名字来注册这个类, 然后使用者根据运算符的名字来选择运算符类。使用如下数据结构实现: map()>>ms_operator; 然后可以通过 REGISTRAR 注册相关的运算符类。 运算符的基类如下: 基类 operator 的数据成员共三个,分别是运算符符号、目数及优先级。相关的成员函 数是为了返回类的符号、运算符目数以及优先级。此外,还设计了两个虚函数(同名不同类 型),用于传递数值。get(double a, double b)是双目运算符的传递,get(double a)是单 目运算符的传递,将计算的结果通过 get 函数在此存入到数据栈中。 3
2. 基本运算设计 由于实现相关功能的运算需要使用特定的函数,因此头文件中需要加入 math.h 文件, 在本程序中,使用了两个栈来存入相关数据:数据站和运算符栈。数据栈暂存操作数,运算 符栈暂存运算符。首先由 QT 中的按键等产生一个表达式,然后传递到 calculator 的程序中, 从左到右扫描表达式,遇到操作数时,将数字压入操作数的栈中;遇到运算符时,与当前运 算符栈的栈顶运算符比较优先级,若高于栈顶运算符的优先级或者运算符栈为空,则将其亚 茹运算符栈,否则将运算符栈顶的运算符弹出,根据这个运算符的目数通过 get 函数得到相 应数目的操作数,计算结果压入操作数栈,直至运算符栈只剩下”#”。因为加入了括号的 运算,所以出现左括号‘(’的时候,不需要判断优先级而选择直接跳过,程序如下: 三角符号、开方的运算符因为是字母而且是单目运算符,所以我将三角运算符区分于一 般(加减乘除等双目)运算符,程序如下: 同时,操作数因为有π,所以也分为两种。 3. 界面设计 界面显示如左图所示。 首先需要加入 QPushButton 和 QLineEdit, QPushButton 用来产生信号,QLineEdit 用来显示输入 以及输出的结果,起到显示屏的作用。在加入按键之 后,需要进行网格布局,实现按键美观排列;然后在 给 QLineEdit 和网格布局的按键进行横向布局,将它 们的 sizePolicy 改为 expanding,设置整个对话窗的 比例,即 QLineEdit:QPushButton=3:7,将按键的名字 改成数字键或者运算符,右击转到槽即完成信号与槽 的连接,在相应的槽函数中写入按键产生的信号。 QLineEdit 作为计算器的显示屏,设计了不同的颜色, 通过 styleSheet 改变颜色,并将 alignment 水平改为 AlignRight,即显示从右到左。 4
选中按键,右击,选中转到槽,在 expr.h 和 expr.cpp 中自 动生成槽函数 同时内部会已经建立连接,因此 connect 不需要自己在写 入。我当时并不知道会自动生成链接,通过这种方式,发 现每次按键都会产生两个数,查询资料才知道右键转到槽 函数会自动生成。除了这种方法,也可以根据命名的按键 名字自己写入槽函数,这个时候需要取下下图的注释,人 工进行连接。 另外,通过 setText 函数设置当前 QLineEdit 的显示内容。Append()函数可以实现在 Qstring 的后面继续添加字符。 此外,还加入了 QComboBox,双击即可编辑组合框,通过左下角“+”可以新建项目, 显示如下图所示。 在设计的过程中,发现所弹出的窗口没有最小化,而在实际使用中,最小化的功能还是 经常使用的,因此在 dialog 的构造函数中添加了最大化和最小化的相关代码,并去除了本 来显示“这是什么的”“?”标记。 4. 输入检测设计 首先,在 calculator.cpp 中设计的检错可以检查一部分错误。同时,在 expr.h 文件中, expr 类的私有成员加入清除标记与错误标记。为 1 即在 judge 中清除显示屏中 Qstring 或 显示 syntax error。judge 函数在这种情况下会清除显示屏字符或者让显示屏显示出有错误 的字符,当然,这样的话,judge 函数需要加到每一个按键的槽函数中。 5
按键中,只要按下了=,意味着表达式输入的结束,这个时候,设置一个 Calculator 类的对象,将计算结果传递到显示屏上。在此之前,利用已有的 calculator.cpp 文件中的 检测错误的函数来判断表达式是否输入有误。返回值为 0 的时候,是代表表达式无误,当然 我在检测表达式的错误中只写入了最常见的几种。 由上图可以看到 cal.lookupexp(ui->lbl_display->text().toStdString())判断输入 表达式是否有错误,如果有错误的话,由上述函数可知 0 代表无错误,1 代表有错误,因为 如果值等于 1,即让显示屏先清除当前内容,并显示 syntax error,没有错误,则将 QString 转换为 dolt 能够识别的 string 类型字符,得到计算结果,在转换为 Qstring 显示在显示屏 上。 除了上述情况之外,因为想要使用计算器的人及时知道输入的表达式有误,而不是等使 用者输入好传递给 dolt 函数之后才判断是否有误,所以还在槽函数中加入了部分判断。首 先就是,显示屏在未使用时是显示“0”的,而根据常识,如果第一个数字为 0,除了小数 点,其他数字输入时需要删除 0,而且不会出现 0000 这样的情况。因此加入一个判断语句, 当显示屏上的数字为 0 时,是不可能继续输入 0,除非 0 前面有其他的数字或者小数 点。另外,就是输入除 0 以外的数字时,如果显示屏上为 0,将会自动清除 0 后输入按键 6
分享到:
收藏