-
2022-05-21 19:43:49
博主也是初学者,里面存在代码问题,非常欢迎大家提出。
用Qt 写一个简单的计算器,主要运用了栈的知识, 通过出栈和入栈的方式,和将中缀表达式转化成后缀表达式。
1.创建好项目
2.定义好栈,在头文件当中声明好结构体
3.开始链接按钮
// 链接 数字 按钮
connect(ui->pushButton_0, &QPushButton::clicked, [=](){recevie("0");flag =1;});
connect(ui->pushButton_1, &QPushButton::clicked, [=](){recevie("1");flag =1;});
connect(ui->pushButton_2, &QPushButton::clicked, [=](){recevie("2");flag =1;});
connect(ui->pushButton_3, &QPushButton::clicked, [=](){recevie("3");flag =1;});
connect(ui->pushButton_4, &QPushButton::clicked, [=](){recevie("4");flag =1;});
connect(ui->pushButton_5, &QPushButton::clicked, [=](){recevie("5");flag =1;});
connect(ui->pushButton_6, &QPushButton::clicked, [=](){recevie("6");flag =1;});
connect(ui->pushButton_7, &QPushButton::clicked, [=](){recevie("7");flag =1;});
connect(ui->pushButton_8, &QPushButton::clicked, [=](){recevie("8");flag =1;});
connect(ui->pushButton_9, &QPushButton::clicked, [=](){recevie("9");flag =1;});
// 链接 运算符 按钮
connect(ui->pushButton_add, &QPushButton::clicked, [=](){recevie("+");});
connect(ui->pushButton_redu, &QPushButton::clicked, [=](){recevie("-");});
connect(ui->pushButton_mul, &QPushButton::clicked, [=](){recevie("*");});
connect(ui->pushButton_div, &QPushButton::clicked, [=](){recevie("/");});
connect(ui->pushButton_equ, &QPushButton::clicked, [=](){recevie("=");});
// 链接 功能 按钮
connect(ui->pushButton_x, &QPushButton::clicked, [=](){recevie("x");});
connect(ui->pushButton_ac, &QPushButton::clicked, [=](){recevie("ac");});
4.实现栈
// 初始化栈
int Widget::InitStack(stack*L)
{
L->top = -1;
return 1;
}
// 判断栈是否为空
int Widget::emptyStack(stack*L)
{
if(L->top == -1)
{
return 0;
}
return 1;
}
// 入栈
void Widget::Push(stack *L, QString e)
{
if(L->top >= 99)
{
qDebug() << "栈满";
}
L->top++;
L->items[L->top] = e;
L->items[L->top+1] = "N";
}
// 出栈
void Widget::Pop(stack *L, char *c)
{
if(L->top <= -1)
{
qDebug() << "栈空";
}
char*ch;
QByteArray ba = L->items[L->top].toLatin1();
ch = ba.data();
*c = *ch;
L->items[L->top] = "N";
L->top--;
}
5.实现接收数据函数, 这是这里面最重要的一个部分 通过接收函数来承上启下。
这里主要是接收按键传来的信息,然后判断这些信息,判断该实现那一步。// 由于内容过多博主就不全粘上了,需要源码的可以评论私信博主要。
// 接收数据
void Widget::recevie(QString a)
{
int n = 0;
QString j;
bool ok = true;
char *b= (char*)malloc(sizeof(char));
if (a != "=" && a != "x")
{
Push(&L1, a);
// 判断计算式是否正确1 +a+b型
if(priority(L1.items[0]) ==1||priority(L1.items[0])==2)
{
qDebug() << "表达式错误1";
Pop(&L1,b);
ui->lineEdit->setText("error!Please enter the data");
// 让程序直接结束
//exit(1);
}
while(L1.items[n] != "N")
{
//判断计算式是否正确2 a++b型
while(priority(L1.items[n]) == priority(L1.items[n+1])&& L1.items[n+1] != "N")
{
qDebug() << "表达式错误2";
while (emptyStack(&L1))
{
Pop(&L1,b);
}
ui->lineEdit->setText("error!Please enter the data");
break;
}
j+= L1.items[n];
n++;
}
ui->lineEdit->setText(j);
}......
6.符号优先级的判断。
//优先级 和判断是否是运算符
int Widget::priority(QString b)
{
char*c;
QByteArray ba = b.toLatin1();
c = ba.data();
switch (*c) {
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
case '0':
return 0;
case '1':
return 0;
case '2':
return 0;
case '3':
return 0;
case '4':
return 0;
case '5':
return 0;
case '6':
return 0;
case '7':
return 0;
case '8':
return 0;
case '9':
return 0;
default:
return 3;
}
}
7.利用出入栈将后缀表达式转化成中缀表达式 。
// 将中缀表达式转为后缀表达式
void Widget::transform(stack *L)
{
int n = 0;
int b;
//int c = 0;
char *e = (char*)malloc(sizeof(char));
while(L->items[n] != "N")
{
b = priority(L->items[n]);
if(!b)
{
Push(&L2, L->items[n]);
n++;
}
if(b)
{
if(!emptyStack(&L3) || priority(L->items[n]) > priority(L3.items[L3.top]))
{
Push(&L3, L->items[n]);
}
else
{
Pop(&L3, e);
QString a1(*e);
Push(&L2,a1);
Push(&L3, L->items[n]);
}
n++;
}
}
if(L->items[n] == "N")
{
while(emptyStack(&L3))
{
Pop(&L3,e);
QString a2(*e);
Push(&L2,a2);
}
}
}
8.计算后缀表达式。
void Widget::compute(stack *L)
{
char *a1 =(char*)malloc(sizeof(char));
char *a2=(char*)malloc(sizeof(char));
QString s;
float res;
int n = 0;
int k;
bool ok;
while(L->items[n] != "N")
{
k = priority(L->items[n]);
if(!k)
{
Push(&L4, L->items[n]);
n++;
}
if(k)
{
Pop(&L4,a1);
//qDebug() << *a1;
Pop(&L4,a2);
QString e1(*a1);
QString e2(*a2);
char*ch;
QByteArray ba = L->items[n].toLatin1();
ch = ba.data();
switch(*ch) {
case '+':
res = e2.toInt(&ok, 10) + e1.toInt(&ok,10);
break;
case '-':
res = e2.toInt(&ok, 10) - e1.toInt(&ok,10);
break;
case '*':
res = e2.toInt(&ok, 10) * e1.toInt(&ok,10);
break;
case '/':
res = e2.toFloat(&ok) / e1.toInt(&ok,10);
break;
}
s = QString("%1").arg(res);
// 输出结果是:float is 1.222
// s = QString::number(res, 10);
Push(&L4,s);
n++;
}
}
}
需要源码的可以私信博主,免费给大家。
更多相关内容 -
QT计算器(内含完整代码)
2020-07-25 13:25:17QT计算器(内含完整代码) -
qt计算器实现加减乘除(还有计算过的数据浏览)
2021-06-30 16:47:22c++,qt,编程初学者 -
QT计算器
2022-04-06 20:57:41QT计算机课程设计一、*需求分析*
实现一个简单的计算器,可以进行算术表达式的计算;操作运算包含加、减、乘、除、括号、与、或、非,即21+35(3+4)、1!2、3&4等计算表达式。后缀表达式严格的从左到右进行计算;假定输入表达式有空格进行简化处理。
计算器需要有良好的操作界面和报错功能,图形界面需要连接计算器进行信号控制,报错需要在计算器进行除数和运算符连续等进行提示,比如在除数为0时进行报错题时error提示。
二、*设计*
根据上述需求分析,需要设计一个交互良好的计算器,设计图形界面与计算器模型相连接;将图形界面的文本进行传值,进入计算器mode进行计算器。
*计算器mode:*
1.设立两个堆栈,一个用来保存运算符,另一个用来保存数字。
2.在表达式首尾添加标记运算符,该运算符运算优先级最低。
3.从左至右依次遍历字符串,若遍历到运算符,则将其与运算符栈栈顶元素比较,若运算符栈栈顶运算符优先级小于该运算符或者此时运算符栈为空,则将运算符压入堆栈。遍历字符串中下一个元素。
4.若运算符栈栈顶运算符优先级大于该运算符,则弹出该栈顶运算符,再从数字栈中依次弹出两个栈顶数字,完成弹出的运算符对应的运算得到结果后,再将该结果压入数字栈,重复比较此时栈顶运算符与当前遍历到的运算符优先级,视其优先级大小重复步骤(3)或步骤(4)。
5.若遍历到表达式中的数字,则直接压入数字栈。
6.若运算符堆栈中仅有两个运算符且栈顶元素为我们人为添加的标记运算符,那么表达式运算结束,此时数字栈中唯一的数字即为表达式的值。
*图形界面:*
1.使用label进行文本的显示,使用信号槽与计算器连接、数字按键连接,实时将文本显示,传入计算器。
2.使用pushbutton按键进行数字文本输入和符号输入,将文本传入label显示和将信息传入计算器中。
3.使用信号槽进行回传计算值或者进行报错计算。
*三、系统框图*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCQf79V0-1649249839112)(https://raw.githubusercontent.com/lmy12367/img/main/imgwps66B7.tmp.jpg)]
*四、属性与方法定义*
类 函数名称 作用 Mode Int Priority 定义优先级 Mode Void Calculator 计算器函数 Mode Bool Isnumber 判断数字与字符 Mainwindow Mainwindow 构造函数初始化 Mainwindow Void on_btn_clicked 信号槽函数 *五、调试与演示*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btMWzXjk-1649249839114)(https://raw.githubusercontent.com/lmy12367/img/main/imgwpsF88B.tmp.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOBm0wkk-1649249839114)(https://raw.githubusercontent.com/lmy12367/img/main/imgwpsF88D.tmp.jpg)]
六、*参考资料*
Csdn–QT如何实现计算器
Csdn–QT如何编写图形界面
Csdn–栈的运用
Csdn–如何使用信号槽机制
Csdn–如何改变QT的透明度
QT快速入门
逻辑运算
七、*感悟*
通过这次QT计算器的编写,我熟练掌握了QT的使用,可以通过后台程序完成对图形界面的设计,通过图形界面向后台程序进行传值计算。通过这次课程设计,我复习了栈的运用,重新完成第二次作业下的计算器编写,加入报错功能,与或非等计算功能,重新温习以前的课程。
*八、关键源代码*
信号槽函数
void MainWindow::on_btn_sum_clicked() { this->model1->get_str(this->temp2); QString p=this->model1->calculator(); this->temp1=p; this->temp2=p; this->ui->label->setText(this->temp1); }
判断是不是数字
bool model::isnumber(char x) { if (x >= '0'&&x <= '9')return true; else return false; }
优先级定义
int priority(char x) { if (x == '+' || x == '-') return 1; else if (x == '*' || x == '/') return 2; else if (x == '!') return 3; else if (x == '(' || x == ')') return -1; else if (x == '&' || x == '|') return -2; else if (x == '#') return -3; else return 0; }
-
QT.rar_qt 计算器_qt计算器_嵌入式Qt_嵌入式计算器_计算器QT
2022-07-15 16:12:36基于嵌入式QT的简易计算器设计与编程 基于嵌入式QT的简易计算器设计与编程 -
QT计算器全部工程文件打包
2020-03-30 14:22:00本工程使用QT Creator创建,根据吴健老师的QT视频教程学习模仿编写而成,新手入门,难免有不足和错误,仅作学习备忘,还望海涵。 -
QT计算器界面和计算器功能实现
2019-03-25 09:26:45使用QT开发的计算器程序,可实现加减乘除运算和运算记录保存功能。 -
Qt计算器源码鼠标点击控制
2019-09-26 17:57:01Qt简易计算器资源源码,大家可以参考,我第一次发文,感谢大家支持 -
Qt计算器实现
2022-01-22 16:19:481.QLineEdit组件 QLineEdit用于接受用户输入 QLineEdite能够获取用户输入的字符串 QLineEdite是功能性组件,需要父组件作为...le.setAlignment(Qt::AlignRight); //设置显示的字符串向右边对齐 le.move(10. 10); //移动1.QLineEdit组件
QLineEdit用于接受用户输入
QLineEdite能够获取用户输入的字符串
QLineEdite是功能性组件,需要父组件作为容器
QLineEdite能够在父组件中进行定位Qwidget w; //生成QWidget对象,顶级组件 QLineEdit le(&w); //生成QLineEdite对象,其父组件为QWidget le.setAlignment(Qt::AlignRight); //设置显示的字符串向右边对齐 le.move(10. 10); //移动到坐标(10, 10) le.resize(240, 30); //设置大小width = 240, height = 30
2.设计与实现
(1)界面设计
定义组件间的间隔:
Space = 10px
定义按钮组件的大小:
Width = 40px,Height = 40px
定义文本框组件的大小:
Width = 5 * 40px + 4 * 10px, Height = 30px编程实现:计算器器界面实现
#include "widget.h" #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", }; int ret = 0; 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, 50 + (10 + 40)*i); button[i*5 + j]->setText(btnText[i*5 + j]); } } w->show(); w->setFixedSize(w->width(), w->height()); ret = a.exec(); delete w; return ret; }
-
Qt 计算器 C++
2017-05-12 19:49:34Qt 计算器 C++ -
Qt计算器——功能完整的计算器
2022-06-07 13:58:27一、功能介绍参考windows 10系统自带的计算器,进一步完善实验1的计算器功能,基本要求(必须要具备的): 支持四种计算模式:标准型、科学型、程序员、日期计算模式 ;支持货币与容量转换 ;支持不同模式的切换 。二...一、功能介绍
参考windows 10系统自带的计算器,进一步完善实验1的计算器功能,基本要求(必须要具备的):
支持四种计算模式:标准型、科学型、程序员、日期计算模式 ;
支持货币与容量转换 ;
支持不同模式的切换 。
二、系统设计
2.1概要设计
2.2UI设计
标准页面:
货币转换界面:
容量转换界面:
程序员计算器界面:
容量转换界面:
日期计算:
科学计算器界面:
实现代码:Qt5计算器——支持标准型、科学型、程序员、日期四种计算模式;支持货币与容量转换;支持不同模式的切换。-C++文档类资源-CSDN下载
-
Qt计算器源代码
2017-03-25 15:38:43Qt计算器源代码 -
linux下实现QT计算器,Qt实现计算器
2021-05-17 13:40:02《Qt实现计算器》由会员分享,可在线阅读,更多相关《Qt实现计算器(10页珍藏版)》请在人人文库网上搜索。1、Qt设计报告-计算器实现学 院: xxxxxxxxxxxxxxxxxxxx 姓 名: xxxxxxxxxxxxxxxx 学 号: ... -
qt计算器简单代码
2015-07-09 00:11:47qt计算器简单代码 void Calculator::on_btn1_clicked() { if (flag == 0) { op0 = op0 * 10 + 1; if (finished == 0) s += "1"; else { s = "1"; finished = 0; } } else { op1 = op1 * 10 + 1; s +=... -
Qt简易计算器(带括号加减乘除)
2020-07-06 17:43:45压缩包内为完整项目文件,...Qt version:5.14 IDE:Qt内置编译器 C++ 表达式求值方法:中缀表达式转后缀表达式,后缀表达式求值。 资源详细情况见博文:https://blog.csdn.net/qq_44977889/article/details/106888257 -
Qt计算器项目开发源码
2014-05-17 11:06:29这是本人Qt计算器开发系列博文的工程源码。欢迎大家下载,免积分。 以下是关于这个开发技术的相关博文,请参考。 (一)后缀表达式实现完整数学表达式的计算 ...(二)信号槽实现数学表达式合法性检查 ... -
QT-科学计算器-可视化-逆波兰算法
2021-03-28 13:38:05利用QT制作科学计算器,实现可视化,包括括号、二元一次方程、指数对数运算等功能 -
Qt_calculator_vc.rar_qt计算器
2022-07-14 22:34:48用Qt配合c++编写的计算器程序,可以参考一下 -
c++初学教程-第3课-qt计算器.mp4
2021-09-03 17:54:20c++初学教程-第3课-qt计算器 -
Qt计算器代码
2015-07-08 21:19:56Qt计算器代码 -
计算器_C++_QT_计算器_
2021-09-28 19:51:07含四则运算、幂运算、对数运算等的计算器,可用QT进行可视化操作。 -
QT计算器(功能全实现 支持15位小数)
2011-11-17 18:01:22QT计算器:QT 计算器 键盘输入 窗口按钮输入 功能全实现 支持15位小数 HOHO~~~ -
QT计算器 ( QCalculator )
2020-04-18 09:28:33QT设计的计算机小程序,配合QT15课的学习,麻雀虽小,五脏俱全,体现了界面与业务逻辑的交互,也体现了模块间的高内聚弱耦合的设计思想 -
QT计算器程序
2018-10-19 19:52:02用Qt做的计算器,供大家学习。有做的不好的地方,请大家指出! -
QT 计算器QT 计算器QT 计算器QT 计算器
2011-04-21 01:24:26REQT 计算器QT 计算器QT 计算器QT 计算器QT 计算器QT 计算器 -
嵌入式实习-基于QT的计算器设计.zip
2019-06-21 12:38:28嵌入式实习-基于QT的计算器设计 -
QT 计算器源码
2014-03-16 20:55:17源码 工程都有 包括界面文件盒各种.c和.h文件,有需要可以咨询 -
Qt简单计算器
2018-03-23 10:08:22使用Qt开发的简单计算器。实现计算器的简单功能。可运行。