迷你计算器设计3.docx
《迷你计算器设计3.docx》由会员分享,可在线阅读,更多相关《迷你计算器设计3.docx(23页珍藏版)》请在冰豆网上搜索。
![迷你计算器设计3.docx](https://file1.bdocx.com/fileroot1/2023-4/2/96123dbb-0dd2-43da-ad30-818e00a74ab9/96123dbb-0dd2-43da-ad30-818e00a74ab91.gif)
迷你计算器设计3
《嵌入式系统》课程设计说明书
迷你计算器设计
院、部:
学生姓名:
指导教师:
专业:
班级:
学号:
完成时间:
湖南工学院嵌入式系统课程设计课题任务书
指导教师
学生姓名
课题名称
内容及任务
一、目标
在GEC210开发板上使用QT设计一个迷你计算器。
二、任务
根据控制要求,明确设计任务,拟定设计方案与进度计划,运用所学的理论知识,进行迷你计算器原理设计、程序框架设计、创新设计,提高理论知识、系统调试能力、分析问题与解决问题的能力。
主要内容包括:
1.嵌入式交叉开发环境搭建。
2.Linux操作系统的移植。
3.根据需求确定外围模块设计并完成相应驱动开发。
4.应用程序原理及框架设计。
5.Linux下应用程序编写及移植。
6.系统总体功能调试。
7.编写设计说明书。
三、要求
1.迷你计算器的功能显示界面示例如下:
2.能够完成十进制数的加、减、乘、除等简单计算。
3.对不正确的表达式能指出其错误。
主要参考资料
[1]马忠梅,ARM&Linux嵌入式系统教程(第3版)[M]。
北京:
北京航空航天大学出版社,2014
[2]曹忠明,程姚根。
从实践中学嵌入式Linux操作系统[M]。
北京:
电子工业出版社,2012
[3]宋宝华,Linux设备驱动开发详解(第二版)[M]。
北京:
人民邮电出版社,2010。
[4]韦东山,嵌入式Linux应用开发完全手册[M]。
北京:
人民邮电出版社,2008
[5]陆文周,Qt5开发及实例[M]。
北京:
电子工业出版社,2015
[6]StephenPrata,CPrimerPlus[M]。
北京:
人民邮电出版社,2005
教研室
意见
教研室主任:
(签字)
年月日
摘要
人类已经进入信息化时代。
信息技术日新月异,计算器已经进入人们生活的各个领域,在现代生活中不可或缺,大型复杂的计算是人类大脑所不能胜任的,而且较易出错。
本文针对Qt计算器进行研究、开发运用,在普通计算器的基础上增加了一些功能,给用户带来了一些方便,提高了运算速率。
本文从项目背景,需求分析,软件设计等方面详细说明了Qt科学计算器的开发设计过程。
软件采用Linux编写代码,Qt设计界面来开发,计算器包含简单计算功能。
计算器具有界面可视化,方便用户操作等特点,别改计算器的算式提取与存储功能使得算式计算更加快捷方便,为用户进行大量复杂科学计算提供了有效保证。
关键词:
Linux、Qt、算式提取
目录
1前言1
1.1计算器简介1
1.2Qt简介1
1.3设计要求2
2系统设计3
2.1系统流程图3
2.2模块划分3
2.3模块设计4
2.3.1界面显示模块4
2.3.2基本功能模块5
2.3.3记忆存储功能模块8
3系统运行和测试9
3.1Qt环境搭建9
3.2运行及测试10
参考文献12
致谢13
附录14
1前言
1.1计算器简介
早期的计算器为纯手动式,如算盘、算筹等。
算盘通常是以滑动的珠子制成。
在西方,算盘在印度阿拉伯数字流行前使用了数个世纪,且在近代中国的记帐与商务上仍广泛使用。
后来出现机械计算器。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了计圆柱型对数算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。
虽然计算器现在价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格昂贵,操作不便不说,很多功能根本用不到。
所以,我们可以运用自己所学的知识设计一款满足日常需求的简易计算器。
1.2Qt简介
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。
Qt是完全面向对象的很容易扩展并且允许真正地组件编程。
Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,易于扩展,允许组件编程。
2014年4月,跨平台集成开发环境QtCreator3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP。
Qt作为面向对象的软件开发工具,它使用信号Signal/槽slot机制来进行对象间的通信。
信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。
这样便解决了我们在用户界面上的操作如单击某个按钮与内部对象之间的信号传输。
Qt运行速度快、执行效率高再加上它提供了一组更容易理解的GUI类信号与槽易使用它所拥有的插入体系结构使得我们可以将代码加载到一个应用中而无需进行重新编译或重链接等优点为我们本次设计增色不少能使图形界面看起来更加舒服使用起来更加灵活。
1.3设计要求
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活运用。
在程序设计中,可以用两种放法解决问题:
一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。
而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还考虑类必须满足的约束,我们选择的是第二类实现方法,
采用结构化与面向对象两种解决问题的方法。
本次设计的计算器应具有以下功能:
(1)能够实现常用的加减乘除功能;
(2)能够实现开方,乘方,返回的功能;
(3)定能够实现数值的记忆存储功能
(4)当输入错误时,输出错误;
(5)可以一键回复计算器到初始状态.
2程序设计
2.1系统流程图
系统流程图如下所示:
图1:
系统流程图
2.2模块划分
程序主要有分为两大部分:
一是界面显示模块;二是逻辑功能实现模块.其中功能模块又分为两部分.一是基本功能模块,即加减乘除,清除退格功能;另一部分是额功能模块,包括求开方,乘方,倒数,负数功能和数据存储记忆功能.本人负责的是数据存储记忆功能,另一组员负责剩余额外功能模块.
模块结构图2如下所示:
图2:
模块结构图
2.3模块设计
2.3.1界面显示模块
计算器界面如图3所示:
图3:
计算器界面
计算器界面主要有一个widgets窗口和一个LineEdit部件及若干个Button部件组成.界面设计中最重要的是界面的布局.由于大部分窗口部件为按钮.固定义了一个button类,专为生成统一风格的按钮所用.
程序中创建的Button类继承自QToolButton类.类中方法主要功能为定义按钮的类型,大小策略及按钮的文本显示方式.构造函数中的setSizePolicy()是按钮可以水平扩展的方式去填补界面的空缺.如果没有这个方法,创建不同的按钮将会显示不同的宽度.在sizeHint()方法中.我们把height设置为在默认QToolButton大小的基础上增加了20,设置width至少和height一样大.这样就保证了按钮可以按照表格布局一样整齐分布在Dialog中.如果没有sizeHint(),界面布局将如图4所示:
图4
2.3.2基本功能模块
1)当用户单击"+"或"-"按钮时,系统将会调用additiveOperatorClicked()
槽,additiveOperatorClicked()实现代码如下:
voidWidget:
:
additiveOperatorClicked()
{
QPushButton*clickedButton=qobject_cast(sender());
QStringclickedOperator=clickedButton->text();
doubleoperand=ui->display->text().toDouble();
if(!
pendingMultiplicativeOperator.isEmpty())
{
if(!
calculate(operand,pendingMultiplicativeOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(factorSoFar));
operand=factorSoFar;
factorSoFar=0.0;
pendingMultiplicativeOperator.clear();
}
if(!
pendingAdditiveOperator.isEmpty())
{
if(!
calculate(operand,pendingAdditiveOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(sumSoFar));
}else{
sumSoFar=operand;
}
pendingAdditiveOperator=clickedOperator;
waitingForOperand=true;
}
进入这个函数后,会根据
QPushButton*clickedButton=qobject_cast(sender());
这句代码实现区分+还是-,并且判断存储前运算符变量中是否有值,如果有则将前面的值先算出。
如果没有,则将第一个值存入,并将运算符存入。
并且继续等待接下来的按钮,或者等号。
2)当我们单击"×"或"÷"按钮时,系统将调用
voidWidget:
:
multiplicativeOperatorClicked()
{
QPushButton*clickedButton=qobject_cast(sender());
QStringclickedOperator=clickedButton->text();
doubleoperand=ui->display->text().toDouble();
if(!
pendingMultiplicativeOperator.isEmpty())
{
if(!
calculate(operand,pendingMultiplicativeOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(factorSoFar));
}else
{
factorSoFar=operand;
}
pendingMultiplicativeOperator=clickedOperator;
waitingForOperand=true;
}
由于乘除的优先级比加减高,当我们进行混合运算,前面是加减法,再进行乘或除时,比如2+3*8,这是会计算3*8=24,将24存入。
此时计算公式相当于2+24。
3)程序中backspaceClicked()用来实现退格功能.它会移除显示的数值的最后一位.如果显示屏中为空字符串,按下退格键将会显示0.waitingForOperand被设置为0.退格功能实现代码如下:
voidCalculator:
:
backspaceClicked()
{
if(waitingForOperand)
return;
QStringtext=display->text();
text.chop
(1);
if(text.isEmpty()){
text="0";
waitingForOperand=true;
}
display->setText(text);
}
Clear()函数槽的功能相当于若干次backspaceClicked()的功能,它会一次清除显示屏中的数值.功能实现代码如下:
voidCalculator:
:
clear()
{
if(waitingForOperand)
return;
display->setText("0");
waitingForOperand=true;
}
clearAll()函数会实现计算器的初始化状态,代码如下:
voidCalculator:
:
clearAll()
{
sumSoFar=0.0;
factorSoFar=0.0;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
display->setText("0");
waitingForOperand=true;
}
4)界面中sqrt和x^2是通过直接对界面设置值的方式实现,其代码如下所示
voidWidget:
:
sqrClicked()
{
doublesqr=ui->display->text().toDouble();
ui->display->setText(QString:
:
number(sqrt(sqr)));
waitingForOperand=true;
}
voidWidget:
:
squareClicked()
{
doublesqr=ui->display->text().toDouble();
ui->display->setText(QString:
:
number(sqr*sqr));
waitingForOperand=true;
}
2.3.3记忆存储功能模块
功能实现代码如下:
voidCalculator:
:
clearMemory()
{
sumInMemory=0.0;
}
voidCalculator:
:
readMemory()
{
display->setText(QString:
:
number(sumInMemory));
waitingForOperand=true;
}
voidCalculator:
:
setMemory()
{
equalClicked();
sumInMemory=display->text().toDouble();
}
voidCalculator:
:
addToMemory()
{
equalClicked();
sumInMemory+=display->text().toDouble();
}
clearMemory()函数可以清除存储的数值,readMemory()函数为显示存储的数
值.setMemory()函数可以用当前显示的数值代替存储的数值,即设置数值功
能,addToMemory(0函数可以把已经存储的数值加上当前显示的值并存储.
3系统运行和测试
3.1Qt环境搭建
本次报告所编写的拼图小游戏是在LINUX环境下使用QT4.6编写完成的而
LINUX操作系统我选择的是redhat9.0这就涉及到怎样在redhat下安装QT
和使用QT实现计算器的功能。
在redhat下搭建QT的编译环境如下:
1:
下载Qt4.5.2forX11OpenSource版。
2:
下载过来的是qt-x11-opensource-src-4.5.2.tar.gz文件用tar命令
解压一下。
tarzxvfqt-x11-opensource-src-4.5.2.tar.gz
3:
把这个目录移到/usr/local目录下改名为qt。
4:
修改可以使用vi编辑器或者gedit自己目录下的.bash_profile或
者.profile或者是/etc/profile这个文件加入下面的代码
QTDIR=/usr/local/qt
PATH=$QTDIR/bin:
$PATH
MANPATH=$QTDIR/man:
$MANPATH
LD_LIBRARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATH
exportQTDIRPATHMANPATHLD_LIBRARY_PATH
5:
注销一下用户或者source.bash_profile一下使配置文件生效。
6:
进入QT的目录开始编译
./configure
输入yes同意GPL/QPL协议。
7:
开始make这步要一两个小时
make
8:
开始install
makeinstall
9:
进入QT的目录进入bin目录然后运行./designer就可以看到图形界面了.
QtDesigner界面如图5所示:
图5:
Qt界面
3.2运行及测试
在虚拟机Qt环境下运行main.cpp启动计算器,main.cpp代码如下:
#include
#include"calculator.h"
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
Calculatorcalc;
calc.show();
returnapp.exec();
}
①输入5后按"+"键,再输入5,按"="键.计算器显示10.如图6所示:
图6
②输入5后按"x^2"键,计算器显示如图7所示:
图7
在计算器中输入5/0,结果如图8所示。
图8
继续执行多次运算,计算器显示皆无误.关闭计算器,重启再执行运算,运算也无误,故此可断定程序设计正确.
参考文献
[1]曹忠明,程姚根。
从实践中学嵌入式Linux操作系统[M]。
北京:
电子工业出版社,2012
[2]宋宝华,Linux设备驱动开发详解(第二版)[M]。
北京:
人民邮电出版社,2010
[3]韦东山,嵌入式Linux应用开发完全手册[M]。
北京:
人民邮电出版社,2008
[4]陆文周,Qt5开发及实例[M]。
北京:
电子工业出版社,2015
[5]StephenPrata,CPrimerPlus[M]。
北京:
人民邮电出版社,2005
[6]皱思铁,嵌入式Linux 设计与应用[M]。
北京:
清华大学出版社,2002
[7]郭兵,嵌入式软件开放式集成开发平台体系结构研究[D]。
成都:
电子科技大学,2002
致谢
历时将近两周的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。
尤其要强烈感谢我的课设老师罗泽老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。
另外,在校图书馆查找资料的时候,培训的同学也给我提供了很多方面的支持与帮助。
在此向帮助和指导过我的各位老师和同学表示最中心的感谢!
感谢我的同学和朋友,在我写论文的过程中给予我很多素材以及各个模块的知识点,还在论文的撰写和排版灯过程中提供热情的帮助。
由于我的学术水平有限,所写论文难免有不足之处!
请老师见谅。
附录
附录:
程序清单
Widget.h:
#ifndefWIDGET_H
#defineWIDGET_H
#include
#include
#include
#include
#include
namespaceUi{
classWidget;
}
classWidget:
publicQWidget
{
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);
~Widget();
private:
Ui:
:
Widget*ui;
doublesumInMemory;
doublesumSoFar;
doublefactorSoFar;
boolwaitingForOperand;
QStringpendingAdditiveOperator;
QStringpendingMultiplicativeOperator;
publicslots:
voiddigitClicked();
voidclearall();
voidpoint();
voidadditiveOperatorClicked();
voidmultiplicativeOperatorClicked();
voidabortOperation();
voidequalClicked();
voidsqrClicked();
voidsquareClicked();
voidbackspaceClicked();
boolcalculate(doublerightOperand,constQString&pendingOperator);
};
#endif//WIDGET_H
Widget.cpp:
#include"widget.h"
#include"ui_widget.h"
Widget:
:
Widget(QWidget*parent):
QWidget(parent),ui(newUi:
:
Widget)
{
this->move(190,60);
ui->setupUi(this);
sumInMemory=0.0;
sumSoFar=0.0;
factorSoFar=0.0;
waitingForOperand=true;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
ui->display->setText("0");
connect(ui->bnt_0,SIGNAL(clicked()),this,SLOT(digitClicked()));