QT初识1st


QT实现四则运算

这里简单介绍一下思路,代码就不全放上来了。:(

(主要过于冗余了)

创建完项目后,先点击界面文件进入这个页面

在控件盒子中找到Buttons下的pushbutton,拖出后进行排列组合形成计算器的雏形,显示界面则从input Widge中拖出lineEdit,

之后给这些对象改名,方便后续操作。然后,右机这些对象,选择转到槽,回到编辑页面。

在头文件private下添加

QString expression;

之后,在除了等于号之外的槽(函数)中添加如下代码

以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));
}
}

最后看一下效果吧!


Author: T1g3r
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source T1g3r !
评论
  TOC