使用Qt实现简易四则运算器

1、页面设置

1.1结果界面展示

其中操作符按钮与数字按钮使用网格布局,需注意,“=”按钮的大小需要另外设置

代码为:

ui->equalButton->setMinmumiSize(85, 80);
ui->equalButton->setMaximumSize(85, 80);

2、槽函数逻辑

2.1数字和运算符按钮槽函数

在头文件中定义QString  expression = "";

以数字1按钮为例,其槽函数代码为:

expression += "1";
ui->lineEdit->setText(expression);

 2.2“C”和“<—”按钮槽函数

“C”按钮槽函数代码为:

expression.clear();
ui->lineEdit->clear();

“<—”按钮槽函数代码为:

expression.chop(1);
ui->lineEdit->setText(expression);

2.3“=”按钮槽函数

该简易四则运算器使用栈将中缀表达式变换为后缀表达式,上述expression中存储的即为中缀表达式。

    QStack<int> s_sum, s_opt;//分别存储数字和运算符的栈

    char opt[128] = {0};//数组,存储expression的数据
    int i = 0, tmp = 0, num1, num2;

    //把QString转换为char *
    QByteArray ba = expression.toLocal8Bit();
    strcpy(opt, ba.data());

    while(opt[i] != '\0' || s_opt.empty() != true){
        if(opt[i] >= '0' && opt[i] <= '9'){
            //将数字由string转换为int并且入数字栈
            tmp = tmp * 10 + opt[i] - '0';//将string转换为int
            i++;
            if(opt[i] < '0' || opt[i] > '9'){//判断接下来的数据是否是运算符号,如果是运算符号那么将当前的int数据入栈
                s_sum.push(tmp);
                tmp = 0;
            }
        }else{//进行运算符的入栈和计算
            if(s_opt.empty() == true || (Priority(opt[i]) > Priority(s_opt.top())) || (s_opt.top() == '(' && opt[i] != ')') ){
                //直接入栈的三种情况:1、当前栈为空 2、当前运算符的优先级高于栈顶运算符 3、栈顶运算符为“(”,当前运算符不是“)”
                s_opt.push(opt[i]);
                i++;
                continue;
            }
            if(s_opt.top() == '(' && opt[i] == ')'){
                //直接出栈的情况:栈顶运算符为“(”, 当前运算符为“)”,即不进行任何运算
                s_opt.pop();
                i++;
                continue;
            }
            if(Priority(opt[i]) <= Priority(s_opt.top()) || (opt[i] == ')' && s_opt.top() != '(') || (opt[i] == '\0' && s_opt.empty() != true)){
                //进行运算的三种情况:1、当前运算符的优先级低于栈顶运算符(先乘除后加减) 2、当前运算符为“)”, 先进行括号内的运算 3、expression遍历结束而运算符栈非空时
                char ch = s_opt.pop();
                switch(ch){//注意栈先进后出的特点,后出栈的是第一个操作数
                case '+':
                    num1 = s_sum.pop();
                    num2 = s_sum.pop();
                    s_sum.push(num2 + num1);
                    //qDebug()<< num2 <<" " << num1 << " " <<num1+num2;
                    break;
                case '-':
                    num1 = s_sum.pop();
                    num2 = s_sum.pop();
                    s_sum.push(num2 - num1);
                    //qDebug()<< num2 <<" " << num1 << " " <<num2-num1;
                    break;
                case '*':
                    num1 = s_sum.pop();
                    num2 = s_sum.pop();
                    s_sum.push(num2 * num1);
                    //qDebug()<< num2 <<" " << num1 << " " <<num2*num1;
                    break;
                case '/':
                    num1 = s_sum.pop();
                    num2 = s_sum.pop();
                    s_sum.push(num2 / num1);
                    //qDebug()<< num2 <<" " << num1 << " " <<num2/num1;
                    break;
                }
            }
        }

    }

    int res = s_sum.pop();
    //qDebug()<< 4+(8-2*3)+9/5;
    ui->lineEdit->setText(QString::number(res));
    expression.clear();
  • 循环结束的条件:中缀表达式遍历完成并且运算符栈为空
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值