高精度计算器-Qt版

news/2025/2/6 21:49:55/文章来源:https://www.cnblogs.com/pugong/p/18585097

代码

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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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 文件


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Power Automate 获取用户属性

前言最近,要在项目里需要获取用户的属性正文在Power Automate里有个Office 365 Users,里面有Action可以获取用户属性执行的结果,可以获取到很多属性,当然,这里都是默认的,如果想要更多的属性,在Select fields里添加就可以了。结束语想要其它的属性,参考官网就可以了。u…

JavaSwing 事件处理

1. 事件类型 2. ActionListenera:如果同一个组件添加了多个监听器,则每个监听器都会被执行, 后添加监听器会先被执行!b: 同一个监听器对象,可以监听多个组件!try{BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;o…

C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第11周学习总结

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第11周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十一周作业这个作业的目标 <1.学习计算机科学概论第15,16章 并完成云班课测…

牛客周赛 Round 70 个人题解

牛客周赛 Round 70 个人题解 (A~G) 牛客周赛 Round 70 A. 小苯晨跑 #include<bits/stdc++.h> #define endl \n using namespace std; void solve(){int a,b,c,d;cin>>a>>b>>c>>d;if(a==b && b==c && c==d){cout<<"NO…

2024/12/3 【哈希表】

https://www.programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%89%E7%A7%8D%E5%93%88%E5%B8%8C%E7%BB%93%E6%9E%84 哈希表(Hash table)也称为散列表。 一. 哈希表是什么? 哈希表是根据关键码的…

基于GA遗传算法的PID控制器参数优化matlab建模与仿真

1.程序功能描述基于GA遗传算法的PID控制器参数优化,对比GA优化前后的PID控制器的控制曲线。 2.测试软件版本以及运行结果展示本程序和本人之前写的《基于GA遗传优化的PID控制器最优控制参数整定matlab仿真_ga-pid-CSDN博客》 区别是:之前的控制对象采用的是差分方程实现的,G…

基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要在现代无线通信系统中,多输入多输出(Multiple-Input Multiple-Output, MIMO)技术是提高频谱效率和数据传输速率的关键。然而,随着天线数量…

E86 换根DP CF1324F Maximum White Subtree

视频链接: Maximum White Subtree - 洛谷 | 计算机科学教育新生态// 换根DP O(n) #include <bits/stdc++.h> using namespace std;const int N=200005; vector<int> e[N]; int n,a[N],f[N];void dfs(int u,int fa){f[u]=a[u];for(auto v:e[u]){if(v==fa)continu…

【Azure Developer】分享一段Python代码调用Graph API创建用户的示例

问题描述 在Azure门户(Create new user - Microsoft Azure 由世纪互联运营)中添加新用户,如果想通过代码来实现,有没有示例代码参考呢?问题解答 示例代码from azure.identity import AzureAuthorityHosts from azure.identity.aio import ClientSecretCredential from kiota…

Cocos creator制作透明背景桌面宠物

Cocos creator制作透明背景桌面宠物 目录Cocos creator制作透明背景桌面宠物来源前言验证可使用版本打包方案实现1、electron-js中main.js设置2、Cocos creator中宏配置3、Cocos creator中Canvas设置4、Cocos creator构建Web移动端5、修改Web移动端style.css6、使用electron-js…

【数据结构】 字典树trie详解

定义: 将多个字符串以树的方式存储即为字典树,如图,\(1,4,3,12\) 表示 \(cca\) ,我么用 \(ch[i][j]\) 来表示第 \(i\) 个节点的 \(j\) 字符所指向的下一个节点,\(tag[u]\) 表示节点 \(u\) 是否代表一个字符串的结尾,如果是的话,\(tag[u]=1\)。模板CODE 添加字符串 //n表…