Qt creator实现一个简单计算器

news2024/11/26 10:23:57

目录

1 界面设计

2 思路简介

3 代码

目录

1 界面设计

​2 思路简介

3 代码

3.1 widget.h

3.2 widget.c

4 完整代码

        在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作,能实现简单的计算器功能。

1 界面设计

该计算器的界面设计如下所示:

2 思路简介

        1. 中缀表达式的构建

        将按键输入字符转换为字符串的形式。

        比如:中缀表达式3+2+34+(6-3*5);

        那么可以定义一个字符数组char Chars[1024];存储,之后使用QString::fromUtf8(this->Chars);将该字符数组转换为LineEdit可以显示的类型。

        2. 中缀表达式转变为后缀表达式

        直接按照字符将中缀转变为后缀表达式,在进行计算时,再转换为数据和符号。这里在将中缀表达式转变为后缀表达式时,把每个数都使用&进行分割,方便后续计算。比如32+21转换为后缀表达式就是32&&21+。

        3. 使用后缀表达式进行计算

3 代码

3.1 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void Fb_Change(); // 中缀转换为后缀表达式
    void Clear();
public:
    int i,j;

private slots:
    void on_but_one_clicked();

    void on_but_zero_clicked();

    void on_but_two_clicked();

    void on_but_three_clicked();

    void on_but_four_clicked();

    void on_but_five_clicked();

    void on_but_six_clicked();

    void on_but_seven_clicked();

    void on_but_eight_clicked();

    void on_but_nine_clicked();

    void on_but_add_clicked();

    void on_but_sub_clicked();

    void on_but_mul_clicked();

    void on_but_div_clicked();

    void on_but_leftbrk_clicked();

    void on_but_rightbrk_clicked();

    void on_but_cls_clicked();

    void on_but_bit_clicked();

    void on_but_eql_clicked();

    void on_but_close_clicked();

private:
    Ui::Widget *ui;
    int Data[128];    // data stack
    char suffix[128];  //  后缀表达式 stack
    char sign[128];     // 符号栈
    char Chars[1024]; // zhong缀表达式字符数组
    int data_sp = 0;  // 数据栈顶指针
    int suffix_sp = 0;  // 后缀栈顶指针
    int sign_sp = 0;    // 符号栈顶指针
    int char_sp = 0;  //
    int Operation_end = 0;  // 运算结束标志位,1:运算结束
};
#endif // WIDGET_H

3.2 widget.c

#include "widget.h"
#include "ui_widget.h"
#include "qdebug.h"

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

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


