cpp基于QT实现含有加、减、乘、除、取模、乘方、开方、取反、支持括号优先级处理的计算器
时间: 2023-09-16 21:16:22 浏览: 65
以下是基于QT的C++代码实现一个简单的计算器,支持加、减、乘、除、取模、乘方、开方、取反、支持括号优先级处理。
```cpp
#include <QCoreApplication>
#include <QString>
#include <QDebug>
#include <QStack>
#include <QRegExp>
#include <cmath>
//计算器类
class Calculator
{
public:
Calculator() {}
~Calculator() {}
//计算表达式
QString calculate(QString exp);
private:
//操作符优先级判断函数
int priority(char op);
//计算函数
double calc(double num1, double num2, char op);
//判断是否为数字函数
bool isDigit(QChar c);
//判断是否为操作符函数
bool isOperator(QChar c);
//判断是否为左括号函数
bool isLeftBracket(QChar c);
//判断是否为右括号函数
bool isRightBracket(QChar c);
//表达式格式化函数
QString format(QString exp);
//计算后缀表达式函数
double calculatePostfix(QString postfixExp);
private:
//操作符栈
QStack<char> m_operStack;
//数字栈
QStack<double> m_numStack;
};
//操作符优先级判断函数
int Calculator::priority(char op)
{
int priority = -1;
switch (op)
{
case '+':
case '-':
priority = 1;
break;
case '*':
case '/':
case '%':
priority = 2;
break;
case '^':
case 's':
priority = 3;
break;
case '(':
priority = 0;
break;
default:
break;
}
return priority;
}
//计算函数
double Calculator::calc(double num1, double num2, char op)
{
double result = 0.0;
switch (op)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '%':
result = fmod(num1, num2);
break;
case '^':
result = pow(num1, num2);
break;
case 's':
result = sqrt(num2);
break;
default:
break;
}
return result;
}
//判断是否为数字函数
bool Calculator::isDigit(QChar c)
{
QRegExp regExp("\\d");
return regExp.exactMatch(QString(c));
}
//判断是否为操作符函数
bool Calculator::isOperator(QChar c)
{
QRegExp regExp("[+\\-*/%^s]");
return regExp.exactMatch(QString(c));
}
//判断是否为左括号函数
bool Calculator::isLeftBracket(QChar c)
{
return c == '(';
}
//判断是否为右括号函数
bool Calculator::isRightBracket(QChar c)
{
return c == ')';
}
//表达式格式化函数
QString Calculator::format(QString exp)
{
QString formatExp;
for (int i = 0; i < exp.size(); i++)
{
QChar c = exp.at(i);
if (isDigit(c))
{
formatExp.append(c);
if (i == exp.size() - 1)
{
formatExp.append(' ');
}
else if (!isDigit(exp.at(i + 1)))
{
formatExp.append(' ');
}
}
else if (isOperator(c))
{
formatExp.append(c);
formatExp.append(' ');
}
else if (isLeftBracket(c))
{
m_operStack.push(c);
}
else if (isRightBracket(c))
{
while (!m_operStack.empty() && !isLeftBracket(m_operStack.top()))
{
formatExp.append(m_operStack.top());
formatExp.append(' ');
m_operStack.pop();
}
if (!m_operStack.empty() && isLeftBracket(m_operStack.top()))
{
m_operStack.pop();
}
}
}
while (!m_operStack.empty())
{
formatExp.append(m_operStack.top());
formatExp.append(' ');
m_operStack.pop();
}
return formatExp;
}
//计算后缀表达式函数
double Calculator::calculatePostfix(QString postfixExp)
{
int i = 0;
while (i < postfixExp.size())
{
QChar c = postfixExp.at(i);
if (isDigit(c))
{
double num = 0.0;
QString numStr;
while (i < postfixExp.size() && isDigit(postfixExp.at(i)))
{
numStr.append(postfixExp.at(i));
i++;
}
num = numStr.toDouble();
m_numStack.push(num);
}
else if (isOperator(c))
{
double num1 = m_numStack.pop();
double num2 = m_numStack.pop();
double result = calc(num2, num1, c.toLatin1());
m_numStack.push(result);
i++;
}
else
{
i++;
}
}
return m_numStack.pop();
}
//计算表达式
QString Calculator::calculate(QString exp)
{
m_operStack.clear();
m_numStack.clear();
QString formatExp = format(exp);
double result = calculatePostfix(formatExp);
return QString::number(result);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Calculator calculator;
QString exp = "10+(2*(3+4))-5^3+sqrt(81)-2%3";
qDebug() << calculator.calculate(exp);
return a.exec();
}
```
在上述代码中,我们定义了一个 Calculator 类来实现计算器的功能。该类包含了一些成员函数,用于计算表达式、操作符优先级判断、计算、判断是否为数字、操作符、左括号和右括号、表达式格式化以及计算后缀表达式等功能。在 main 函数中,我们创建了一个 Calculator 对象,并传入一个表达式,然后调用 calculate 函数计算该表达式的结果,并将结果输出到控制台中。
该计算器支持加、减、乘、除、取模、乘方、开方、取反、支持括号优先级处理,可以处理复杂的数学表达式。