主要使用Qt Creator设计计算器,方法采用中缀表达式转后缀表达式;
main.h#include "Widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
QString result;//保存结果
QString hold;//保存记录
int priority(QChar p);//设置运算符优先级
void resolve();//取得后缀表达式result
QString solution();//求解
QString calculation(double val1,double val2,QChar op);//两个数的运算
int digit(int val);
~Widget();
public slots:
void add(QString temp);//用于从按键添加符号,和更新poly
private:
Ui::Widget *ui;
QString poly;//保存多项式
};
#endif // WIDGET_H
Widget.cpp主要代码
中缀转后缀
void Widget::resolve(){
QStack ret;
for(int i=0;i < poly.length();i++){
if(poly[i] == "(")
{//如果是"("直接入栈
ret.push(poly[i]);
if(poly[(++i)--] == "-")
{
result.push_back("0 ");
}
continue;
}
if(priority(poly[i]) == 4)
{//如果遇到了右括号,则直到遇到左括号位置,将栈中元素全部出栈到result
while(ret.top() != "("){
result.push_back(ret.pop());
}
if(ret.top() == "("){
ret.pop();
}
continue;
}
if(ret.isEmpty() && (priority(poly[i]) != 0))
{//如果栈为空,且为符号,则入栈
if((poly[i] == "-") && (result.isEmpty()))
{//负数补0
result.push_back("0 ");
}
ret.push(poly[i]);
continue;
}
if((!ret.isEmpty()) && (priority(poly[i]) != 0) && (priority(ret.top()) < priority(poly[i])) && poly[i] != ")")
{//如果字符串中的优先级大于,栈中字符的优先级,则入栈
ret.push(poly[i]);
continue;
}
if((!ret.isEmpty()) && (priority(poly[i]) != 0) && (priority(ret.top()) >= priority(poly[i])))
{//如果小于等于,则出栈,入result
result.push_back(ret.pop());
while ((!ret.isEmpty()) && (priority(ret.top()) >= priority(poly[i]))) {
result.push_back(ret.pop());
}
ret.push(poly[i]);
continue;
}
if(poly[i] == "=")
{//poly结束后,将栈中元素全部弹出到result,并结束循环
int j=ret.length();
for(int i=0;i < j;i++){
result.push_back(ret.pop());
}
break;
}
if((poly[i] != ")") && (priority(poly[i]) == 0))
{//如果是数字,则直接入result
result.push_back(poly[i]);
while((priority(poly[++i]) == 0) && poly[i] != "="){
result.push_back(poly[i]);
}
result.push_back(" ");
--i;
continue;
}
}
}
优先级的判断
int Widget::priority(QChar p)
{//优先级的判断
if(p=="+"){
return 1;
}
if(p=="-"){
return 1;
}
if(p=="*"){
return 2;
}
if(p=="/"){
return 2;
}
if(p=="/0"){
return 3;
}
if(p==")"){
return 4;
}
return 0;
}
后缀表达式求解
QString Widget::solution(){
resolve();
QStack ret;
for(int i=0;i
计算器界面及其各个按键功能
connect(ui->pushButton_0,&QPushButton::clicked,[this](){add("0");});
connect(ui->pushButton_1,&QPushButton::clicked,[this](){add("1");});
connect(ui->pushButton_2,&QPushButton::clicked,[this](){add("2");});
connect(ui->pushButton_3,&QPushButton::clicked,[this](){add("3");});
connect(ui->pushButton_4,&QPushButton::clicked,[this](){add("4");});
connect(ui->pushButton_5,&QPushButton::clicked,[this](){add("5");});
connect(ui->pushButton_6,&QPushButton::clicked,[this](){add("6");});
connect(ui->pushButton_7,&QPushButton::clicked,[this](){add("7");});
connect(ui->pushButton_8,&QPushButton::clicked,[this](){add("8");});
connect(ui->pushButton_9,&QPushButton::clicked,[this](){add("9");});
//括号
connect(ui->pushButton_left,&QPushButton::clicked,[this](){add("(");});
connect(ui->pushButton_right,&QPushButton::clicked,[this](){add(")");});
//符号
connect(ui->pushButton_add,&QPushButton::clicked,[this](){add("+");});
connect(ui->pushButton_sub,&QPushButton::clicked,[this](){add("-");});
connect(ui->pushButton_mul,&QPushButton::clicked,[this](){add("*");});
connect(ui->pushButton_div,&QPushButton::clicked,[this](){add("/");});
connect(ui->pushButton_dot,&QPushButton::clicked,[this](){add(".");});
//退格
connect(ui->pushButton_del,&QPushButton::clicked,[this](){
poly.remove(poly.length()-1,1);
ui->lineEdit->setText(poly);
});
//清空
connect(ui->pushButton_C,&QPushButton::clicked,[this](){
poly.clear();
ui->lineEdit->setText(poly);
});
//等号
connect(ui->pushButton_equal,&QPushButton::clicked,[this](){
add("=");
poly = solution();
result.clear();
ui->lineEdit->setText(poly);
});
//lineEdit_2用于保存记录
connect(ui->pushButton_history,&QPushButton::clicked,[this](){
ui->lineEdit_2->setText(hold += poly);
ui->lineEdit_2->setText(hold = poly + ";" );
});
}
成果展示
void Widget::resolve(){
QStack ret;
for(int i=0;i < poly.length();i++){
if(poly[i] == "(")
{//如果是"("直接入栈
ret.push(poly[i]);
if(poly[(++i)--] == "-")
{
result.push_back("0 ");
}
continue;
}
if(priority(poly[i]) == 4)
{//如果遇到了右括号,则直到遇到左括号位置,将栈中元素全部出栈到result
while(ret.top() != "("){
result.push_back(ret.pop());
}
if(ret.top() == "("){
ret.pop();
}
continue;
}
if(ret.isEmpty() && (priority(poly[i]) != 0))
{//如果栈为空,且为符号,则入栈
if((poly[i] == "-") && (result.isEmpty()))
{//负数补0
result.push_back("0 ");
}
ret.push(poly[i]);
continue;
}
if((!ret.isEmpty()) && (priority(poly[i]) != 0) && (priority(ret.top()) < priority(poly[i])) && poly[i] != ")")
{//如果字符串中的优先级大于,栈中字符的优先级,则入栈
ret.push(poly[i]);
continue;
}
if((!ret.isEmpty()) && (priority(poly[i]) != 0) && (priority(ret.top()) >= priority(poly[i])))
{//如果小于等于,则出栈,入result
result.push_back(ret.pop());
while ((!ret.isEmpty()) && (priority(ret.top()) >= priority(poly[i]))) {
result.push_back(ret.pop());
}
ret.push(poly[i]);
continue;
}
if(poly[i] == "=")
{//poly结束后,将栈中元素全部弹出到result,并结束循环
int j=ret.length();
for(int i=0;i < j;i++){
result.push_back(ret.pop());
}
break;
}
if((poly[i] != ")") && (priority(poly[i]) == 0))
{//如果是数字,则直接入result
result.push_back(poly[i]);
while((priority(poly[++i]) == 0) && poly[i] != "="){
result.push_back(poly[i]);
}
result.push_back(" ");
--i;
continue;
}
}
}
优先级的判断
int Widget::priority(QChar p)
{//优先级的判断
if(p=="+"){
return 1;
}
if(p=="-"){
return 1;
}
if(p=="*"){
return 2;
}
if(p=="/"){
return 2;
}
if(p=="/0"){
return 3;
}
if(p==")"){
return 4;
}
return 0;
}
后缀表达式求解
QString Widget::solution(){
resolve();
QStack ret;
for(int i=0;i
计算器界面及其各个按键功能
connect(ui->pushButton_0,&QPushButton::clicked,[this](){add("0");});
connect(ui->pushButton_1,&QPushButton::clicked,[this](){add("1");});
connect(ui->pushButton_2,&QPushButton::clicked,[this](){add("2");});
connect(ui->pushButton_3,&QPushButton::clicked,[this](){add("3");});
connect(ui->pushButton_4,&QPushButton::clicked,[this](){add("4");});
connect(ui->pushButton_5,&QPushButton::clicked,[this](){add("5");});
connect(ui->pushButton_6,&QPushButton::clicked,[this](){add("6");});
connect(ui->pushButton_7,&QPushButton::clicked,[this](){add("7");});
connect(ui->pushButton_8,&QPushButton::clicked,[this](){add("8");});
connect(ui->pushButton_9,&QPushButton::clicked,[this](){add("9");});
//括号
connect(ui->pushButton_left,&QPushButton::clicked,[this](){add("(");});
connect(ui->pushButton_right,&QPushButton::clicked,[this](){add(")");});
//符号
connect(ui->pushButton_add,&QPushButton::clicked,[this](){add("+");});
connect(ui->pushButton_sub,&QPushButton::clicked,[this](){add("-");});
connect(ui->pushButton_mul,&QPushButton::clicked,[this](){add("*");});
connect(ui->pushButton_div,&QPushButton::clicked,[this](){add("/");});
connect(ui->pushButton_dot,&QPushButton::clicked,[this](){add(".");});
//退格
connect(ui->pushButton_del,&QPushButton::clicked,[this](){
poly.remove(poly.length()-1,1);
ui->lineEdit->setText(poly);
});
//清空
connect(ui->pushButton_C,&QPushButton::clicked,[this](){
poly.clear();
ui->lineEdit->setText(poly);
});
//等号
connect(ui->pushButton_equal,&QPushButton::clicked,[this](){
add("=");
poly = solution();
result.clear();
ui->lineEdit->setText(poly);
});
//lineEdit_2用于保存记录
connect(ui->pushButton_history,&QPushButton::clicked,[this](){
ui->lineEdit_2->setText(hold += poly);
ui->lineEdit_2->setText(hold = poly + ";" );
});
}
成果展示



