栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

计算机软件技术实习 简单计算器的实现(二)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算机软件技术实习 简单计算器的实现(二)

主要使用Qt Creator设计计算器,方法采用中缀表达式转后缀表达式;

main.h
#include "Widget.h"
#include 
int 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 + ";" );
    });

}
成果展示

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号