QT实现四则运算 这里简单介绍一下思路,代码就不全放上来了。:(
(主要过于冗余了)
一
创建完项目后,先点击界面文件进入这个页面
在控件盒子中找到Buttons下的pushbutton,拖出后进行排列组合形成计算器的雏形,显示界面则从input Widge中拖出lineEdit,
之后给这些对象改名,方便后续操作。然后,右机这些对象,选择转到槽,回到编辑页面。
二 在头文件private下添加
之后,在除了等于号之外的槽(函数)中添加如下代码
以1举例
void Widget::on_oneButton_clicked () { expression += "1" ; ui->mainlineEdit->setText (expression); }
当然,肯定有更好的方法,但是作为初学者,我就先以能运行为目的:(
三 至于等于号嘛
用到的算法有点复杂(实在不行就问问ai吧)
我也是通过ai加自己修改完成的:(
这里就直接放上来吧:0
QString Widget::infixToPostfix (const QString &expression) { QStack<QChar> stack; QString postfix; unordered_map<QChar, int > precedence = { {'+' , 1 }, {'-' , 1 }, {'*' , 2 }, {'/' , 2 }, {'(' , 0 }, {')' , 0 } }; for (int i = 0 ; i < expression.size (); ++i) { QChar c = expression[i]; if (c.isDigit () || c == '.' ) { int j = i; while (j < expression.size () && (expression[j].isDigit () || expression[j] == '.' )) { postfix.append (expression[j]); j++; } postfix.append (' ' ); i = j - 1 ; } else if (c == '(' ) { stack.push (c); } else if (c == ')' ) { while (!stack.isEmpty () && stack.top () != '(' ) { postfix.append (stack.pop ()); postfix.append (' ' ); } stack.pop (); } else if (precedence.count (c)) { while (!stack.isEmpty () && precedence[stack.top ()] >= precedence[c]) { postfix.append (stack.pop ()); postfix.append (' ' ); } stack.push (c); } } while (!stack.isEmpty ()) { postfix.append (stack.pop ()); postfix.append (' ' ); } return postfix.simplified (); }
double calculate (const QString &postfix) { QStack<double > stack; qDebug () << "Calculating postfix:" << postfix; QStringList tokens = postfix.split (' ' ); for (const QString &token : tokens) { if (token.isEmpty ()) { continue ; } bool ok; double num = token.toDouble (&ok); if (ok) { stack.push (num); qDebug () << "Pushed number:" << num; } else { if (stack.size () < 2 ) { qDebug () << "Error: Less than two operands for operator" << token; return NAN; } double b = stack.pop (); double a = stack.pop (); double result; if (token == "+" ) { result = a + b; } else if (token == "-" ) { result = a - b; } else if (token == "*" ) { result = a * b; } else if (token == "/" ) { if (b == 0 ) { qDebug () << "Error: Division by zero" ; return NAN; } result = a / b; } else { qDebug () << "Error: Unknown operator" << token; return NAN; } stack.push (result); qDebug () << "Pushed result:" << result; } } if (stack.size () != 1 ) { qDebug () << "Error: Postfix expression has" << stack.size () << "values left" ; return NAN; } double finalResult = stack.pop (); qDebug () << "Final result:" << finalResult; return finalResult; }
void Widget::on_equalButton_clicked () { QString input = ui->mainlineEdit->text (); QString postfix = infixToPostfix (input); double result = calculate (postfix); if (isnan (result)) { ui->mainlineEdit->setText ("Error" ); } else { ui->mainlineEdit->setText (QString::number (result)); } }
四 最后看一下效果吧!