首页 > 其他分享 >高精度计算器-Qt版

高精度计算器-Qt版

时间:2024-12-03 21:32:39浏览次数:8  
标签:Widget clicked Qt 高精度 void ui 计算器 expression string

代码

widget.h 文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <vector>
#include <stack>
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_oneButton_clicked();

    void on_twoButton_clicked();

    void on_threeButton_clicked();

    void on_fourButton_clicked();

    void on_fiveButton_clicked();

    void on_sixButton_clicked();

    void on_sevenButton_clicked();

    void on_eightButton_clicked();

    void on_nineButton_clicked();

    void on_addButton_clicked();

    void on_subButton_clicked();

    void on_mulButton_clicked();

    void on_divButton_clicked();

    void on_zeroButton_clicked();

    void on_CButton_clicked();

    void on_backspaceButton_clicked();

    void on_equalButton_clicked();

    void on_dotButton_clicked();

private:
    Ui::Widget *ui;
    QString expression;
    stack<string> nums,op;
    QString eval();
    string add(string& a,string& b),sub(string& a,string& b),mul(string& a,string& b),div(string& a,long long b,long long& r);
    vector<int> To_vector(string& s);
    string To_string(vector<int>& A);
    bool cmp(string& a, string& b);

};
#endif // WIDGET_H

main 文件

#include "widget.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QStyleFactory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    a.setStyle(QStyleFactory::create("Fusion"));
    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "calculator_1_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    Widget w;
    w.show();
    return a.exec();
}

widget.cpp 文件

#include "widget.h"
#include "./ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("计算器");

    QFont f("仿宋", 14);
    ui->lineEdit->setFont(f);

    ui->equalButton->setShortcut(Qt::Key_Return); //设置按钮关联到Enter键
    ui->equalButton->setShortcut(Qt::Key_Enter);//将小键盘回车键与登录按钮绑定在一起
    ui->backspaceButton->setShortcut(Qt::Key_Backspace);
    ui->zeroButton->setShortcut(Qt::Key_0);
    ui->oneButton->setShortcut(Qt::Key_1);
    ui->twoButton->setShortcut(Qt::Key_2);
    ui->threeButton->setShortcut(Qt::Key_3);
    ui->fourButton->setShortcut(Qt::Key_4);
    ui->fiveButton->setShortcut(Qt::Key_5);
    ui->sixButton->setShortcut(Qt::Key_6);
    ui->sevenButton->setShortcut(Qt::Key_7);
    ui->eightButton->setShortcut(Qt::Key_8);
    ui->nineButton->setShortcut(Qt::Key_9);

    ui->addButton->setShortcut(Qt::Key_Plus);
    ui->subButton->setShortcut(Qt::Key_Minus);
    ui->mulButton->setShortcut(Qt::Key_Asterisk);
    ui->divButton->setShortcut(Qt::Key_Slash);

    ui->lineEdit->setReadOnly(true); // 设置为只读状态
    // ui->lineEdit->setFont(QFont("0",16));
}

Widget::~Widget()
{
    delete ui;
}

vector<int> Widget::To_vector(string& s) {
    vector<int> A;
    for (int i = s.size() - 1; i >= 0; i--) A.push_back(s[i] - '0');
    return A;
}

string Widget::To_string(vector<int>& A) {
    string s;
    for (int i = A.size() - 1; i >= 0; i--) s += '0' + A[i];
    return s;
}

// 比较a,b大小
bool Widget::cmp(string& a, string& b) {
    if (a.size() == b.size()) {
        for (int i = 0; i <= a.size() - 1; i++) {
            if (a[i] != b[i]) return a[i] > b[i];
        }
        return true;
    }
    else return a.size() > b.size();
}

