当前位置: 首页 > article >正文

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

实现效果:

 主要文件: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") 

http://www.kler.cn/a/309434.html

相关文章:

  • LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)
  • 扫雷游戏代码分享(c基础)
  • 【CICD】GitLab Runner 和执行器(Executor
  • 障碍检测与避障控制 ROS2机器人
  • leetcode206. Reverse Linked List
  • 国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?
  • 去中心化的力量:探索Web3的分布式网络
  • 工商银行银企直联接口清单
  • Java高级Day40-QQ项目全代码
  • 使用SQL数据构建问答系统的完整指南
  • Nginx泛域名 解析的匹配前缀绑定或转发到子目录
  • APP测试基本流程与APP测试要点总结
  • 什么是单元测试?怎么做?
  • C++系列-匿名对象
  • linux网络命令:使用最多最广泛的网络抓包工具tcpdump详细介绍
  • MATLAB入门教程
  • 检查一个复数C的实部a和虚部b是否都是有限数值即a和b都不是无限数值、空值cmath.isfinite(x)
  • MES管理系统在智能制造中的重要应用
  • CMU 10423 Generative AI:lec5(Encoder-only Transformers + 阅读材料Bert, ViT)
  • 如何理解BCEWithLogitsLoss()
  • 什么是期权日内交易?怎么做日内期权策略?
  • MyBatis 源码解析:Mapper 文件加载与解析
  • 导弹追踪问题:蒙特卡罗模拟+matlab代码
  • Linux7-su,exit,sudo
  • Java 中的 sleep、wait、join 怎么理解
  • linux中的kill、pkill和killall