首页 > 其他分享 >VS+QT--实现二进制和十进制的转换(含分数部分)

VS+QT--实现二进制和十进制的转换(含分数部分)

时间:2024-09-14 12:26:11浏览次数:3  
标签:end QT power -- start int VS str NUM

实现效果:

 主要文件:BtD_DtB_converter.cpp

#include "BtD_DtB_converter.h"
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qstring.h>
# pragma execution_character_set("utf-8")  
BtD_DtB_converter::BtD_DtB_converter(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->setFixedSize(780, 400);
    //创造两个转换按钮
    QPushButton* convert1 = new QPushButton(this);
    convert1->setGeometry(300, 100, 110, 50);
    convert1->setText("二进制到十进制");
    QPushButton* convert2 = new QPushButton(this);
    convert2->setGeometry(300, 200, 110, 50);
    convert2->setText("十进制到二进制");
    //创造四个输入框LineEdit
    QLineEdit* B_to_D_start = new QLineEdit(this);
    B_to_D_start->setGeometry(100, 100, 100, 50);
    QLineEdit* B_to_D_end = new QLineEdit(this);
    B_to_D_end->setGeometry(500, 100, 100, 50);
    QLineEdit* D_to_B_start = new QLineEdit(this);
    D_to_B_start->setGeometry(100, 200, 100, 50);
    QLineEdit* D_to_B_end = new QLineEdit(this);
    D_to_B_end->setGeometry(500, 200, 100, 50);

    //连接两个点击信号和槽函数
    //二进制转换为十进制
    connect(convert1, &QPushButton::clicked, [=]()
        {
            QString str_start = B_to_D_start->text();
            //先查找是否有小数点
            //如果没有小数点 只使用int数据类型存放即可
            double NUM_END = 0;
            double power = 1;
            if (str_start.indexOf('.') == -1)
            {
                for (int i = str_start.length()-1; i >= 0; i--)
                {
                    NUM_END += power * (str_start[i] == '1' ? 1:0);
                    power *= 2;
                }
            }
            //最后显示在右边的搜索框中
            else
            {
                power = 1 / (pow(2, str_start.length() - 1 - str_start.indexOf('.')));
                for (int i = str_start.length() - 1; i > str_start.indexOf('.'); i--)
                {
                    NUM_END += power * (str_start[i] == '1' ? 1 : 0);
                    power *= 2;
                }
                //计算小数部分结束,计算整数部分
                power = 1;
                for (int i = str_start.indexOf('.') - 1; i >= 0; i--)
                {
                    NUM_END += power * (str_start[i] == '1' ? 1 : 0);
                    power *= 2;
                }
            }
            B_to_D_end->setText(QString::number(NUM_END));
        });

    //十进制转换为二进制
    connect(convert2, &QPushButton::clicked, [=]()
        {
            //如果没有小数点
            QString str_start = D_to_B_start->text();
            QString str_end = "";
            //先查找是否有小数点
            //如果没有小数点 只使用int数据类型存放即可
            int NUM_END = 0;
            int power = 2;
            if (str_start.indexOf('.') == -1)
            {
                int NUM = str_start.toInt();
                for (; NUM != 0; )
                {
                    str_end.append(QString::number(NUM % 2));
                    NUM /= 2;
                }
            }
            //如果有小数点
            else
            {
                double NUM2 = str_start.toDouble();
                int NUM = NUM2;//NUM为整数部分,与前兼容
                NUM2 = NUM2 - NUM;//保留的小数部分后面进行处理.
                for (; NUM != 0; )
                {
                    str_end.append(QString::number(NUM % 2));
                    NUM /= 2;
                }
                //反转
                for (int i = 0; i < str_end.length() / 2; i++)
                {
                    QChar temp = str_end[i];
                    str_end[i] = str_end[str_end.length() - 1 - i];
                    str_end[str_end.length() - 1 - i] = temp;
                }

                //添加小数点
                str_end.append('.');

                //添加小数部分
                int NUMofLeft;//乘2后的整数部分
                for (; NUM2 != 0; )
                {
                    NUM2 *= 2;
                    NUMofLeft = NUM2;
                    str_end.append(QString::number(NUMofLeft));
                    NUM2 = NUM2 - NUMofLeft;//减去整数部分.
                }


                D_to_B_end->setText((str_end));
                return;
            }
            //最后显示在右边的搜索框中 注意要反转 注意:使用的是QChar而不是QChar的引用!
            for (int i = 0; i < str_end.length()/2; i++)
            {
                QChar temp = str_end[i];
                str_end[i] = str_end[str_end.length() - 1 - i];
                str_end[str_end.length() - 1 - i] = temp;
            }

            D_to_B_end->setText((str_end));
        });
}

