使用qt实现四则运算计算机项目

这是我们要包含的头文件

#include <QWidget>
#include<QStack>
#include<string.h>
#include<string>

这是我在ui界面创建的计算机基础框架。

接下来要实现按住每个按钮在白框内显示;

因此我们要定义一个QString 类型的变量 

QString expression;

接下来是我对每个按钮的实现

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

 C键的实现

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

先对expression清空,再清空白框。

删除键的实现

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

使用chop可以吃掉最后一个。

以下是最难的一个件,=键

这里的代码使用了我之前用栈实现四则运算的代码。

char str[128]={0};

 先定义一个char *类型

qstrcpy(str, expression.toUtf8().data());

使用这个可以把QString类型转换为char*类型

以下就是实现步骤

思路就是创建一个操作符栈,数字栈。

如果该操作符的优先级高于栈顶的操作符,则该操作符入栈。

否则栈顶的操作符出栈,并把数字栈的前两个数字出栈运算。

再把结果放入数字栈。

float n1, n2, tmp = 0;
    int  priority;
    char op;
    QStack<float> numS;
    QStack<char> opS;
    int mylength=strlen(str);
    for (int i = 0; i <mylength ; i++)
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            tmp = tmp * 10 + float(str[i] - '0');
        }
        else
        {
            numS.push(tmp);
            priority = getpriority(str[i]);
            while (!opS.empty() && priority <= getpriority(opS.top()))
            {
                op = opS.top();
                opS.pop();
                n2 = numS.top();
                numS.pop();
                n1 = numS.top();
                numS.pop();
                n1 = cal_one(n1, op, n2);
                numS.push(n1);
            }
            opS.push(str[i]);
            tmp = 0;
        }

    }

    // 处理最后一个数字
    numS.push(tmp);

    // 计算剩余的表达式
    while (!opS.empty())
    {
        op = opS.top();
        opS.pop();
        n2 = numS.top();
        numS.pop();
        n1 = numS.top();
        numS.pop();
        float result = cal_one(n1, op, n2);
        numS.push(result);
    }

    ui->lineEdit->setText(QString::number(numS.top()));
}

int Widget::getpriority(char ch)
{
    int priority = -1;//-1代表没有找到对应的运算符
    if (ch == '+' || ch == '-')
    {
        priority = 1;
    }
    else if(ch=='*'||ch=='/')
    {
        priority = 2;
    }
    return priority;
}
int Widget::cal_one(float n1, char op, float n2)
{
    float result = 0;
    switch (op) {
    case '+':
        result = n1 + n2;
        break;

    case '-':
        result = n1 - n2;
        break;
    case '*':
        result = n1 * n2;
        break;
    case '/':
        result = n1 / n2;
        break;
    }
    return result;
}
ui->lineEdit->setText(QString::number(numS.top()));
}

这一步可以把int类型转为QString 类型。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //按钮放图片
    QIcon con("C:\\Users\\15322\\Pictures\\Screenshots\\tt.PNG");
    ui->deletebutton->setIcon(con);
    //ui->equal->setStyleSheet("backgroup:blue");
}

 这一步可以再按钮上放图片。

一下就是结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react-router-dom v6中优雅处理404重定向问题

在基于React的单页面应用&#xff08;SPA&#xff09;中&#xff0c;使用 react-router-dom 库来管理路由是一项关键任务。当用户访问一个不存在的页面时&#xff0c;我们通常希望能够以优雅的方式处理404情况&#xff0c;从而提升用户体验。本文将探讨如何在React应用中使用re…

【算法Hot100系列】无重复字符的最长子串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python下使用Open3D

1.切记不要安装最新的python否则无法使用open3D &#xff0c;官网显示只支持python3.8-3.11 这是我安装的python版本 2.由于访问github很慢&#xff0c;所以我手动下载ply文件 https://github.com/isl-org/open3d_downloads/releases/download/20220201-data/fragment.ply 3…

Python占位符%详解:格式化字符串的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;%占位符是一种强大的工具&#xff0c;用于格式化字符串。本文将深入解析Python中占位符的使用方法&#xff0c;包括字符串格式化、数字格式化、日期格式化等多个方面。通过丰富的示例代码…

设计模式(2)--对象创建(2)--生成器

1. 意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 2. 四种角色 指挥(Director)、抽象生成器(Builder)、具体生成器(Concrete Builder)、产品(Product) 3. 优点 3.1 可以改变一个产品的内部表示(通过定义新的生成器)。 3.2 将构…

软件项目总结报告

