cpp基于QT实现有友好界面,其中界面含有加、减、乘、除、取模、乘方、开方、取反、括号、数字等按钮,点击按钮可以实现相应的功能,且支持括号优先级处理的计算器
时间: 2023-10-14 15:04:48 浏览: 112
基于QT(C++)实现加、减、乘、除括号混合运算计算器【100010627】
好的,这个任务可以分成两个部分来完成:QT界面的设计和计算器逻辑的实现。下面我会分别介绍一下。
首先是QT界面的设计。我们可以使用QT Creator来完成这个任务。具体步骤如下:
1. 打开QT Creator,选择“File”->“New File or Project”,选择“Qt Widget Application”。
2. 在“Choose Project”对话框中,输入项目名称和保存路径,然后点击“Next”。
3. 在“Class Information”对话框中,选择“Main Window”,然后点击“Next”。
4. 在“Design Form”对话框中,选择“Create form”,然后选择“Main Window Form”,然后点击“Finish”。
5. 在QT Designer中,我们可以添加需要的按钮和标签等控件,然后设置它们的属性和信号槽即可。具体的界面设计可以根据自己的需求来完成。
接下来是计算器逻辑的实现。我们可以使用C++来完成这个任务。具体步骤如下:
1. 定义一个类来表示计算器,这个类应该包含一个字符串类型的表达式,以及一些方法来对表达式进行计算。
2. 实现一个方法来将中缀表达式转换成后缀表达式,这个方法可以使用栈来实现。
3. 实现一个方法来计算后缀表达式,这个方法可以使用栈来实现。
4. 实现一个方法来处理表达式中的括号,这个方法可以使用递归来实现。
5. 实现一个方法来处理表达式中的乘方和开方,这个方法可以使用数学库中的函数来实现。
6. 实现一个方法来处理表达式中的取反,这个方法可以使用负号来实现。
7. 实现一个方法来处理表达式中的取模,这个方法可以使用取余运算符来实现。
8. 实现一个方法来计算表达式的值,这个方法可以调用前面实现的方法来完成。
完成以上步骤后,我们就可以将计算器逻辑和QT界面结合起来了。具体的实现步骤可以参考以下代码:
```c++
#include <QMainWindow>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QDebug>
class Calculator : public QMainWindow {
Q_OBJECT
public:
Calculator(QWidget *parent = 0) : QMainWindow(parent) {
setWindowTitle("Calculator");
setFixedSize(300, 200);
m_lineEdit = new QLineEdit(this);
m_lineEdit->setAlignment(Qt::AlignRight);
m_lineEdit->setReadOnly(true);
QGridLayout *layout = new QGridLayout;
QStringList buttons;
buttons << "C" << "()" << "^" << "sqrt"
<< "7" << "8" << "9" << "/"
<< "4" << "5" << "6" << "*"
<< "1" << "2" << "3" << "-"
<< "0" << "." << "+/-" << "+"
<< "%" << "=";
for (int i = 0; i < buttons.size(); ++i) {
QPushButton *button = new QPushButton(buttons[i], this);
connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
layout->addWidget(button, i / 4, i % 4);
}
setLayout(layout);
m_exp = "";
m_result = 0;
}
public slots:
void buttonClicked() {
QString text = ((QPushButton *)sender())->text();
if (text == "C") {
m_exp = "";
m_lineEdit->clear();
} else if (text == "=") {
if (m_exp.isEmpty())
return;
try {
m_result = eval(m_exp);
m_lineEdit->setText(QString::number(m_result));
m_exp = QString::number(m_result);
} catch (std::exception &e) {
m_lineEdit->setText("Error");
m_exp = "";
}
} else {
m_exp += text;
m_lineEdit->setText(m_exp);
}
}
private:
QLineEdit *m_lineEdit;
QString m_exp;
double m_result;
bool isDigit(char c) {
return c >= '0' && c <= '9';
}
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^';
}
int priority(char c) {
if (c == '+' || c == '-')
return 1;
if (c == '*' || c == '/' || c == '%')
return 2;
if (c == '^' || c == 's')
return 3;
if (c == 'c')
return 4;
return 0;
}
double applyOp(double a, double b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b == 0)
throw std::runtime_error("division by zero");
return a / b;
case '%':
return static_cast<int>(a) % static_cast<int>(b);
case '^':
return pow(a, b);
case 's':
return sqrt(b);
case 'c':
return pow(b, 2);
default:
return 0;
}
}
double eval(const QString &exp) {
std::stack<double> values;
std::stack<char> ops;
for (int i = 0; i < exp.size(); ++i) {
if (exp[i] == ' ')
continue;
else if (isDigit(exp[i])) {
double val = 0;
int j = i;
while (j < exp.size() && isDigit(exp[j]))
val = val * 10 + (exp[j++] - '0');
i = j - 1;
values.push(val);
} else if (exp[i] == '(') {
ops.push(exp[i]);
} else if (exp[i] == ')') {
while (!ops.empty() && ops.top() != '(') {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, op));
}
if (!ops.empty())
ops.pop();
} else {
while (!ops.empty() && priority(ops.top()) >= priority(exp[i])) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, op));
}
ops.push(exp[i]);
}
}
while (!ops.empty()) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, op));
}
return values.top();
}
};
```
这个代码实现了一个简单的计算器,支持加、减、乘、除、取模、乘方、开方、取反、括号、数字等按钮,点击按钮可以实现相应的功能,且支持括号优先级处理的计算器。
希望这个回答能够帮助到你!
阅读全文