自己在Qt上做的辣鸡计算器

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
#include <stack>
using namespace std;

bool cmopareFun(QChar l,QChar r)
{
    if(r == '*' || r == '/')
    {
        if(l == '*' || r== '/')
            return false;
        else
            return true;
    }
    else
    {
            return false;
    }
}

double calc(QString str)
{
    double res = 0;
    double temp = 0;
    QString str1 = NULL;
    QString str2 = NULL;
    stack<QChar> stackFun;
    stack<double> stackNum;

    for(int i=0;i<str.length();i++)
    {
        if(str[i].isDigit())
        {
            str1.append(str[i]);
        }
        else
        {
            str1.append(' ');
            if(stackFun.size() == 0)
            {
                stackFun.push(str[i]);
            }
            else if(::cmopareFun(stackFun.top(),str[i]))
            {
                stackFun.push(str[i]);
            }
            else
            {
                str1.append(stackFun.top());
                stackFun.pop();
                stackFun.push(str[i]);
            }
            str1.append(' ');
        }
    }
    while(stackFun.size() >0 )
    {
        str1.append(' ');
        str1.append(stackFun.top());
        stackFun.pop();
    }

    qDebug() << str1;//

    for(int i=0;i<str1.length();i++)
    {
        if(str1[i].isSpace())
        {
            if(str2.length()>0)
            {
                temp = str2.toDouble();
                stackNum.push(temp);
                str2.clear();
            }
            continue;
        }
        else if(str1[i].isDigit())
        {
            str2.append(str1[i]);
        }
        else
        {
            double t1,t2;
            if(stackNum.size() == 0)
            {
                str2.append(str1[i]);
                continue;
            }
            else if(stackNum.size() == 1)
            {
                t1 = 0;
                t2 = stackNum.top();
                stackNum.pop();
            }
            else
            {
                t2 = stackNum.top();
                stackNum.pop();
                t1 = stackNum.top();
                stackNum.pop();
            }

            if(str1[i] == '+')
                stackNum.push(t1 + t2);
            if(str1[i] == '-')
                stackNum.push(t1 - t2);
            if(str1[i] == '*')
                stackNum.push(t1 * t2);
            if(str1[i] == '/')
                stackNum.push(t1 / t2);
        }
    }
    if(str2.length() > 0)
    {
        stackNum.push(str1.toDouble());
    }

    res = stackNum.top();
    stackNum.pop();

    return res;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_2,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_3,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_4,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_6,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_7,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_9,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_10,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_11,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_12,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_13,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_14,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_15,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_16,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_17,&QPushButton::pressed,this,dealNum);
    connect(ui->pushButton_18,&QPushButton::pressed,this,dealNum);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::dealNum()
{
    QPushButton* pSender = (QPushButton*)this->sender();
    QString str = ui->lineEdit->text();
    QString add = pSender->text();

    double left = 0, right = 0, res = 0;
    char calc = 0;

    if(add == "c")
    {
        str.chop(1);
    }
    else if(isdigit(*add.toStdString().data()))
    {
        if(str == "0")
            str.chop(1);
        str += add;
    }
    else
    {
        //first function
//        if(sscanf(str.toStdString().data(),"%lf%c%lf",&left,&calc,&right) != 3)
//            goto RES;
//        switch(calc)
//        {
//        case '+':
//            res = left + right;
//            break;
//        case '-':
//            res = left - right;
//            break;
//        case '*':
//            res = left * right;
//            break;
//        case '/':
//            res = left / right;
//            break;
//        default:
//            break;
//        }
//        str = QString::number(res);
//        RES:
//        if(strcmp(add.toStdString().data(),"=") != 0)
//            str += add;

        //second function
        if(*add.toStdString().data() == '=')
        {
            res = ::calc(str);
            ui->lineEdit->setText(QString::number(res));
            return;
        }
        else
        {
            str += add;
        }
    }

    ui->lineEdit->setText(str);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

java.lang.IllegalArgumentException: Wrong FS: hdfs://localhost:54310/user/Hadoop/b, expected: file:/

 java.lang.IllegalArgumentException: Wrong FS: hdfs://localhost:54310/user/Hadoo...

3397
来自专栏别先生

在IDEA中编写Spark的WordCount程序

1:spark shell仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在IDE中编制程序,然后打成jar包,然后提交到集群,最常用的是创建一个Ma...

4529
来自专栏大数据学习笔记

Hadoop基础教程-第10章 HBase:Hadoop数据库(10.7 HBase 批量导入)

第10章 HBase:Hadoop数据库 10.7 HBase 批量导入 10.7.1 批量导入数据的方法 向HBase表中导入一条数据可以使用HBase Sh...

1675
来自专栏大数据学习笔记

Spark2.x学习笔记:8、 Spark应用程打包与提交

8、 Spark应用程打包与提交 提示:基于Windows平台+Intellij IDEA的Spark开发环境,仅用于编写程序和代码以本地模式调试。 Win...

5049
来自专栏成长道路

org.apache.spark.sql.AnalysisException: Table or view not found: `traintext`.`train`; line 1 pos 14;

恭喜老铁,跟我遇到了一样的问题,接下来是解决方法: 遇到的问题: org.apache.spark.sql.AnalysisException: Table o...

6570
来自专栏闵开慧

eclipse中运行hbase时显示Connection refused: no furthe...

java.net.ConnectException: Connection refused: no further information at ...

3827
来自专栏写代码的海盗

spark在yarn-cluster上面执行报错

在单机模式下执行成功的spark程序,在yarn上面就报错。异常信息如下: 1 14/08/14 02:05:42 INFO DAGScheduler: Co...

2935
来自专栏杂烩

spark整合hive+hbase做数据实时插入及实时查询分析

        使用的spark是2.0.1,hive是1.2.1,hbase是1.2.4,hadoop是2.6.0,zookeeper是3.4.9

594
来自专栏后台及大数据开发

springBoot系列教程01:elasticsearch的集成及使用

 1.首先安装elasticsearch 集群环境,参考 http://www.cnblogs.com/xiaochangwei/p/8033773.html

591
来自专栏一个会写诗的程序员的博客

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logba...

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Ei...

815

扫描关注云+社区