BtD_DtB_converter::~BtD_DtB_converter()
{}

总结:

  • 对算数溢出的部分尚未关注,数字较大时要切换为long或者longlong或者用算法来改进.
  • 使用QChar而不是QCharRef进行交换.(Ref是引用
  • 对于十进制切换为二进制,尚未设置一个明确的精度,用的可能是QLineEdit的最大宽度(存疑
  • indexof找到QString对应的小数点的位置,xx?a:b ,toInt,QString::number()等方法的应用.
  • pow()方法与power易混淆,以后起名尽量不使用power.
  • 带有UTF-8和BOM的编码时,使用# pragma execution_character_set("utf-8") 

标签:end,QT,power,--,start,int,VS,str,NUM
From: https://blog.csdn.net/quaer/article/details/142149571

相关文章

  • 聊一聊风险的分析及缓解
    目录一、风险分析二、按照风险发现的频率划分三、项目相关干系人对风险的评估开发人员:项目经理:销售人员:总监和VP:四、风险的化解一、风险分析在软件测试中,我们按照一个常识性的过程来理解风险。哪些事件需要担心?这些事件发生的可能性有多大?一旦发生,对公司产生......
  • 如何在局域网中(学校机房)实现文件共享(机位共享文件夹可被其他机位访问)
    操作环境:学校机房,win7(旗舰版)操作系统(无需担心电脑问题,机房电脑重启后即可恢复默认设置)。流程:1,创建你需要共享的文件夹。在D盘创建share文件夹。D:\share2,右键share文件夹点击属性找到共享页面,点击共享,添加Everyone用户,可修改其对文件夹的访问权限。2.1,在share属性......
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十七)
    一、前言  本篇文章将在v100单卡服务器上,使用unsloth去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。  使用unsloth能够使模型的微调速度提高2-5倍。在处理大规模数据或对时间要求较高的场景下......
  • PbootCMS会员相关标签调用
    在PBootCMS中,你可以通过一系列会员相关的标签来实现会员管理功能。以下是对这些标签的具体说明和使用方法:1.基本标签标签说明{pboot:ucenter}:个人中心地址{pboot:login}:登录地址{pboot:register}:注册地址{pboot:umodify}:资料修改地址{pboot:logout}:退出登录地址{pboot......
  • python爬虫连载20
    XPath语法:表达式描述nodename选取此节点的所有子节点/从根节点选取//选择任意位置的某个节点.选取当前节点..选取当前节点的父节点@选取属性    <?xmlversion="1.0"encoding="IS0-8859-1"?><classroom>      <student>             <id>1001</id>   ......
  • 智能工厂的设计软件 之 0之 Ⅰ AI模型:追求普智(普适智慧)的 现实模型
    写在讨论前面本期主题”智能工厂的设计软件”即 “程序”--“程序”做为”智能工厂的设计软件”的目的。前面的文章将这一主题称为“智能工厂的程序设计”是相对狭义一些的表述。1、文题中的数字(" 0 之 Ⅰ") 0:  “AI模型”的 “程序”性能层级  Layer-0( ......
  • d3.js 构建股权架构图并绘制双向节点树
    效果:代码:StockStructureChart.jsimportReact,{useEffect,useRef}from"react"import*asd3from"d3"constStockStructureChart=({upwardData,downwardData})=>{constref=useRef()constwidth=800constheight=......
  • 没想到一个 HTTP Client 居然考虑这么多场景...
    在项目开发过程中,HTTP请求可以说是非常常见的需求,无论是与外部API交互,还是实现微服务间的通信。这篇文章以Go语言为背景,探讨HTTP客户端的构建。Go的标准库net/http虽然功能强大,但在进行复杂的HTTP请求时,往往需要开发者写很多重复代码。在这种情况下,开发者就需要一个既......
  • ml语法转C语法,转译器成品
    ml编译器成品Project12024-seealsoprojectclarifications(updated5pm28thAug)andmarkingrubric成品(Price500)w,e,c,h,a,t:help-assignmentThegoalofthisprojectistoimplementaC11programtotranslateprogramswritteninasmallmi......
  • 一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中
    在软件开发中,配置管理是一个不可或缺的部分。无论是开发环境、测试环境还是生产环境,我们都需要一种方法来存储和读取配置信息。在Golang项目中,Viper是一个非常流行且功能强大的库,用于处理配置文件。下面我会写一些例子,帮助大家快速上手。什么是Viper?不卖关子,直接上GitHub地址......