1. 项目进度 1.1. 进度表 1.2. 总结偏差 2. 项目成本 2.1. 项目规模 2.2. 项目工作量 3. 项目质量 3.1. 评审 4. 计划偏差 5. 测试总结 5.1. 缺陷分析 5.2. 测试Bug分布统计 5.3. Bug分布图 5.4. 总结 6. 最佳实践 7. 经验教训 7.1. 项目过程管理 7.2. 合同完成度管理 7.3. 项目…

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Api…

Kibana搜索数据利器:KQL与Lucene

文章目录 一、搜索数据二、KQL查询1、字段搜索2、逻辑运算符3、通配符4、存在性检查5、括号 三、Lucene查询1、字段搜索2、逻辑运算符3、通配符4、范围搜索5、存在性检查6、括号 四、总结 一、搜索数据 默认情况下&#xff0c;您可以使用 Kibana 的标准查询语言&#xff0c;该…

如何将从GitHub上弄下来的Three.js本地官网设为中文

我们辛辛苦苦从git上面弄下来的 Three.js 本地文档 启动之后 会发现 好家伙 这鬼东西是个英文的 我们可以找到根目录下的 docs下的 index.html 然后全局搜索 language 变量声明的地方 let language你能看到是英文 那说明 它用的肯定是en 我们改成zh 我们整个文档就变成中文…

PHP在线SEO文章伪原创同义词交换工具源码

源码介绍 PHP在线SEO文章伪原创同义词交换工具源码 支持关键词提交 独立后台 1.支持文章在线伪原创功能 2.支持关键字交换预览 3.有独立背景 4.支持访客提交关键词(后台可以审核用户提交的关键词) 5.完全开源&#xff0c;支持二次开发 使用php语言独立开发utf-8编码 适合工具…

二叉搜索树的简单理解

1. 二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它…

接口测试总结及其用例设计方法整理

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

A good teacher is patient and consistent(CVPR 2022)论文解读

paper&#xff1a;Knowledge distillation: A good teacher is patient and consistent official implementation&#xff1a;https://github.com/google-research/big_vision 本文的创新点 本文没有提出新的方法&#xff0c;而是提出了一些影响蒸馏性能的关键因素&#xff…

论文润色突显研究亮点 papergpt

大家好&#xff0c;今天来聊聊论文润色突显研究亮点&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色突显研究亮点――提升论文吸引力的关键步骤 一、引言 在学术研究中&#x…

家政服务小程序预约上门,让服务更便捷

随着人们生活节奏的加快&#xff0c;家政服务行业越来越受到人们的欢迎。为了满足市场需求&#xff0c;提高服务质量&#xff0c;家政公司需要开发一款预约上门的家政服务小程序。本文将详细介绍如何制作一个预约上门的家政服务小程序。 一、登录乔拓云网后台 首先&#xff0c…

什么是接口与API接口!

今天有个朋友问我什么接口&#xff1f;你们平时都说在写接口&#xff0c;写的是什么鬼啊&#xff1f;我一开始就想&#xff0c;咦小陈同学怎么突然了解编程接口了&#xff0c;不过听到他后一个提问我知道原来他想的是API接口&#xff0c;不过被我主观意识习惯想成了编程定义上的…

DHCP--自动获取IP地址

目录 一、了解DHCP服务 1、概念 2、使用DHCP的好处 3、DHCP的分配方式 二、DHCP的租约过程 1、客户机请求IP地址 2、服务器响应 3、客户机选择IP地址 4、服务器确定租约 5、服务器租约期限到了之后续期问题 6、总结 三、部署DHCP实验 1、项目要求 2、规划设计 …

Linux服务器配置免密SSH

在当今互联网时代&#xff0c;远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室&#xff0c;安全始终是首要考虑的因素。这就是为什么 SSH&#xff08;Secure Shell&#xff09;成为了网络专业人士的首选工具…

【送书活动五期】Go语言开发规范指南

今天和一个小伙伴偶尔聊了两句&#xff0c;聊到现在工作的开发语言&#xff0c;大学时接触的第一个语言应该是html&#xff0c;系统且简单的学习了前端语言&#xff0c;之后伴随着学校的课程&#xff0c;C、C#、Java都有涉及&#xff0c;然后就一直已Java为主了&#xff0c;也是…

动手学深度学习-注意力机制

10.1注意力提示 自主性注意力机制 有意识的注意力机制。非自主性注意力机制 无意识的注意力机制。 小结: 人类的注意力是有限的&#xff0c;有价值和稀缺的资源。受试者使用非自主性和自主性提示有选择的引导注意力&#xff0c;前者基于突出性&#xff0c;后者则依赖于意识。…