void Widget::on_but_one_clicked()
{
    this->Chars[char_sp++] = '1';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_zero_clicked()
{
    this->Chars[char_sp++] = '0';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_two_clicked()
{
    this->Chars[char_sp++] = '2';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_three_clicked()
{
    this->Chars[char_sp++] = '3';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_four_clicked()
{
    this->Chars[char_sp++] = '4';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_five_clicked()
{
    this->Chars[char_sp++] = '5';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_six_clicked()
{
    this->Chars[char_sp++] = '6';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_seven_clicked()
{
    this->Chars[char_sp++] = '7';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_eight_clicked()
{
    this->Chars[char_sp++] = '8';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_nine_clicked()
{
    this->Chars[char_sp++] = '9';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_add_clicked()
{
    this->Chars[char_sp++] = '+';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_sub_clicked()
{
    this->Chars[char_sp++] = '-';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_mul_clicked()
{
    this->Chars[char_sp++] = '*';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_div_clicked()
{
    this->Chars[char_sp++] = '/';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_leftbrk_clicked()
{
    this->Chars[char_sp++] = '(';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_rightbrk_clicked()
{
    this->Chars[char_sp++] = ')';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}

void Widget::on_but_cls_clicked()
{
    Clear();
}

void Widget::on_but_bit_clicked()
{
    if(Operation_end == 0)   // 没有运算结束
    {
        this->Chars[--char_sp] = ' ';
        Chars[char_sp] ='\0';
        ui->lineEdit->setText(QString::fromUtf8(this->Chars));
    }else {
    // 运算结束
    Clear();
    }
}

void Widget::on_but_eql_clicked()
{
    Fb_Change();
}
void Widget::Clear()
{
    this->char_sp = 0;
    ui->lineEdit->clear();
    for(i=0; i<sign_sp; i++)
    {
        this->sign[i] = ' ';
    }
    sign[0] ='\0';
    this->sign_sp = 0;
    for(i=0; i<suffix_sp; i++)
    {
        this->suffix[i] = ' ';
    }
    this->suffix_sp = 0;
    suffix[0] ='\0';

    for(i=0; i<data_sp; i++)
    {
        this->Data[i] = 0;
    }
    this->data_sp = 0;
    Operation_end = 0;  // 运算结束标志位
}

// 中缀转换为后缀表达式
void Widget::Fb_Change()
{
    int font=0;
    int flag = 0;
    i = char_sp;
    j = 0;
    int count = 0;

    // 12*4+34/5-(56=67*4)+32 => 12 4 * 34 5 / 56 67 4 * + - 32 + +

    qDebug() << "1";
    while(i--)      // 总共字符个数
    {
       if(isdigit(this->Chars[j]))  // 如果是数字字符
       {
            if(flag == 0)
            {
                suffix[suffix_sp++] = this->Chars[j];  // !
                j++;
            }else{
                suffix[suffix_sp++] = '&';  //  主要是为了正确分割数据, 和flag配合
                suffix[suffix_sp++] = this->Chars[j];  // !
                j++;
                flag = 0;
            }

            continue;
       }
       if((sign_sp == 0 || sign[sign_sp-1] == '(') && this->Chars[j] != ')')  // 如果符hao栈为空或者栈顶元素为'('
       {
            qDebug() << "null" <<endl;
            suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合
            sign[sign_sp++] = this->Chars[j];  // !
            j++;
            flag = 1;  // 主要是为了正确分割数据
            continue;
       }
       //
       if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '-' || sign[sign_sp-1] == '+'))
       {
           sign[sign_sp++] = this->Chars[j];  // !
           j++;
           flag = 1;  //
           continue;
       }
       if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '*' || sign[sign_sp-1] == '/'))
       {
           suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合
           suffix[suffix_sp++] = sign[--sign_sp];
           sign[sign_sp++] = this->Chars[j];
           j++;
           flag = 1;  // 主要是为了正确分割数据
           continue;
       }
       if(this->Chars[j] == '+' || this->Chars[j] == '-')
       {
           suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合
           suffix[suffix_sp++] = sign[--sign_sp];
           sign[sign_sp++] = this->Chars[j];
           j++;
           flag = 1;  //
           continue;
       }
       if(this->Chars[j] == '(')
       {
           sign[sign_sp++] = this->Chars[j];  // !
           j++;
           flag = 1;  //
           continue;
       }
       if(this->Chars[j] == ')')
       {
           while(sign[--sign_sp] != '(')
           {
               suffix[suffix_sp++] = '&'; // 主要是为了正确分割数据, 和flag配合
               suffix[suffix_sp++] = sign[sign_sp];
           }
           sign[sign_sp] = ' ';
           j++;
           flag = 1;  //
           continue;
       }
    }
    while(sign_sp--){
        suffix[suffix_sp++] = sign[sign_sp];
    }
    suffix[suffix_sp] = '\0';
    qDebug()<<  suffix;


    // suffix compute
    int arg_01, arg_02;
    for(i=0; i < suffix_sp; i++)
    {
        if(suffix[i] >= '0' && suffix[i] <= '9')
        {
            font = font*count*10 + ((int)suffix[i] - 48); // 252
            count = 1;
            continue;
        }
        if(suffix[i] == '&')
        {
            if(count == 1)  // 说明取过数
            {
                Data[data_sp++] = font;
                font = 0;
            }
            count = 0;
            continue;
        }
        if(suffix[i] == '+')
        {
            if(count == 1)  // 说明取过数
            {
                Data[data_sp++] = font;
                font = 0;
            }
            arg_01 = Data[--data_sp];  //
            arg_02 = Data[--data_sp];  //
            Data[data_sp++] =  arg_01+arg_02;
            qDebug() << Data[data_sp - 1];
            count = 0;
            continue;
        }
        if(suffix[i] == '-')
        {
            if(count == 1)  // 说明取过数
            {
                Data[data_sp++] = font;
                font = 0;
            }
            arg_01 = Data[--data_sp];  //
            arg_02 = Data[--data_sp];  //
            Data[data_sp++] =  arg_02 - arg_01;

            count = 0;
            continue;
        }
        if(suffix[i] == '*')
        {
            if(count == 1)  // 说明取过数
            {
                Data[data_sp++] = font;
                font = 0;
            }
            arg_01 = Data[--data_sp];  //
            arg_02 = Data[--data_sp];  //
            Data[data_sp++] =  arg_01 * arg_02;

            count = 0;
            continue;
        }
        if(suffix[i] == '/')
        {
            if(count == 1)  // 说明取过数
            {
                Data[data_sp++] = font;
                font = 0;
            }
            arg_01 = Data[--data_sp];  //
            arg_02 = Data[--data_sp];  //
            Data[data_sp++] =  arg_02 / arg_01;

            count = 0;
            continue;
        }
    }
    qDebug() << Data[0];
    ui->lineEdit->clear();
    this->Chars[char_sp++] = '=';
    Chars[char_sp] ='\0';
    ui->lineEdit->setText(QString::fromUtf8(this->Chars)+QString::number(Data[0]));
    Operation_end = 1;  // 运算结束标志位


}
// 237 238 236

void Widget::on_but_close_clicked()
{
    this->close();   // close window
}

4 完整代码

https://download.csdn.net/download/qq_51458770/89492760

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET使用CsvHelper快速读取和写入CSV文件

前言 在日常开发中使用CSV文件进行数据导入和导出、数据交换是非常常见的需求&#xff0c;今天我们来讲讲在.NET中如何使用CsvHelper这个开源库快速实现CSV文件读取和写入。 CsvHelper类库介绍 CsvHelper是一个.NET开源、快速、灵活、高度可配置、易于使用的用于读取和写入C…

Spring Boot集成vavr快速入门demo

1.什么是vavr&#xff1f; 初闻vavr&#xff0c;感觉很奇怪&#xff0c;咋这个名字&#xff0c;后面看到它的官网我沉默了&#xff0c;怀疑初创团队付费资讯了UC震惊部如何取名字&#xff0c;好家伙&#xff0c;vavr就是java这四个字倒过来&#xff0c;真的是’颠覆’了java……

如何成为-10x工程师:反向教学大数据开发实际工作中应如何做

10x 工程师可能是神话&#xff0c;但 -10x 工程师确实存在。要成为 -10x 工程师&#xff0c;只需每周浪费 400 小时的工程时间。结合以下策略&#xff1a; 目录 如何使 10 名工程师的输出无效化改变需求大数据开发示例 创建 400 小时的繁忙工作任务示例大数据开发示例 创建 400…

心理辅导平台系统

摘 要 中文本论文基于Java Web技术设计与实现了一个心理辅导平台。通过对国内外心理辅导平台发展现状的调研&#xff0c;本文分析了心理辅导平台的背景与意义&#xff0c;并提出了论文研究内容与创新点。在相关技术介绍部分&#xff0c;对Java Web、SpringBoot、B/S架构、MVC模…

Unable to get expected results using BM25 or any search functions in Weaviate

题意&#xff1a;使用 Weaviate 中的 BM25 或任何搜索函数都无法获得预期结果 问题背景&#xff1a; I have created a collection in Weaviate, and ingested some documents into the Weaviate database using LlamaIndex. When I used the default search, I found that it…

高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的这篇博客&#xff1a;高精度加法计算的实现 在这里就不再详细讲解&#xff0c;只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …

Chrome导出cookie的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

备份SQL Server数据库并还原到另一台服务器

我可以将SQL Server数据库备份到另一台服务器吗&#xff1f; 有时您可能希望将 SQL数据库从一台服务器复制到另一台服务器&#xff0c;或者将计算机复制到计算机。可能的场景包括测试、检查一致性、从崩溃的机器恢复数据库、在不同的机器上处理同一个项目等。 是的&#xff0c…

Vue+Proj4Leaflet实现地图瓦片(Nginx代理本地地图瓦片为网络url)加载并实现CRS投影转换(附资源下载)

场景 Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)&#xff1a; Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)_offline map maker-CSDN博客 Leaflet快速入门与加载OSM显示地图&#xff1a; Leaflet快速入门与…

等保测评练习卷14

等级保护初级测评师试题14 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 方案编制活动中测评对象确定、测评指…

sql想查询一个数据放在第一个位置

sql想查询一个数据放在第一个位置 背景:比如在查询后台账号的时候想将管理员账号始终放在第一个,其他账号按照创建时间倒序排序, 可以这样写sql: SELECTid,create_time FROMuser ORDER BY CASEWHEN id 1 THEN1 ELSE 2 END ASC, create_time DESC 运行截图: 可以看到id…

企业源代码加密软件丨透明加密技术是什么

在一个繁忙的软件开发公司中&#xff0c;两位员工小李和小张正在讨论源代码安全的问题。 “小张&#xff0c;你有没有想过我们的源代码如果被泄露了怎么办&#xff1f;”小李担忧地问。 “是啊&#xff0c;这是个大问题。源代码是我们的核心竞争力&#xff0c;一旦泄露&#…

CentOS 8 Stream 上安装 Docker 遇到的一些问题

curl 命令无法连接到 URL&#xff0c;可能是由于网络问题或 IPv6 配置问题。我们可以使用以下方法来解决这个问题&#xff1a; 强制使用 IPv4&#xff1a; 尝试使用 curl 强制使用 IPv4 进行连接&#xff1a; curl -4 -fsSL https://get.docker.com -o get-docker.sh 检查网络…

Python28-2 机器学习算法之SVM(支持向量机)

SVM&#xff08;支持向量机&#xff09; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的监督学习模型&#xff0c;在机器学习领域中被广泛应用。SVM的目标是找到一个最佳的分割超平面&#xff0c;将不同类别的数据分开&…

【详细】CNN中的卷积计算是什么-实例讲解

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、 CNN的基础卷积计算1.1.一个例子了解CNN的卷积计算是什么1.2.卷积层的生物意义 二、卷积的拓展&#xff1a;多输入通道与多输出通道2.1.多输入通道卷积2.2.多输出通道卷积 三、卷积的实现3.1.pytorch实现卷积…

夏令营1期-对话分角色要素提取挑战赛-第①次打卡

零基础入门大模型技术竞赛 简介&#xff1a; 本次学习是 Datawhale 2024 年 AI 夏令营第一期&#xff0c;学习活动基于讯飞开放平台“基于星火大模型的群聊对话分角色要素提取挑战赛”开展实践学习。 适合想 入门并实践大模型 API 开发、了解如何微调大模型的学习者参与 快来…

Windows系统开启自带虚拟机功能Hyper-V

前言 最近有小伙伴咨询&#xff1a;Windows系统上有自带的虚拟机软件吗&#xff1f; 答案肯定是有的。它就是Hyper-V&#xff0c;但很多小伙伴都不知道怎么打开这个功能。 今天小白就带大家来看看如何正确打开这个Windows自带的虚拟机功能Hyper-V。 开始之前&#xff0c;你…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现&#xff1a;实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…

PacBio or Nanopore:测序技术简单对比

前言 在基因组学和生命科学领域&#xff0c;追求知识的旅程不断演变&#xff0c;由揭示DNA和RNA奥秘的技术创新推动。我们熟知的两大测序技术——PacBio和Nanopore&#xff0c;正位于这一领域的前沿。这些由 Pacific Biosciences 和 Oxford Nanopore Technologies 分别开发的先…

【验收支撑】项目验收计划书(Word原件)

软件验收相关的文档通常包括以下&#xff0c;这些文档在软件项目的不同阶段和验收过程中起着关键作用&#xff1a; 1、概要设计说明书&#xff1a; 描述了软件系统的整体架构、主要模块及其相互关系。 2、详细设计说明书&#xff1a; 提供了软件系统中各个模块的详细设计信息&a…