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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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 stackchar suffix[128];  //  后缀表达式 stackchar 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 computeint 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); // 252count = 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 236void Widget::on_but_close_clicked()
{this->close();   // close window
}

4 完整代码

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

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

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

相关文章

Qt Creator配置以及使用Git

Qt Creator配置以及使用Git 引言一、Qt Creator配置git二、Qt Creator使用git2.1 创建git仓库 or git项目导入Qt2.2 配置远端&#xff0c;拉代码 or 上传代码2.3 查看更改2.4 更多细节可参考官方文档 三、参考的博客以及文档 引言 Qt Creator配置Git之后&#xff0c;可以看作是…

使用Charles实现Android抓包,附带Charles破解教程

1.下载Charles 网址&#xff1a;下载Charles 安装完成后的界面&#xff1a; 2.配置http抓包 点击该选项 可以看到代理的 ip 和端口号 然后在手机的wifi中配置代理&#xff08;手机和电脑要在同一局域网&#xff09;&#xff0c;代理选择手动&#xff0c;并填入ip和端…

vue3中 slot使用

默认插槽&#xff1a; 这是最基本的插槽类型&#xff0c;当没有指定 name 属性时&#xff0c;插槽是默认插槽。 子组件&#xff1a; <template><div class"child"><h2>子组件内容</h2><slot></slot> <!-- 默认插槽&#x…

UnityUGUI之三 Text

富文本 常用语法&#xff1a; 1.加粗 <b> text </b> 2.斜体 <i> text </i> 3.尺寸 <size?> text </size> 4.颜色 <color#ff0000> text </color>

zabbix小白入门:从SNMP配置到图形展示——以IBM服务器为例

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在运维实践中&#xff0c;Zabbix作为一款强大的开源监控工具&#xff0c;被广泛应用于服务器、网络设备和应用程序的监控&#xff0c;成为保障业务连续性和高效运行的关键。然而&#xff0c;对于Zabbix的初学者来说&a…

发送微信消息和文件

参考&#xff1a;https://www.bilibili.com/video/BV1S84y1m7xd 安装&#xff1a; pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好&#xff0c;我是PyOfficeRobot&#xff0c;有什么可以帮助…

泽州县和美环保科技有限公司——绿色环保的践行者

在环保产业蓬勃发展的今天&#xff0c;泽州县和美环保科技有限公司以其卓越的技术和强大的实力&#xff0c;成为山西省危废综合处置领域的翘楚。作为雅居乐环保集团的全资子公司&#xff0c;和美环保科技有限公司紧跟集团发展战略&#xff0c;致力于为社会提供全方位的环境服务…

UE5 04-重新加载当前场景

给关卡加一个淡出的效果 给关卡加一个淡入的效果, 这个最好放置在Player 上,这样切关卡依然有这个效果

Chapter10 高级纹理——Shader入门精要学习笔记

Chapter10 高级纹理 一、立方体纹理1.基本概念①组成②采样 2.天空盒子 Sky Box3.环境映射三种方法①特殊布局的纹理创建②手动创建Cubemap——老方法③脚本生成 4.反射5.折射6.菲涅尔反射 二、渲染1.镜子效果2.玻璃效果3.渲染纹理 vs GrabPass 三、程序纹理1.简单程序纹理2.Un…

Mybatis Plus 自动填充注解 @TableField(fill = FieldFill.INSERT_UPDATE)

第一步&#xff1a;在需要自动填充的位置加上注解 通过在创建时间和修改时间上添加 fill 填充字段 进行自动填充 第二步&#xff1a;要想实现自动填充还需要实现MetaObjectHandler接口&#xff0c;在这里实现自动填充的逻辑 Component public class MyMetaObjectHandler …

Cmake静态库与动态库的构建与使用

项目目录 各个文件 myhell.h // // Created by glt on 2024/7/3. //#ifndef MY_PRO_HELLO_H #define MY_PRO_HELLO_H#include <iostream>void HelloFunc();#endif //MY_PRO_HELLO_Hhello.cpp // // Created by glt on 2024/7/3. // #include "myhello.h"voi…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

文本分析-使用Python做词频统计分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Python机器学习】模型评估与改进——带交叉验证的网格搜索

虽然将数据划分为训练集、验证集、测试集的方法是可行的&#xff0c;也相对常用&#xff0c;但这种方法对数据的划分相当敏感&#xff0c;为了得到对泛化性能的更好估计&#xff0c;我们可以使用交叉验证来评估每种参数组合的性能&#xff0c;而不是仅将数据单次划分为训练集与…

【简单讲解下npm常用命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

最靓丽的C++开源通知弹框SnoreToasts自动监听软件及网页通知

SnoreToasts&#xff0c;作为一款轻量级的C开源项目&#xff0c;为开发者提供了一个便捷的方式来在Windows操作系统上展示通知弹框&#xff08;Toast Notifications&#xff09;。 特点与优势 轻量级&#xff1a;SnoreToasts采用了简洁的代码设计&#xff0c;避免了不必要的依…

昇思25天学习打卡营第3天|yulang

今天主要学习03-张量Tensor&#xff0c;主要包含了处理创建张量、张量的属性、张量索引和张量运算&#xff0c;稀疏张量&#xff0c;有点看不太懂&#xff0c;感觉要开始入门到放弃了&#xff1f;张量在构建和训练深度学习模型中的实际应用&#xff0c;如卷积神经网络。 张量&a…

2024 AIGC 技术创新应用研讨会暨数字造型设计师高级研修班通知

尊敬的老师、领导您好! 为深入响应国家关于教育综合改革的战略部署&#xff0c;深化职业教育、高等教育改革&#xff0c;发挥企业主体重要作用&#xff0c;促进人才培养供给侧和产业需求侧结构要素全方位融合&#xff0c;充分把握人工智能创意式生成(AIGC)技术在教育领域的发展…

如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践

在社交媒体被广泛应用的今天&#xff0c;Facebook作为全球最大的社交网络平台之一&#xff0c;面临着很多挑战&#xff0c;其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用&#xff0c;Facebook需要采取一系列措施&#xff0c;其中包括使用静态住宅代理…

web自动化(三)鼠标操作键盘

selenuim 键盘操作 import timefrom selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selen…