【程序】[Qt\C++] 图形化计算器——用QT5实现带括号优先级的GUI编程计算器

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

二、 任务分析

  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()));

四、 实验结果

【程序】[Qt\C++] 图形化计算器——用QT5实现带括号优先级的GUI编程计算器_第1张图片
左边为我的计算器,右边是win10自带的计算器

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

你可能感兴趣的:(学习笔记,实践项目,c++,qt5,gui)