图形化计算器——用QT5实现带括号优先级的GUI编程计算器
程序员文章站
2024-03-22 18:56:10
...
一、 实验任务(实验题目、目的)
搞个图形化的代括号的计算器
二、 任务分析
- 假设已经有了计算器,实现按下等号的计算算法
- 学习qt
- 设置各按钮槽函数
- 将算法缝合进qt内
- 设计实现负数、小数
- 优化代码计算步骤
- Debug
- 添加计算器图标ico
- 准备发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
下一篇: Qt--计算器的实现