string Widget::sub(string& a, string& b) {
    if (!cmp(a, b)) return ("-" + sub(b, a));
    vector<int> A = To_vector(a), B = To_vector(b), C;
    int t = 0;
    for (int i = 0; i < A.size(); i++) {
        t = t + A[i];
        if (i < B.size()) t = t - B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = -1;
        else t = 0;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return To_string(C);
}

string Widget::add(string& a, string& b) {
    vector<int> A = To_vector(a), B = To_vector(b);
    vector<int> C(max(A.size(), B.size()) + 10, 0);
    for (int i = 0; i < A.size(); i++) C[i] += A[i];
    for (int i = 0; i < B.size(); i++) C[i] += B[i];
    for (int i = 0; i < C.size(); i++) {
        C[i + 1] += C[i] / 10;
        C[i] = C[i] % 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return To_string(C);
}

string Widget::mul(string& a, string& b) {
    vector<int> A = To_vector(a), B = To_vector(b);
    vector<int> C(A.size() + B.size() + 10, 0);
    for (int i = 0; i < A.size(); i++) {
        for (int j = 0;j < B.size();j++) {
            C[i + j] += A[i] * B[j];                  //+=
        }
    }
    for (int i = 0; i + 1 < C.size(); i++) {
        C[i + 1] += C[i] / 10;                        //+=
        C[i] = C[i] % 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return To_string(C);
}

// r是余数
string Widget::div(string& a, long long b, long long& r) {
    vector<int> A = To_vector(a), C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i--) {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r = r % b;
    }
    reverse(C.begin(), C.end());
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return To_string(C);
}

QString Widget::eval(){
    string s=expression.toStdString(),firstnum,secondnum,outcome,option;
    long long r;
    for(char c:s){
        if(c=='+'||c=='-'||c=='*'||c=='/'){
            option += c;
            continue;
        }
        if(option.size()) secondnum += c;
        else firstnum += c;
    }

    if(secondnum.size()==0) return QString::fromStdString(firstnum);

    if(option == "+") outcome=Widget::add(firstnum,secondnum);
    if(option == "-") outcome=Widget::sub(firstnum,secondnum);
    if(option == "*") outcome=Widget::mul(firstnum,secondnum);
    if(option == "/") outcome=Widget::div(firstnum,stoll(secondnum),r);

    return QString::fromStdString(outcome);
}

void Widget::on_zeroButton_clicked()
{
    expression += "0";
    ui->lineEdit->setText(expression);
}

void Widget::on_oneButton_clicked()
{
    expression += "1";
    ui->lineEdit->setText(expression);
}


void Widget::on_twoButton_clicked()
{
    expression += "2";
    ui->lineEdit->setText(expression);
}


void Widget::on_threeButton_clicked()
{
    expression += "3";
    ui->lineEdit->setText(expression);
}


void Widget::on_fourButton_clicked()
{
    expression += "4";
    ui->lineEdit->setText(expression);
}


void Widget::on_fiveButton_clicked()
{
    expression += "5";
    ui->lineEdit->setText(expression);
}


void Widget::on_sixButton_clicked()
{
    expression += "6";
    ui->lineEdit->setText(expression);
}


void Widget::on_sevenButton_clicked()
{
    expression += "7";
    ui->lineEdit->setText(expression);
}


void Widget::on_eightButton_clicked()
{
    expression += "8";
    ui->lineEdit->setText(expression);
}


void Widget::on_nineButton_clicked()
{
    expression += "9";
    ui->lineEdit->setText(expression);
}

void Widget::on_dotButton_clicked()
{
    expression += ".";
    ui->lineEdit->setText(expression);
}

void Widget::on_addButton_clicked()
{
    expression = eval() + "+";
    ui->lineEdit->setText(expression);
}


void Widget::on_subButton_clicked()
{
    expression = eval() + "-";
    ui->lineEdit->setText(expression);
}


void Widget::on_mulButton_clicked()
{
    expression = eval() + "*";
    ui->lineEdit->setText(expression);
}


void Widget::on_divButton_clicked()
{
    expression = eval() + "/";
    ui->lineEdit->setText(expression);
}

void Widget::on_CButton_clicked()
{
    expression.clear();
    ui->lineEdit->setText(expression);
}

void Widget::on_backspaceButton_clicked()
{
    expression.chop(1);
    ui->lineEdit->setText(expression);
}

void Widget::on_equalButton_clicked()
{
    expression = eval();
    ui->lineEdit->setText(expression);
}

calculator_1_zh_CN.ts 文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN"></TS>

widget 文件


标签:Widget,clicked,Qt,高精度,void,ui,计算器,expression,string
From: https://www.cnblogs.com/pugong/p/18585097

相关文章

  • 基于STM的环境监测系统(节点+云服务器存储+QT界面设计)
    文章目录1.项目简介2.项目成果展示3.源码及软件资源获取4.项目文章更新1.项目简介本项目实现的是环境监测系统,包括节点数据采集,云服务器部署,以及QT上位机界面设计,具体框图可见下图节点端:采用STM32控制芯片,结合各类传感器实现对环境中气体数据的采集,连接oled屏进......
  • 如何在C语言中制作一个计算器
    喜大普奔啊,100粉丝了,上次说的计算器来喽^V^主播一点没鸽(哇,这也太高产了吧),感谢大家的陪伴立一个flag,1000粉丝的时候制作一个图画送给大家^V^正文:简易计算机要求1、打印欢迎界面。2、提醒用户输入参与运算的两个数字,以及运算符号,根据运算符号输出结果。3、询问用户是否继......
  • shell编程作业,获取ipv4的地址+crontab定时任务+无限重启Linux+⽤Shell写⼀个计算器+⽤
    公众号:泷羽Sec-尘宇安全声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击......
  • QT导入Eigen库
    QT导入Eigen库环境Win10QTCreator13.0.2MinGW5.15.2下载压缩包编译直接用qt打开解压缩的文件,打开CMakeLists.txt,编译成功后直接把整个文件夹放在工程中使用即可我放在了我工程中的module里面了原工程Cmake文件修改CMakeLists.txt文件添加包含点击查看代码include_......
  • 就是这个样的粗爆,手搓一个计算器:跑步卡路里计算器
      线上运行,可以直接打开:跑步卡路里计算器(在线计算器)    作为程序员,没有合适的工具,就得手搓一个,PC端,移动端均可适用。废话不多说,直接上代码。HTML:<divclass="calculator"><divclass="input-group"><labelfor="weight">体重(kg):</label><inputid="weight......
  • Qt nativeEvent 不触发/不执行/无效
    在做触摸屏项目的时候,各种控件都需要实现监听/触发点击事件,通常是通过信号/槽、事件过滤器(eventFilter)、重写mousePressEvent。发现在QSpinBox中点击编辑框时不会触发任何鼠标相关点击事件。 查资料发现通过重写nativeEvent函数可以拿到鼠标相关事件,不过有一个坑需要注意,需要......
  • Qt常用图表: 折线图_柱形图_饼状图
    折线图#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);this->setWindowTitle(QStringLiteral("我自定义的标题"));//调用此函数m......
  • QT C++ 解决调试运行时报 The inferior stopped 错误
    (1)报错信息和报错时调用堆栈SignaIReceived-QtCreatorTheinferiorstoppedbecauseitreceivedasignalfromtheoperatingsystem.Signalname:SIGSEGVSignalmeaning:Segmentationfault报错时调用堆栈停留在voidMyTableView::setModel()函数的该行:报错时调用堆栈......
  • PAT-程序设计(基础级)数字命理计算器
    解题思路:在每一轮字符串输入中,使用字符数组存储每一行字符串,并从字符串首进行遍历,对每一位字母进行数字转换,并对数字求和,求完总和之后的数字再进行条件判断,若不为题目要求的命理数,就对求和总数进行各位数字相加,直到出现命理数,输出即可。代码实现如下:#include<stdio.h>#inc......
  • Qt Design Studio入门3D项目设计
    一、QtDesignStudio3D设计的优势QtDesignStudio是一个专注于创建高性能用户界面(UI)的设计工具,它在设计3D界面方面具有一下显著优势:1、一体化工作流**1)设计与开发无缝集成:**设计师和开发者可以在同一环境中协作,无需反复转换文件格式或工具。**2)支持QtQuick和3D:*......