自己在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 条评论
登录 后参与评论

相关文章

来自专栏小工匠技术圈

【Java小工匠聊密码学】--数字签名-RSA

(1)MD (MD2withRSA、MD5withRSA) (2)SHA (SHA1withRSA、SHA256withRSA、SHA384withRSA、SH...

2553
来自专栏Java学习网

Java 开发中实现DES/3DES/AES 三种对称加密算法方法学习

对称密码算法是当今应用范围最广,使用频率最高的加密算法。它不仅应用于软件行业,在硬件行业同样流行。各种基础设施凡是涉及到安全需求,都会优先考虑对称加密算法。

2675
来自专栏个人随笔

Java MD5加密与RSA加密

9104
来自专栏静默虚空的博客

[Java 安全]加密算法

Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别。 Base64是一种很常见的编码规范...

8356
来自专栏小工匠技术圈

【Java小工匠聊密码学】--数字签名-DSA

DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为数字签名标准(DigitalS...

1072
来自专栏iOS 开发杂谈

HTTPS 之对称加密与非对称加密

加密 encryption 与解密 decryption 使用的是同样的密钥 secret key,对称加密是最快速、最简单的一种加密方式。加密和解密算法是公开...

3324
来自专栏landv

java加密解密

5785
来自专栏小工匠技术圈

【小工匠聊密码学】--对称加密--DES

  DES对称加密,对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有...

722
来自专栏Android-薛之涛

Android-加解密

不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可...

1793
来自专栏Theo Tsao

RxSwift学习笔记之Subject

RxSwift Subject共分为AsyncSubject、BehaviorSubject、PublishSubject、ReplaySubject。

1262

扫码关注云+社区

领取腾讯云代金券