欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图形化计算器——用QT5实现带括号优先级的GUI编程计算器

程序员文章站 2024-03-22 18:56:10
...

一、 实验任务(实验题目、目的)
搞个图形化的代括号的计算器

二、 任务分析

  1. 假设已经有了计算器,实现按下等号的计算算法
  2. 学习qt
  3. 设置各按钮槽函数
  4. 将算法缝合进qt内
  5. 设计实现负数、小数
  6. 优化代码计算步骤
  7. Debug
  8. 添加计算器图标ico
  9. 准备发csdn和GitHub

三、 实验设计(实验环境、算法、步骤、核心代码等)
环境:QT5 使用QT CREATOR编程(内置帮助快速查询,很方便)
核心代码如下(等号按钮)

//等号 核心代码 从input框中取出待运算的字符串 运算后输出至output,此处input为待运算的中缀表达式
void MainWindow::on_pushButton_Op_equal_clicked()
{
    QString input = ui->textEdit_Input->toPlainText();
    QStack <QChar> op;
    QStack <QString> postTemp;
//    QString p;
    int numIdxStart=-1;
    //中缀转为后缀表达式计算
    for (int i = 0; i < input.length(); ++i) {
        //数字开始  记录下标
        if(priority(input[i])==1&&numIdxStart==-1){
            numIdxStart=i;
        }else if(priority(input[i])==1){
            //数字
        }else {
            //此处input[i]为运算符
            //目前为止的是数字 push入后缀栈 此if防止连续运算符出现导致的bug
            if(numIdxStart!=-1){
                QString n = input.mid(numIdxStart,i-numIdxStart);
                postTemp.push(n);
            }
            numIdxStart = -1;
            if(op.isEmpty()){
                op.push(input[i]);
            }else if(priority(input[i])==1){
                op.push(input[i]);
            }else if(input[i]=='('){
                op.push(input[i]);
            }else if(priority(input[i])>=priority(op.top())){
                op.push(input[i]);
            }else if(input[i]==')'){
                //遇到右括号则弹栈中运算符直到遇到左括号
                while(op.top()!='(')
                    postTemp.push(op.pop());
                op.pop();
            }else if(priority(input[i])<priority(op.top())){
                //若当前运算符优先级小于栈中 则弹 直到运算符高于等于栈中元素
                //并将当前运算符push入栈
                while(!op.isEmpty()&&priority(input[i])<=priority(op.top()))
                    postTemp.push(op.pop());
                op.push(input[i]);
            }else{
                printLog("else");
            }
        }
    } //end for
    //将最后的数字push入栈
    if(numIdxStart!=-1)
        postTemp.push(input.mid(numIdxStart));
    //将op栈里残存的运算符push入栈
    while(!op.isEmpty()){
        postTemp.push(op.pop());
    }
    QVector<QString> post;
    while(!postTemp.isEmpty()){
//        p = postTemp.top() + p;
        post.append(postTemp.pop());
    }
//    //post为后缀表达式vector(反向) 不是字符串是因为有多位数的运算 字符串仍需分析数字的位数
//    //post不带括号 每个元素为一个操作符(数字或运算符)
//    printLog("p:"+p);

    QStack <double> ans;
    for (int i = post.length()-1; i >= 0; --i) {
        printLog("for:"+QString::number(i)+" post[i]:"+post[i],1000);
        if(isDigits(post[i])){
            ans.push(post[i].toDouble());
            continue;
        }
        double a = ans.pop();
        double b = ans.pop();
        double c=66666;
        if(post[i]=='+'){
            c = b + a;
        }else if(post[i]=='-'){
            c = b - a;
        }else if(post[i]=='*'){
            c = b * a;
        }else if(post[i]=='/'){
            c = b / a;
        }else {
            printLog("shit");
        }
        ans.push(c);
    }
//    printLog("sleep",100000);
//将结果输出到output文本框
    ui->textEdit_Output->setText(QString::number(ans.pop()));


四、	实验结果
 
![左边为我的计算器,右边是win10自带的计算器](https://img-blog.csdnimg.cn/2021041319514720.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvbmdmcHA=,size_16,color_FFFFFF,t_70#pic_center)
左边为我的计算器,右边是win10自带的计算器


完整的代码和项目文件在我github里 可以star下载下来,用qt5打开可以直接跑
https://github.com/gongfpp