qt 计算器实现(中缀转后缀,后缀计算)
来源:互联网 发布:矩阵潜袭扩展和循环 编辑:程序博客网 时间:2024/05/16 19:47
我先把界面贴出来
界面就是这样子的,当然也可以不是这样子的,自己设计,怎么好看怎么来
我来简介下按钮的对象 0到9 就是
pushButton9,pushButton8等等我先把界面的代码贴出来其实蛮简单的,就是让其生成正确的中缀,然后进行中缀转后缀处理。关键是如何是生成正确的中缀。处理好0到9和括号还有+-*/等直接的关系。就是一个逻辑1.数字不能出现两个小数点2.不能同时出现两个操作符。比如++。-+。等3.括号要匹配4.操作符之间的输入要正确 等#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "kuohao_stack.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QString all;//记录全部其信息 QString only_num;//记录数字其信息 QString x(QString s);//我测试用的,没啥用private slots: void on_pushButton1_clicked(); void on_pushButton2_clicked(); void on_pushButton3_clicked(); void on_pushButton4_clicked(); void on_pushButton5_clicked(); void on_pushButton6_clicked(); void on_pushButton7_clicked(); void on_pushButton8_clicked(); void on_pushButton9_clicked(); void on_pushButton0_clicked(); void on_pushButton_dot_clicked(); void on_pushButton_add_clicked(); void on_pushButton_sub_clicked(); void on_pushButton_mul_clicked(); void on_pushButton_div_clicked(); void on_pushButton_4_clicked(); void on_pushButton_3_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_res_clicked(); //void on_pushButton_close_clicked();private: Ui::MainWindow *ui;};#endif // MAINWINDOW_H#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->lineEdit->setReadOnly(true);ui->lineEdit->setAlignment(Qt::AlignRight);ui->lineEdit_2->setAlignment(Qt::AlignRight);// ui->lineEdit_2->setStyleSheet("{border-width:0;border-style:outset;font: 20pt}");//除边框// ui->lineEdit->setStyleSheet("{border-width:0;border-style:outset;font: 20pt}");}QString MainWindow::x(QString s){return s;}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_pushButton1_clicked(){all=ui->lineEdit->text();//先保存输入的all+="1" ; //然后再增加only_num+="1"; //这个是保持数字的变量 为了让其不出现两个小数点ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton2_clicked(){all=ui->lineEdit->text();all+="2" ;only_num+="2";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton3_clicked(){all=ui->lineEdit->text();all+="3" ;only_num+="3";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton4_clicked(){all=ui->lineEdit->text();all+="4" ;only_num+="4";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton5_clicked(){all=ui->lineEdit->text();all+="5" ;only_num+="5";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton6_clicked(){all=ui->lineEdit->text();all+="6" ;only_num+="6";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton7_clicked(){all=ui->lineEdit->text();all+="7" ;only_num+="7";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton8_clicked(){all=ui->lineEdit->text();all+="8" ;only_num+="8";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton9_clicked(){all=ui->lineEdit->text();all+="9" ;only_num+="9";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton0_clicked(){all=ui->lineEdit->text();all+="0" ;only_num+="0";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}void MainWindow::on_pushButton_dot_clicked(){all=ui->lineEdit->text();if(only_num!=""&&!ui->lineEdit->text().isEmpty()&&only_num.indexOf('.')==-1&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('){
all+="." ;only_num+=".";ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}
else{
qDebug()<<"错误操作.";}
}void MainWindow::on_pushButton_add_clicked(){all=ui->lineEdit->text();if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.'){
all+='+';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);only_num="";}
else{
qDebug()<<"错误操作+";}
}void MainWindow::on_pushButton_sub_clicked(){all=ui->lineEdit->text();if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.'){
all+='-';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);only_num="";}
else{
qDebug()<<"错误操作-";}
}void MainWindow::on_pushButton_mul_clicked(){all=ui->lineEdit->text();if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.'){
all+='*';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);only_num="";}
else{
qDebug()<<"错误操作*";}
}void MainWindow::on_pushButton_div_clicked(){all=ui->lineEdit->text();if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.'){
all+='/';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);only_num="";}
else{
qDebug()<<"错误操作/";}
}void MainWindow::on_pushButton_4_clicked()//清除{ui->lineEdit->setText("");ui->lineEdit_2->setText("");all="";only_num="";}void MainWindow::on_pushButton_3_clicked()//回退{all=ui->lineEdit->text();if(all.length()!=0){
if(all[all.length()-1]<=57&&all[all.length()-1]>=48){
only_num[only_num.length()-1]=' ';all.remove(' ');}
all[all.length()-1]=' ';all.remove(' ');ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}
else{
qDebug()<<"回退操作错误";}
qDebug()<<only_num;}void MainWindow::on_pushButton_clicked()// ({all=ui->lineEdit->text();//ui->lineEdit->setStyleSheet(QString(":focus{ background-color: red; }"));if(ui->lineEdit->text().isEmpty()){
all+='(';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}
else if(all[all.length()-1]!='.'&&!(all[all.length()-1]<=57&&all[all.length()-1]>=48)){
all+='(';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}
else{
qDebug()<<"错误操作(";return;}
kuohao_stack k;if(k.kuohao(k.l,all)!=1){
ui->pushButton_res->setEnabled(false);}
elseui->pushButton_res->setEnabled(true);}void MainWindow::on_pushButton_2_clicked()// ){all=ui->lineEdit->text();//ui->lineEdit->setStyleSheet(QString(":focus{ background-color: red; }"));if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='.'&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'){
all+=')';ui->lineEdit->setText(all);ui->lineEdit_2->setText(all);}
else{
qDebug()<<"错误操作)";return;}
kuohao_stack k;if(k.kuohao(k.l,all)!=1&&all[all.length()-1]=='+'&&all[all.length()-1]=='-'&&all[all.length()-1]=='*'&&all[all.length()-1]=='/'&&all[all.length()-1]=='.'){
ui->pushButton_res->setEnabled(false);}
elseui->pushButton_res->setEnabled(true);}void MainWindow::on_pushButton_res_clicked()//结算 把中缀变后缀在然后再计算{kuohao_stack k;QString s1;k.init(k.l);//s1=ui->lineEdit->text();qDebug()<<s1;double x=k.math(k.l,s1);qDebug()<<x;ui->lineEdit->setText(QString::number(x));all="";only_num=ui->lineEdit->text();}/*void MainWindow::on_pushButton_close_clicked()//关闭计算器{
QApplication* app;app->quit();}
*/
然后是算法代码#ifndef KUOHAO_STACK_H#define KUOHAO_STACK_H#include <QString>typedef struct{//int max=10;char a[10];int top;}slist_stack;
class kuohao_stack{public:
kuohao_stack();slist_stack *l;void init(slist_stack *l);int kuohao(slist_stack *l,QString c);double math(slist_stack *l,QString c);//转后缀 再计算double readnumber(char f[],int *i);int is_operation(char op);int priority(char op);};#endif // KUOHAO_STACK_H#include "kuohao_stack.h"#include <QDebug>kuohao_stack::kuohao_stack()
{}void kuohao_stack::init(slist_stack *l){l->top=0;}int kuohao_stack::is_operation(char op){switch(op){
case '+':case '-':case '*':case '/':return 1;default:return 0;}
}int kuohao_stack::priority(char op){switch(op){
case '#':return -1;case '(':return 0;case '+':case '-':return 1;case '*':case '/':return 2;default:return -1;}
}double kuohao_stack::readnumber(char f[], int *i){double x=0.0;int k=0;while(f[*i]>='0'&&f[*i]<='9'){
x=x*10+(f[*i]-'0');(*i)++;
}
if(f[*i]=='.'){
(*i)++;
while(f[*i]>='0'&&f[*i]<='9'){
x=x*10+(f[*i]-'0');(*i)++;
k++;
}
}
while(k!=0){
x=x/10.0;k=k-1;}
return x;}int kuohao_stack::kuohao(slist_stack *l,QString c1)//括号匹配{l->top=0;int i=0;std::string str = c1.toStdString();//把QString 转化为char数组const char* c= str.c_str();qDebug()<<c;while(i<c1.length()){
if(c[i]=='('){
l->a[l->top++]=c[i];}
if(c[i]==')'){
l->top--;}
i++;
}
if(l->top==0)return 1;elsereturn -1;}double kuohao_stack::math(slist_stack *l, QString c1)//转后缀{if(c1[c1.length()-1]=='/'||c1[c1.length()-1]=='*'||c1[c1.length()-1]=='.'){
c1=QString(c1+"1#");}
else if(c1[c1.length()-1]=='+'||c1[c1.length()-1]=='-'){
c1=QString(c1+"0#");}
else{
c1=QString(c1+"#");}
int i=0,j=0;char opst[100],f[100];std::string str = c1.toStdString();const char* e= str.c_str();qDebug()<<e;int t1=0,t;opst[t1]='#';t1++;
while(e[i]!='#'){
if((e[i]>='0'&&e[i]<='9')||e[i]=='.')f[j++]=e[i];
else if(e[i]=='('){
opst[t1]=e[i];
t1++;
}
else if(e[i]==')'){
t=t1-1;while(opst[t]!='('){
f[j++]=opst[--t1];
t=t1-1;t1--;
}
}
else if(is_operation(e[i])){
f[j++]=' ';while (priority(opst[t1-1])>=priority(e[i]))f[j++]=opst[--t1];
opst[t1]=e[i];
t1++;
}
i++;
}
while(t1)f[j++]=opst[--t1];
// 后缀计算double obst[100];int t2=0;int i1=0;double x1,x2;while(f[i1]!='#'){
if(f[i1]>='0'&&f[i1]<='9'){
obst[t2]=readnumber(f,&i1);
t2++;
}
else if(f[i1]==' '){
i1++;
}
else if(f[i1]=='+'){
x2=obst[--t2];
x1=obst[--t2];
obst[t2]=x1+x2;
t2++;
i1++;
}
else if(f[i1]=='-'){
x2=obst[--t2];
x1=obst[--t2];
obst[t2]=x1-x2;
t2++;
i1++;
}
else if(f[i1]=='*'){
x2=obst[--t2];
x1=obst[--t2];
obst[t2]=x1*x2;
t2++;
i1++;
}
else if(f[i1]=='/'){
x2=obst[--t2];
x1=obst[--t2];
if(x2==0){
obst[t2]=0;qDebug()<<"除数不能为O";return 0;}
else{
obst[t2]=x1/x2;
t2++;
i1++;
}
}
}
return obst[0];}要源代码的留邮箱号,不想挂在csdn的下载里
阅读全文
1 0
- qt 计算器实现(中缀转后缀,后缀计算)
- 计算器实现---中缀表达式转后缀表达式
- java实现中缀转后缀,后缀计算值
- 栈-中缀转后缀及后缀计算
- 中缀转后缀并计算
- 数据结构之简单表达式计算器(读入中缀转后缀,通过后缀计算结果)
- 计算器:中缀表达式转后缀表达式
- c++ 中缀表达式转后缀表达式 计算器
- 【栈/中缀转后缀】HDU1237简单计算器
- java实现 中缀转后缀
- 中缀转后缀 c++实现
- java实现中缀表达式转后缀表达式并且计算
- #C++实现先中缀转后缀的算术表达式计算
- Java实现中缀表达式转后缀表达式并计算结果
- 中缀表达式转后缀表达式及后缀表达式的计算
- 中缀表达式转后缀表达式,并计算后缀表达式值
- 栈应用——中缀转后缀+后缀计算
- 中缀转后缀表达式||后缀表达书计算
- Git 命令大全(二)
- 【DB】MySQL傻瓜安装,超简单
- 推荐五款管理工具(思维导图)
- 浏览器中的JS解析器 作用域 作用域链 全局作用域 局部作用域
- 谷歌浏览器network请求时间分析!
- qt 计算器实现(中缀转后缀,后缀计算)
- GD库 验证码函数
- 翻译连载 | JavaScript轻量级函数式编程-第6章:值的不可变性 |《你不知道的JS》姊妹篇
- 机房收费系统之 多步 OLE DB 操作产生错误
- 实习面试题
- zabbix系列(二)zabbix3.0.7远程重启haproxy
- 输入3个整数,输出其最大值
- 什么是Gradle
- BZOJ 1854 [Scoi 2010] 二分图 解题报告