Qt creator实现一个简单计算器

目录

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.mfbz.cn/a/753338.html

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

相关文章

北京站圆满结束!MongoDB Developer Day上海站,周六见!

上周六 MongoDB Developer Day首站北京站 80位开发者与MongoDB一起度过了充实的一天 专题讲座➕动手实操➕专家面对面交流 从数据建模、进阶查询技巧 到Atlas搜索与向量搜索 让参会伙伴们直呼“满满的技术干货&#xff01;” 全体参会者与工作人员合影 MongoDB Developer …

【unity笔记】五、UI面板TextMeshPro 添加中文字体

Unity 中 TextMeshPro不支持中文字体&#xff0c;下面为解决方法&#xff1a; 准备字体文件&#xff0c;从Windows系统文件的Fonts文件夹里拖一个.ttf文件&#xff08;C盘 > Windows > Fonts &#xff09; 准备字库文件,新建一个文本文件&#xff0c;命名为“字库”&…

Vue组件化、单文件组件以及使用vue-cli(脚手架)

文章目录 1.Vue组件化1.1 什么是组件1.2 组件的使用1.3 组件的名字1.4 嵌套组件 2.单文件组件2.1 vue 组件组成结构2.1.1 template -> 组件的模板结构2.1.2 组件的 script 节点2.1.3 组件的 style 节点 2.2 Vue组件的使用步骤2.2.1 组件之间的父子关系2.2.2 使用组件的三个步…

低代码+定制:优化项目管理的新方案

引言 在当今快速变化的商业环境中&#xff0c;企业需要更加灵活、高效的项目管理工具。低代码平台作为一种新的开发方式&#xff0c;因其能够快速构建应用程序而受到广泛关注。与此同时&#xff0c;软件定制开发仍然是满足特定复杂需求的重要手段。在项目管理中&#xff0c;低代…

建筑可视化中使用云渲染的几大理由

在建筑行业中&#xff0c;可视化技术已成为不可或缺的一部分。无论是设计方案的展示、施工进度的模拟&#xff0c;还是最终效果的呈现&#xff0c;建筑可视化都发挥着至关重要的作用。 建筑可视化是指通过计算机技术和图形学算法&#xff0c;将建筑设计、规划和施工过程中的数据…

社交风潮塑造者:探索用户在Facebook的影响力

在当今数字化社会中&#xff0c;Facebook不仅是人们社交互动的主要平台&#xff0c;更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力&#xff0c;探索其如何通过个人行为和互动&#xff0c;影响和改变社会的各个方面。 个人表达和内…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

AI 卖货主播大模型:Streamer-Sales 销冠!MoneyPrinterTurbo :简直就是营销号的梦想工具!

AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠!MoneyPrinterTurbo &#xff1a;简直就是营销号的梦想工具&#xff01; AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠! 项目简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购…

linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动

在Linux环境下&#xff0c;要实现当Tomcat挂掉后自动重启&#xff0c;可以通过编写Shell脚本结合cron定时任务或者使用系统守护进程&#xff08;如Systemd、Upstart或SysVinit&#xff09;来完成。 使用Shell脚本和cron定时任务 编写检查并重启Tomcat的Shell脚本&#xff1a;首…

我的创作纪念日学期总结

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; 关于博主 目录 &#x1f308;前言&#x1f525;我的期末考试&#x1f525;我的学期总结&#x1f525;对未来的展望&#x1f308;结语 &#x1f308;前言 本篇博客主要内容&#xff1a;博…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

在预训练语言模型主流架构

文章目录 编码器-解码器架构因果解码器架构前缀解码器架构在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-d…

重磅!UOSDN焕新,开启创新之旅!

亲爱的开发者们 经过精心打磨和优化 全新改版的UOSDN&#xff08;统信开发者支持网络&#xff09; 已经正式上线啦&#xff01; 我们致力于为您打造一个更加便捷、高效、富有创意和互动性的开发平台&#xff0c;详情&#x1f449;https://uosdn.uniontech.com/ 以UOSDN作为载…

uni-app 微信小程序开发到发布流程

1. uni-app 微信小程序开发到发布流程 1.1. 新建一个uni-app 项目 1.2. 发行微信小程序 1.3. 微信开发者平台的微信小程序appid 复制进来&#xff08;点击发行&#xff09; 1.4. IDE may already started at port xxxx, trying to connect &#xff08;1&#xff09;关闭微信…

ffmpeg编码图象时报错Invalid buffer size, packet size * < expected frame_size *

使用ffmpeg将单个yuv文件编码转为jpg或其他图像格式时&#xff0c;报错&#xff1a; Truncating packet of size 11985408 to 3585 [rawvideo 0x1bd5390] Packet corrupt (stream 0, dts 1). image_3264_2448_0.yuv: corrupt input packet in stream 0 [rawvideo 0x1bd7c60…

借助AI写代码,使用通义灵码智能编写Java和Vue3项目,在Idea和vscode里用AI写代码

在人工智能技术越来越成熟的当下&#xff0c;好多人说AI会取代程序员&#xff0c;这句话石头哥不知可否。但是有一点可以肯定&#xff0c;会熟练使用Ai&#xff0c;驾驭Ai的程序员肯定不会被时代所淘汰。所以今天石头哥就来教大家如何借助Ai来提升自己的代码编写效率。 一&…

时序(流式)图谱数据仓库AbutionGraph功能介绍-Streaming Graph OLAM Database

AbutionGraph是一款端到端的流式数据实时分析的图谱数据库&#xff0c;实时&#xff08;流式写入实时、高QPS决策分析实时、流式预处理实时&#xff09;表现在&#xff1a; 构建实时查询QPS响应时长与历史数据量无关的图模型&#xff1b;接入流式数据并实时更新图计算指标&…

java和网络安全,哪个就业前景更大?

常年以来&#xff0c;Java一直占据着程序语言的前三名&#xff0c;因此也就成了许多进入IT行业的首选语言。但随着5G时代的兴起&#xff0c;网络安全也成了当今最火热的“风口行业”。导致很多年轻人不知如何选择&#xff0c;一直处于纠结徘徊的状态。下面盾叔就带大家了解一下…

【Qt】QMessageBox 各种对话框的默认显示效果

1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…

SpringBoot-SpringBoot整合Swagger使用教程(图文介绍,一篇就够了)

前言 日常开发中&#xff0c;接口都是和开发文档相结合的。不论是和前端对接还是三方对接亦或者是接口留档&#xff0c;当我们开发完接口后&#xff0c;都需要去创建对应的接口文档。而修改接口后也要修改相对应的接口文档&#xff0c;但是这个真的很容易疏漏。而且相对于繁重的…