实验四 Qt编写简单的计算器
- 格式:doc
- 大小:1.24 MB
- 文档页数:17
嵌入式系统之基于QT的简单计算器QT是一种跨平台的应用程序开发框架,它提供了一种编写图形用户界面(GUI)程序的简便方法。
在嵌入式系统中,使用QT可以快速开发出各种功能强大、界面友好的应用程序。
对于一个简单计算器来说,主要包括用户界面设计和计算逻辑两部分。
首先,我们需要设计一个界面来展示计算器的按钮和显示结果的区域。
在QT中,可以使用QGridLayout布局管理器来创建按钮布局,同时将其连接到对应的信号槽函数上,以实现按钮的点击响应。
```cpp//main.qmlimport QtQuick 2.12import QtQuick.Window 2.12import QtQuick.Controls 2.12Windowvisible: truewidth: 400height: 600title: "Simple Calculator"RowLayoutspacing: 10GridLayoutid: buttonGridrows: 4columns: 4anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Buttontext: "7"onClicked: calculator.append("7")}Buttontext: "8"onClicked: calculator.append("8")}// ... more buttons ...Buttontext: "="onClicked: calculator.calculate}// ... more buttons ...}TextFieldid: resultFieldwidth: 200height: 50placeholderText: "0"readOnly: true}}```在这个示例中,我们使用了QT的QML语言来创建用户界面。
##理工大学题目:科学计算器组长###学号:11270228专业:软件工程(2)班组员:####学号:11270136 专业:软件工程(1)班组员:#####学号:11270333专业:软件工程(3)班2013年11月13日1 引言1.1 设计背景●计算器(calculator;counter)一般是指“电子计算器”,计算器是能进行数学运算的手持机器,拥有集成电路芯片,其结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑)。
计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,虽然功能较单一,但因其操作模式的方便快捷和价格的低廉,携带方便等特点,已经被广泛应用于工程、学习、商业贸易等日常生活中,极大的方便了人们对于数字的整合运算,成为人们生活和办公中的必备品之一,深得使用者的青睐。
●计算器在我们的日常生活扮演着很重要的角色,因此不断设计开发出功能更强大,携带更轻便,使用更加快捷迅速的计算器便成为相应工作者奋斗的目标和任务。
1.2 设计目的● 进一步了解C++语言和高级程序设计语言的结构,了解其好处和可用性,掌握基本的程序设计过程和技巧,掌握基本的分析问题、利用计算机求解问题的能力,具备初步的高级语言程序设计能力。
为后续计算机课程和毕业设计打下坚实基础。
● 通过该计算器程序软件的设计,培养独立思考、综合运用所学有关相应知识的能力,更好地巩固《C++程序语言设计》和《Qt4实践开发》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,体验理论与实践相结合的过程,同时培养同学之间的团队合作精神,体会在工作中团队合作的重要性和必要性。
2.功能需求分析2.1 功能划分● 本次我们设计的计算器在某些细节处加入了我们设计同学的独特创新和技巧,具体体现见详细设计部分。
对于我们所设计的科学计算器,其功能大致可以如下划分:科学型计算器功能——可以进行加、减、乘、除、乘方、开方、指数、对数、三角函数、等方面的运算。
嵌入式QT实验报告一、实验目的本次实验的目的是设计并实现一个简单的计算器应用程序,基于嵌入式QT进行开发。
通过这个实验,可以熟悉QT的控件使用、界面设计和信号与槽的连接等知识点。
二、实验原理计算器应用程序的主要功能是实现基本的数学运算,包括加、减、乘、除。
用户通过界面上的按钮输入数字和运算符,程序根据用户的输入进行相应的计算,并将结果显示在界面上。
三、系统设计1.界面设计计算器的界面主要分为两个部分,一个是数字输入框,用于用户输入数字;另一个是运算符按钮区域,用于用户选择运算符。
2.数字和运算符输入用户通过按钮选择数字和运算符,并将其显示在数字输入框中,需要使用QT的信号与槽机制来连接按钮和数字输入框。
3.计算功能根据用户选择的运算符,进行相应的数学运算,并将结果显示在数字输入框中。
需要使用switch语句来判断用户选择的运算符,并进行相应的计算。
四、实验步骤1.创建QT应用程序项目在QT Creator中创建一个新的QT Widget应用程序项目,命名为"Calculator",选择嵌入式QT版本。
2.设计界面使用QT Designer设计计算器的界面,添加一个数字输入框和若干个按钮,按钮包括数字按钮和运算符按钮。
需要注意布局和按钮的大小等细节。
3.连接信号与槽4.实现计算功能在mainwindow.cpp文件中实现计算器功能的代码。
首先声明一个私有变量operand用于保存上一次的操作数;然后根据用户选择的按钮,进行相应的计算。
五、实验结果(插入计算器界面截图)六、实验总结通过本次实验,我成功地设计并实现了一个简单的计算器应用程序。
在实验过程中,我学会了使用QT Designer设计界面,了解了QT的信号与槽机制,能够连接按钮和输入框等控件;同时,也巩固了基本的C++编程知识,熟悉了switch语句的使用。
在实验过程中,我遇到了一些问题,比如界面的布局和按钮的大小等细节问题,通过查阅文档和调试,最终解决了这些问题。
题目:简易计算器学院:信息科学与技术专业:软件工程姓名:学号:2014.04.19一、需求分析当今社会是信息社会,科技经济高速发展的社会,为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。
然而,电脑已经成为当代人生活的必需品,运行在电脑上的计算器成为了人们的生活学习绝佳伴侣。
下面是用C++编写的,基于Qt图形用户界面应用程序框架的计算器,它实现了对整数,浮点数的加﹑减﹑乘﹑除﹑幂运算。
二、设计过程1.界面设计在QT设计器中布置好计算器界面,所有按键采用的pushButton控件,显示计算结果采用的是lineEdit控件.完成的界面如下图所示:图计算器界面为了使按钮显示美观,将每个button的属性设置如下:图button大小、字体属性为符合人们的使用习惯,将lineEdit空间的属性更改,使得输入的数字和符号出现在空间的右边起。
如图:图lineEdit控件属性更改2.控件重命名将界面布局设计好后,将各个空间改名,例如“0"改为but0.3.简单信号响应对于button exit退出程序,这样简单的响应,直接在设计器中通过添加信号和槽来完成,如图:图信号和槽4.辅助数据成员及函数为了区分每一次计算和保存操作数、操作符,和辅助函数(如:输出函数),在calculator。
h的类中设定数据成员以及成员函数:calculat。
cpp中辅助函数的实现:5.数字键的响应以button 0为例,在calculator。
cpp文件中添加but0的代码,如下:6.小数点的响应当一个操作数已经输入了一个小数点时,将小数点按钮置为不可用,以防用户重复输入小数点,导致输入操作数不合法,如下如:7.运算功能的响应以加法为例,向lineEdit中输入显示+号,并在数据成员中保存,以便后面进行计算:8.清屏的响应首先将lineEdit的显示清除,再置为0;将一切辅助的数据成员数据重置到新一轮计算的开始状态,如:运算符为空,操作数为0等.实现如下:9.等号的响应根据数据成员记录的运算符和操作数进行相应的计算,并将得出的结果转化为string显示在lineEdit上,并重置辅助数据成员,准备下一轮的计算开始。
纯手工简单计算器效果如下:1..h 文件从新定义button#ifndef BUTTON_H#define BUTTON_H#include<QToolButton>//![0]class Button : public QToolButton{Q_OBJECTpublic:Button(const QString &text, QWidget *parent = 0);QSize sizeHint() const;};//![0]#endifCalculator.h#ifndef CALCULATOR_H#define CALCULATOR_H#include<QDialog>QT_BEGIN_NAMESPACEclass QLineEdit;QT_END_NAMESPACEclass Button;//![0]class Calculator : public QDialog{Q_OBJECTpublic:Calculator(QWidget *parent = 0);private slots:void digitClicked();void unaryOperatorClicked();void additiveOperatorClicked();void multiplicativeOperatorClicked();void equalClicked();void pointClicked();void changeSignClicked();void backspaceClicked();void clear();void clearAll();void clearMemory();void readMemory();void setMemory();void addToMemory();//![0]//![1]private://![1]//![2]Button *createButton(const QString &text, const char *member);void abortOperation();bool calculate(double rightOperand, const QString &pendingOperator); //![2]//![3]double sumInMemory;//![3]//![4]double sumSoFar;//![4]//![5]double factorSoFar;//![5]//![6]QString pendingAdditiveOperator;//![6]//![7]QString pendingMultiplicativeOperator;//![7]//![8]bool waitingForOperand;//![8]//![9]QLineEdit *display;//![9]//![10]enum { NumDigitButtons = 10 };Button *digitButtons[NumDigitButtons];};//![10]#endif2..cpp 文件实现Button.cpp#include<QtGui>#include"button.h"//![0]Button::Button(const QString &text, QWidget *parent) : QToolButton(parent){setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);setText(text);}//![0]//![1]QSize Button::sizeHint() const//![1]//![2]{QSize size = QToolButton::sizeHint();size.rheight() += 20;size.rwidth() = qMax(size.width(), size.height());return size;}//![2]Calculator.cpp#include<QtGui>#include<math.h>#include"button.h"#include"calculator.h"//![0]Calculator::Calculator(QWidget *parent): QDialog(parent){sumInMemory = 0.0;sumSoFar = 0.0;factorSoFar = 0.0;waitingForOperand = true;//![0]//![1]display = new QLineEdit("0");//![1]//![2]display->setReadOnly(true);display->setAlignment(Qt::AlignRight);display->setMaxLength(15);QFont font = display->font();font.setPointSize(font.pointSize() + 8);display->setFont(font);//![2]//![4]for (int i = 0; i < NumDigitButtons; ++i) {digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));}Button *pointButton = createButton(tr("."), SLOT(pointClicked()));Button *changeSignButton = createButton(tr("\261"), SLOT(changeSignClicked()));Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));Button *clearButton = createButton(tr("Clear"), SLOT(clear()));Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));Button *divisionButton = createButton(tr("\367"), SLOT(multiplicativeOperatorClicked()));Button *timesButton = createButton(tr("\327"), SLOT(multiplicativeOperatorClicked()));Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));Button *powerButton = createButton(tr("x\262"), SLOT(unaryOperatorClicked()));Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));Button *equalButton = createButton(tr("="), SLOT(equalClicked()));//![4]//![5]QGridLayout *mainLayout = new QGridLayout;//![5]//![6]mainLayout->setSizeConstraint(QLayout::SetFixedSize);mainLayout->addWidget(display, 0, 0, 1, 6);mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);mainLayout->addWidget(clearButton, 1, 2, 1, 2);mainLayout->addWidget(clearAllButton, 1, 4, 1, 2);mainLayout->addWidget(clearMemoryButton, 2, 0);mainLayout->addWidget(readMemoryButton, 3, 0);mainLayout->addWidget(setMemoryButton, 4, 0);mainLayout->addWidget(addToMemoryButton, 5, 0);for (int i = 1; i < NumDigitButtons; ++i) {int row = ((9 - i) / 3) + 2;int column = ((i - 1) % 3) + 1;mainLayout->addWidget(digitButtons[i], row, column);}mainLayout->addWidget(digitButtons[0], 5, 1);mainLayout->addWidget(pointButton, 5, 2);mainLayout->addWidget(changeSignButton, 5, 3);mainLayout->addWidget(divisionButton, 2, 4);mainLayout->addWidget(timesButton, 3, 4);mainLayout->addWidget(minusButton, 4, 4);mainLayout->addWidget(plusButton, 5, 4);mainLayout->addWidget(squareRootButton, 2, 5);mainLayout->addWidget(powerButton, 3, 5);mainLayout->addWidget(reciprocalButton, 4, 5);mainLayout->addWidget(equalButton, 5, 5);setLayout(mainLayout);setWindowTitle(tr("Calculator"));}//![6]//![7]void Calculator::digitClicked(){Button *clickedButton = qobject_cast<Button *>(sender());int digitValue = clickedButton->text().toInt();if (display->text() == "0" && digitValue == 0.0)return;if (waitingForOperand) {display->clear();waitingForOperand = false;}display->setText(display->text() + QString::number(digitValue)); }//![7]//![8]void Calculator::unaryOperatorClicked()//![8]//![9]{Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();double result = 0.0;if (clickedOperator == tr("Sqrt")) {if (operand < 0.0) {abortOperation();return;}result = sqrt(operand);} else if (clickedOperator == tr("x\262")) {result = pow(operand, 2.0);} else if (clickedOperator == tr("1/x")) {if (operand == 0.0) {abortOperation();return;}result = 1.0 / operand;}display->setText(QString::number(result));waitingForOperand = true;}//![9]//![10]void Calculator::additiveOperatorClicked()//![10]//![11]{Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();//![11]//![12]if (!pendingMultiplicativeOperator.isEmpty()) {//![12]//![13]if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}display->setText(QString::number(factorSoFar));operand = factorSoFar;factorSoFar = 0.0;pendingMultiplicativeOperator.clear();}//![13]//![14]if (!pendingAdditiveOperator.isEmpty()) {//![14]//![15]if (!calculate(operand, pendingAdditiveOperator)) {abortOperation();return;}display->setText(QString::number(sumSoFar));} else {sumSoFar = operand;}//![15]//![16]pendingAdditiveOperator = clickedOperator;//![16]//![17]waitingForOperand = true;}//![17]//![18]void Calculator::multiplicativeOperatorClicked(){Button *clickedButton = qobject_cast<Button *>(sender());QString clickedOperator = clickedButton->text();double operand = display->text().toDouble();if (!pendingMultiplicativeOperator.isEmpty()) {if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}display->setText(QString::number(factorSoFar));} else {factorSoFar = operand;}pendingMultiplicativeOperator = clickedOperator;waitingForOperand = true;}//![18]//![20]void Calculator::equalClicked(){double operand = display->text().toDouble();if (!pendingMultiplicativeOperator.isEmpty()) {if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();return;}operand = factorSoFar;factorSoFar = 0.0;pendingMultiplicativeOperator.clear();}if (!pendingAdditiveOperator.isEmpty()) {if (!calculate(operand, pendingAdditiveOperator)) {abortOperation();return;}pendingAdditiveOperator.clear();} else {sumSoFar = operand;}display->setText(QString::number(sumSoFar));sumSoFar = 0.0;waitingForOperand = true;}//![20]//![22]void Calculator::pointClicked(){if (waitingForOperand)display->setText("0");if (!display->text().contains("."))display->setText(display->text() + tr("."));waitingForOperand = false;}//![22]//![24]void Calculator::changeSignClicked(){QString text = display->text();double value = text.toDouble();if (value > 0.0) {text.prepend(tr("-"));} else if (value < 0.0) {text.remove(0, 1);}display->setText(text);}//![24]//![26]void Calculator::backspaceClicked(){if (waitingForOperand)return;QString text = display->text();text.chop(1);if (text.isEmpty()) {text = "0";waitingForOperand = true;}display->setText(text);}//![26]//![28]void Calculator::clear(){if (waitingForOperand)return;display->setText("0");waitingForOperand = true;}//![28]//![30]void Calculator::clearAll(){sumSoFar = 0.0;factorSoFar = 0.0;pendingAdditiveOperator.clear();pendingMultiplicativeOperator.clear();display->setText("0");waitingForOperand = true;}//![30]//![32]void Calculator::clearMemory(){sumInMemory = 0.0;}void Calculator::readMemory(){display->setText(QString::number(sumInMemory));waitingForOperand = true;}void Calculator::setMemory(){equalClicked();sumInMemory = display->text().toDouble();}void Calculator::addToMemory(){equalClicked();sumInMemory += display->text().toDouble();}//![32]//![34]Button *Calculator::createButton(const QString &text, const char *member){Button *button = new Button(text);connect(button, SIGNAL(clicked()), this, member);return button;}//![34]//![36]void Calculator::abortOperation(){clearAll();display->setText(tr("####"));}//![36]//![38]bool Calculator::calculate(double rightOperand, const QString &pendingOperator) {if (pendingOperator == tr("+")) {sumSoFar += rightOperand;} else if (pendingOperator == tr("-")) {sumSoFar -= rightOperand;} else if (pendingOperator == tr("\327")) {factorSoFar *= rightOperand;} else if (pendingOperator == tr("\367")) {if (rightOperand == 0.0)return false;factorSoFar /= rightOperand;}return true;}//![38]3.Main 实现#include<QApplication>#include"calculator.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);Calculator calc;calc.show();return app.exec();}。
Qt编写计算器(界⾯)看了⼏个视频,写了个计算器的界⾯#include <QApplication>#include <QWidget>#include <QLineEdit>#include <QPushButton>int main(int argc, char *argv[]){QApplication a(argc, argv);QWidget* w = new QWidget(NULL,Qt::WindowCloseButtonHint);//没有最⼤最⼩化按钮QLineEdit* Le = new QLineEdit(w);QPushButton* Button[20] = {0};const char* BtnText[20]={"7","8","9","+","(","4","5","6","-",")","1","2","3","*","<-","0",".","=","/","C"};Le->move(10,10);Le->resize(240,30);Le->setReadOnly(true);//⽂本框只读,不能通过键盘输⼊for(int i = 0;i<4;i++){for(int j = 0;j<5;j++){Button[i*5+j] = new QPushButton(w);Button[i*5+j]->resize(40,40);Button[i*5+j]->move(10 + (10 + 40)*j,(10+40) + (10 + 40)*i);Button[i*5+j]->setText(BtnText[i*5+j]);}}w->setWindowTitle("计算器");w->show();w->setFixedSize(w->width(),w->height());//锁定窗⼝⼤⼩/** w->show();* w->setFixedSize(w->width(),w->height());//锁定窗⼝⼤⼩* 这两句顺序不能反*/return a.exec();}运⾏界⾯如下。
基于QT简易计算器的设计设计一个基于QT的简易计算器,实现基本的四则运算功能。
本文将从需求分析、界面设计、功能实现等方面进行详细介绍。
一、需求分析根据题目要求,设计一个简易计算器,需具备以下功能:1.实现基本的四则运算功能,包括加减乘除;2.支持连续多次运算,即连续按下等号键后可以继续进行后续的运算;3.支持小数点的输入,并可以进行小数运算;4.支持括号的输入,并按照正确的优先级进行计算;5.提供清空按钮,可以清空当前输入的算式;6.提供删除按钮,可以删除当前输入的最后一个字符。
二、界面设计基于QT的图形界面设计,可以使用QGridLayout布局管理器来布局计算器的主要组件。
具体界面设计如下:1. 显示屏:使用一个QLineEdit控件用于显示计算结果,并设置只读属性;2. 数字键:使用QPushButton控件实现数字键,并根据需要设置对应的信号槽;3. 功能键:使用QPushButton控件实现功能键,如加减乘除等,并根据需要设置对应的信号槽;4. 清空和删除键:使用QPushButton控件实现清空和删除键,并根据需要设置对应的信号槽;5.等号键:使用QPushButton控件实现等号键,并根据需要设置对应的信号槽。
三、功能实现2. 信号槽的连接:根据界面设计,将按钮的clicked信号连接到槽函数,实现按钮的点击响应;3.数字键的实现:将数字键的文本值追加到显示屏的文本末尾;4.加减乘除键的实现:将加减乘除键的文本值追加到显示屏的文本末尾;5.小数点键的实现:判断显示屏的文本中是否已经存在小数点,如果不存在,则将小数点追加到文本末尾;6.清空键的实现:清空显示屏的文本内容;7.删除键的实现:删除显示屏文本的最后一个字符;8.等号键的实现:获取显示屏的文本内容,并使用计算表达式的eval函数进行求值,将结果显示在显示屏上。
四、例子演示下面以一个例子进行简单演示:1.界面设计:在界面上设计一个显示屏(QLineEdit控件),以及数字键、加减乘除键和等号键(QPushButton控件),清空和删除键(QToolButton控件)。
简易计算器实验报告一、实验目的本次实验的目的是设计并实现一个简易计算器,能够进行基本的四则运算(加、减、乘、除),以及处理括号的优先级运算,提高对程序设计和逻辑思维的理解与应用能力。
二、实验原理1、四则运算的优先级规则在数学运算中,先计算括号内的表达式,然后按照先乘除后加减的顺序进行计算。
乘除法的优先级高于加减法,如果在同一级运算中,按照从左到右的顺序进行。
2、数据结构的选择使用栈(Stack)数据结构来存储操作数和运算符。
栈具有先进后出的特点,非常适合处理表达式中的括号和优先级。
3、算法思路首先,将输入的表达式进行解析,将数字和运算符分别存储到不同的栈中。
然后,根据运算符的优先级进行计算,将计算结果重新压入栈中,直到表达式计算完毕。
三、实验设备及环境1、编程工具:选择了 Python 语言作为主要的编程工具,使用PyCharm 集成开发环境进行代码编写和调试。
2、操作系统:Windows 10 操作系统。
四、实验步骤1、定义数据结构定义两个栈,一个用于存储操作数(operandStack),一个用于存储运算符(operatorStack)。
2、表达式解析遍历输入的表达式字符串,将数字转换为整数并压入操作数栈,将运算符压入运算符栈。
遇到左括号直接压入运算符栈,遇到右括号则进行括号内的运算。
3、运算处理当运算符栈不为空时,取出栈顶的运算符和两个操作数进行计算。
根据运算符的优先级进行相应的运算,将结果压入操作数栈。
4、最终结果当表达式解析完毕后,操作数栈中的唯一元素即为表达式的计算结果。
五、代码实现```pythonclass SimpleCalculator:def __init__(self):selfoperandStack =selfoperatorStack =def calculate(self, expression):for char in expression:if charisdigit():selfoperandStackappend(int(char))elif char in '+/()':if char =='(':selfoperatorStackappend(char)elif char ==')':while selfoperatorStack-1!='(':operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackpop()else:while selfoperatorStack and selfhasHigherPrecedence(selfoperatorStack-1, char):operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)selfoperatorStackappend(char)while selfoperatorStack:operator = selfoperatorStackpop()operand2 = selfoperandStackpop()operand1 = selfoperandStackpop()result = selfperformOperation(operand1, operand2, operator)selfoperandStackappend(result)return selfoperandStackpop()def hasHigherPrecedence(self, op1, op2):if op1 in '/' and op2 in '+':return Trueelif op1 in '+' and op2 in '+':return Falseelif op1 in '/' and op2 in '/':return Falsereturn Falsedef performOperation(self, operand1, operand2, operator):if operator =='+':return operand1 + operand2elif operator =='':return operand1 operand2elif operator =='':return operand1 operand2elif operator =='/':if operand2 == 0:raise ValueError("除数不能为 0")return operand1 / operand2if __name__ =="__main__":calculator = SimpleCalculator()expression ="2 + 3 (4 1) / 2"result = calculatorcalculate(expression)print("计算结果:", result)```六、实验结果与分析1、测试用例及结果输入表达式:"2 + 3 4",计算结果:14输入表达式:"(2 + 3) 4",计算结果:20输入表达式:"5 2 3",计算结果:-1输入表达式:"10 / 2 + 1",计算结果:62、结果分析对于简单的四则运算表达式,计算器能够正确计算出结果。
基于Qt的计算器设计摘要当今社会是信息社会,科技经济高速开展的社会,为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。
然而,电脑已经成为当代人生活的必需品,运行在电脑上的计算器成为了人们的生活学习绝佳伴侣。
本设计是用C++编写的,基于Qt图形用户界面应用程序框架的计算器。
设计出两个电脑端和安卓手机端两个应用程序,并实现了一定的计算功能。
关键字:Qt C++ 计算器android一.任务概述:1.目标:基于Qt用C++编写计算器程序,实现加减乘除,平方,倒数,开方,阶乘,sin,cos,tan,In,x的y次幂,e的x次幂运算。
并使用不同的构建套件构建出.exe的电脑端程序和.apk的安卓手机端程序。
2.运行环境:编写环境:Qt 5.2.0 windows32位Exe运行:windows 7Apk运行:android4.1.23.功能描述:a.基于Qt设计计算器的ui界面。
b.编写的应用程序实现如下功能:〔1〕加减乘除,平方,倒数,开方,阶乘,sin,cos,tan,In,x的y次幂,e的x次幂运算〔2〕实现清屏,退格,退出应用程序的功能c. 应用程序包含exe和apk两个二.设计过程:1.工程建立:文件->新建文件和工程->QtwidgetsApplication包含calculator.pro dialog.h dialog.cpp main.cpp dialog.ui 2.ui界面设计:在QT设计器中布置好计算器界面,所有按键采用的pushButton 控件,显示计算结果采用的是lineEdit控件。
完成的界面如下列图所示:clear:清屏<-:退格exit:退出数字键:1,2,3,4,5,6,7,8,9,0运算键:+ - * / 加减乘除exp:e的x次幂√:开方x^y:x的y次等3.程序编写:Dialog.h:(1)在class Dialog:public QDialog 中定义privateslots:void on_pushButton_5_clicked();void on_pushButton_9_clicked();void on_pushButton_13_clicked();void on_pushButton_2_clicked();void on_pushButton_8_clicked();void on_pushButton_12_clicked();............................(2) 定义cal函数:private:void cal(void);Dialog.cpp:Math函数的调用和IP宏变量的定义: #include<math.h>//调用math函数#definePI3.1415926;//定义宏变量PI操作数的定义:QString a ,a1 ;//定义操作数int a2;数字键的定义:以数字"1〞为例void Dialog::on_pushButton_5_clicked()//数字键的定义{a=a.append('1');ui->lineEdit->setText(a);}加减乘除的定义:减法为例void Dialog::on_pushButton_17_clicked()//减号定义{a1=a;a='';a2=1;QString str;str=str.append('-');ui->lineEdit->setText(str);}三角函数的定义:以sin函数为例void Dialog::on_pushButton_25_clicked()//sin函数定义{QString str;str=a;double c=str.toDouble();double x;x=(c/180)*PI;//角度转换为弧度x=sin(x);str=str.setNum(x);ui->lineEdit->setText(str);a=str;}二元函数运算的等号处理函数cal〔〕的定义:void Dialog::cal(void)//二元函数运算的等号处理函数{QString str1,str2;str1=a;str2=a1;double s1=str1.toDouble();double s2=str2.toDouble();switch(a2){case0:s2=s2+s1;ui->lineEdit->setText(QString::number(s2));break; case1:s2=s2-s1;ui->lineEdit->setText(QString::number(s2));break; case2:s2=s2*s1;ui->lineEdit->setText(QString::number(s2));break; case3:s2=s2/s1;ui->lineEdit->setText(QString::number(s2));break; case4:s2=pow(s2,s1);ui->lineEdit->setText(QString::number(s2));break; }a=a.setNum(s2);}还包括1.退出,清屏,退格的定义。
实验四Qt编写简单的计算器一、【实验目的】1)熟悉QtCreator的简单操作。
2)了解Qt程序编写框架。
3)了解信号和槽机制,熟练掌握信号与槽在应用程序中的使用。
二、【实验内容】1)查看API手册,学习简单的Qt类的使用,如QLineEdit、QPushButton等。
2)用QtCreator创建工程,用Qt编写计算器程序。
3)对计算器程序进行移植。
三、【实验步骤】1.创建工程1)打开QtCreator,如图1所示。
图12)选择File->New File or Project,然后在弹出的对话框中选择OtherProject->Empty Qt project(如图2所示),然后进入下一步。
图23)定义新工程的工程名并选择保存路径(如图3所示),然后进入下一步。
图34)选择Qt版本,这里选择使用Qt4.7.1,取消对Qt in PATH的选择(如图4所示),然后进入下一步,完成新工程的创建(如图5所示)。
图4 图52.计算器程序的实现计算器程序主要分以下两部分工作:一是实现计算器的图形界面;二是实现按键事件和该事件对应的功能绑定,即信号和对应处理槽函数的绑定。
1)计算器图形界面的实现通过分析计算器的功能我们可知,需要16个按键和一个显示框,同时考虑到整体的排布,还需要水平布局器和垂直布局器。
通过组织这些类我们可以实现一个简单的带有数字0~9,可以进行简单四则运算且具有清屏功能的计算器。
对于这些类的具体操作会在后面的代码中详细说明。
2)信号和对应槽函数的绑定分析计算器的按键我们可以把按键事件分为以下三类,一是简单的数字按键,主要进行数字的录入,这类按键包括按键0~9;二是运算操作键,用于输入数学运算符号,进行数学运算和结果的显示,这类按键包括“+”,“-”,“*”,“/”,“=”;三是清屏操作键,用于显示框显示信息的清除。
3)进入刚才创建的空工程,双击左侧的Calculator.pro,在主编辑框中目前显示Calculator.pro的内容为空,如图6所示。
这是因为目前什么文件都没有添加的缘故。
图64)添加文件calculator.h在工程Calculator上面点击右键,然后点击Add New,选择添加C++ Header File(如图7所示),进入下一步后输入文件名calculator.h(如图8所示),然后完成文件的添加。
图7图8 5)添加文件calculator.cpp和main.cpp与添加文件calculator.h的过程类似,只是在选择文件类型时选择为C++ Source File。
完成后可以查看Calculator.pro文件的内容,整个工程的文件结构如图9所示。
图93.计算器程序源代码的分析说明1)对calculator.h源代码的简要说明#ifndef CALCULATOR_H#define CALCULATOR_H //对calculator.h头文件的声明#include<QWidget>//包含主窗体类#include<QPushButton>//包含按键类#include<QVBoxLayout>//包含垂直布局器类#include<QHBoxLayout>//包含水平布局器类#include<QLineEdit>//包含显示框类class Calculator : public QWidget//计算器继承自主窗体类{Q_OBJECT //必须加上这句,如果要调用信号,槽函数的操作的话public:Calculator(); //计算器类的构造函数~Calculator(); //计算器类的析构函数public slots: //定义各个按键按下后对应操作处理的槽函数void zeroButtonPress();void oneButtonPress();void twoButtonPress();void threeButtonPress();void fourButtonPress();void fiveButtonPress();void sixButtonPress();void sevenButtonPress();void eightButtonPress();void nineButtonPress();void addButtonPress();void subButtonPress();void mulButtonPress();void divButtonPress();void clearButtonPress();void equButtonPress();private:QLineEdit *operateEdit;//声明显示框QPushButton *zeroButton;//声明数字按键¹QPushButton *oneButton;QPushButton *twoButton;QPushButton *threeButton;QPushButton *fourButton;QPushButton *fiveButton;QPushButton *sixButton;QPushButton *sevenButton;QPushButton *eightButton;QPushButton *nineButton;QPushButton *clearButton;//声明运算符按键QPushButton *addButton;QPushButton *subButton;QPushButton *divButton;QPushButton *mulButton;QPushButton *equButton;QHBoxLayout *firstLayout;//声明水平布局器,该布局器主要对16个按键进行布局QHBoxLayout *secondLayout;QHBoxLayout *thirdLayout;QHBoxLayout *fourthLayout;QVBoxLayout *mainLayout;//声明垂直布局器,该布局器主要对主窗体上面的空间进行排布QString input1;//计算器第一个运算操作数QString input2;//计算器第二个运算操作数char operate;//运算符};#endif// CALCULATOR_H2)对calculator.cpp源代码的简要说明首先是构造函数的实现:Calculator::Calculator(){operateEdit = new QLineEdit(this);//初始化显示框operateEdit->setReadOnly(true); //设置显示框为只读operateEdit->setText(tr("0"));//初始化显示框显示数据为0zeroButton = new QPushButton;//初始化按键zeroButton->setText(tr("0"));//设置按键上显示的标签,以下对按键相关的操作类似oneButton = new QPushButton;oneButton->setText(tr("1"));twoButton = new QPushButton;twoButton->setText(tr("2"));threeButton = new QPushButton;threeButton->setText(tr("3"));fourButton = new QPushButton;fourButton->setText(tr("4"));fiveButton = new QPushButton;fiveButton->setText(tr("5"));sixButton = new QPushButton;sixButton->setText(tr("6"));sevenButton = new QPushButton;sevenButton->setText(tr("7"));eightButton = new QPushButton;eightButton->setText(tr("8"));nineButton = new QPushButton;nineButton->setText(tr("9"));clearButton = new QPushButton;clearButton->setText(tr("Clear"));addButton = new QPushButton;addButton->setText(tr("+"));subButton = new QPushButton;subButton->setText(tr("-"));mulButton = new QPushButton;mulButton->setText(tr("*"));divButton = new QPushButton;divButton->setText(tr("/"));equButton = new QPushButton;equButton->setText(tr("="));firstLayout = new QHBoxLayout;//初始化水平布局器firstLayoutfirstLayout->addWidget(zeroButton); //把按键zeroButton添加到firstLayout firstLayout->addWidget(oneButton); //把按键oneButton添加到firstLayout firstLayout->addWidget(twoButton); //把按键twoButton添加到firstLayout firstLayout->addWidget(addButton); //把按键threeButton添加到firstLayout,以下对水平布局器的操作类似secondLayout = new QHBoxLayout;secondLayout->addWidget(threeButton);secondLayout->addWidget(fourButton);secondLayout->addWidget(fiveButton);secondLayout->addWidget(subButton);thirdLayout = new QHBoxLayout;thirdLayout->addWidget(sixButton);thirdLayout->addWidget(sevenButton);thirdLayout->addWidget(eightButton);thirdLayout->addWidget(mulButton);fourthLayout = new QHBoxLayout;fourthLayout->addWidget(nineButton);fourthLayout->addWidget(clearButton);fourthLayout->addWidget(equButton);fourthLayout->addWidget(divButton);mainLayout = new QVBoxLayout(this);//初始化垂直布局器mainLayout mainLayout->addWidget(operateEdit); //把显示数据框operateEdit加到mainLayout mainLayout->addLayout(firstLayout); //把水平布局器firstLayout添加到mainLayout mainLayout->addLayout(secondLayout); //把水平布局器secondLayout添加到mainLayoutmainLayout->addLayout(thirdLayout); //把水平布局器thirdLayout添加到mainLayoutmainLayout->addLayout(fourthLayout); //把水平布局器fourthLayout添加到mainLayoutconnect(zeroButton,SIGNAL(clicked()),this,SLOT(zeroButtonPress()));//把按键zeroButton的按下事件同zeroButtonPress()绑定到一起,以下操作类似connect(oneButton,SIGNAL(clicked()),this,SLOT(oneButtonPress()));connect(twoButton,SIGNAL(clicked()),this,SLOT(twoButtonPress()));connect(threeButton,SIGNAL(clicked()),this,SLOT(threeButtonPress()));connect(fourButton,SIGNAL(clicked()),this,SLOT(fourButtonPress()));connect(fiveButton,SIGNAL(clicked()),this,SLOT(fiveButtonPress()));connect(sixButton,SIGNAL(clicked()),this,SLOT(sixButtonPress()));connect(sevenButton,SIGNAL(clicked()),this,SLOT(sevenButtonPress()));connect(eightButton,SIGNAL(clicked()),this,SLOT(eightButtonPress()));connect(nineButton,SIGNAL(clicked()),this,SLOT(nineButtonPress()));connect(addButton,SIGNAL(clicked()),this,SLOT(addButtonPress()));connect(subButton,SIGNAL(clicked()),this,SLOT(subButtonPress()));connect(mulButton,SIGNAL(clicked()),this,SLOT(mulButtonPress()));connect(divButton,SIGNAL(clicked()),this,SLOT(divButtonPress()));connect(equButton,SIGNAL(clicked()),this,SLOT(equButtonPress()));connect(clearButton,SIGNAL(clicked()),this,SLOT(clearButtonPress()));this->setWindowTitle(tr("Calculator"));//设置窗体标题为Calculatorinput2= "0";//初始化运算操作数2为0input1 = "0";//初始化运算操作数1为0operate = '0';//初始化运算符为’0’}然后是析构函数的实现:Calculator::~Calculator()//析构函数主要完成对构造函数中所声明的QLineEdit、QPushButton、QHBoxLayout、QVBoxLayout类的对象的回收工作(可以不定义析构函数,程序运行结束时会自动调用系统默认的析构函数){if (operateEdit != NULL) //{operateEdit = NULL;deleteoperateEdit;}if (zeroButton != NULL){zeroButton = NULL;deletezeroButton;}......}根据前面对按键事件的分析,有数字输入键,运算操作符输入键和清屏键三种,故对每种事件的槽响应函数都只说明一种,其他依此类推。