编程珠玑3-8

news2024/11/14 20:20:53

问题

8.[S.C.Johnnson]七段显示设备实现十进制数字:

在这里插入图片描述

的廉价显示。七段显示通常如下编号:

在这里插入图片描述

编写一个使用5个七段显示数字来显示16位正整数的程序。输出为一个5个字节的数组,当且仅当数字j中的第i段点亮时,字节j中的位i置1

分析

简单翻译一下题目的意思,编写一个程序,实现给定一个数字,包含5位,在终端输出图像

举个例子,向程序输入82367,在终端显示
在这里插入图片描述

这题需要解决的核心问题时,如何将数转换为图像(二维数组)

举个例子
在这里插入图片描述
这是7段显示的编码,如果我们提前知道所有数对应的编码同时知道编码对应二维数组的坐标。那么我们就可以通过数转换为编码,编码对应坐标,最后根据坐标进行可视化

现在,我们拥有一个7 x 4的二维数组,如果我们要绘制8,如上图所示,8对应的七段编码为[0, 1, 2, 3, 4, 5, 6, 7]

以编码0为例子,0对应7 x 4的二维数组的坐标是:(6, 1), (6, 2)。以此类推,获取剩下编码对应的坐标,即可将数字转换为二维数组的坐标。然后在数组中填充对应的内容,最后就完成了对应过程
在这里插入图片描述

代码

为了程序可维护性,做了一些抽象。

聚合
聚合
聚合
Rule
int number_row
int number_col
int interval
map id_pos # 七段显示的编号对应的坐标
map number_ids # 每个数字对应的编号集合
Number
Rule rule
int number
set_number(number)
gen_graphic() : List[][]
Display
List[][] graphic # 最终显示的图像
List[] number_list # 5个7段显示
displat(number)
reader(number)
writer()

Rule是规则类,定义了一些列规则

  • 一个七段显示,对应数组的维度
  • 每个七段显示之间的间隔
  • 每个数字对应的编号
  • 编号对应的坐标

Number是数字类,用于维护一个0~9之间数字与二维数组之间的转换

Display是显示屏类,用于集中维护5个7段显示,并打印数字

代码

from typing import List

'''
定义规则
'''
class Rule:
    # 七段显示数字的数组维度
    number_row = 7
    number_col = 4
    # 5个七段显示数字之间的间隔
    interval = 2

    const = {
        'horizon': '-',
        'vertical': '|',
    }

    def __init__(self):
        # 七段显示的编号坐标
        self.id_pos = {
            0: [(6, 1, Rule.const['horizon']), (6, 2, Rule.const['horizon'])]
            , 1: [(3, 1, Rule.const['horizon']), (3, 2, Rule.const['horizon'])]
            , 2: [(0, 1, Rule.const['horizon']), (0, 2, Rule.const['horizon'])]
            , 3: [(1, 0, Rule.const['vertical']), (2, 0, Rule.const['vertical'])]
            , 4: [(1, 3, Rule.const['vertical']), (2, 3, Rule.const['vertical'])]
            , 5: [(4, 0, Rule.const['vertical']), (5, 0, Rule.const['vertical'])]
            , 6: [(4, 3, Rule.const['vertical']), (5, 3, Rule.const['vertical'])]
        }
        # 数字通过七段显示展示时, 需要的七段显示编号
        self.number_ids = {
            0: [x for x in range(7) if x not in (1,)]
            , 1: [4, 6]
            , 2: [x for x in range(7) if x not in (3, 6)]
            , 3: [x for x in range(7) if x not in (3, 5)]
            , 4: [x for x in range(7) if x not in (2, 5)]
            , 5: [x for x in range(7) if x not in (4, 5)]
            , 6: [x for x in range(7) if x not in (4,)]
            , 7: [x for x in range(7) if x not in (1, 3, 5, 0)]
            , 8: range(7)
            , 9: [x for x in range(7) if x not in (0, 5)]
        }


class Number:
    def __init__(self, number: int):
        self.rule = Rule()
        self.number = number

    def set_number(self, number):
        self.number = number

    '''
    将0-9中的数字转换为图像(二维数组) 
    '''
    def gen_graphic(self) -> List[List]:
        # 获取数字对应7段显示的编号
        ids = self.rule.number_ids[self.number]
        graphic = [[' ' for _ in range(Rule.number_col)] for _ in range(Rule.number_row)]
        # 遍历所有编号, 获取编号对应的坐标集合
        for id in ids:
            # (x, y) -> 数组坐标; w -> 数组需要填充的字符内容
            for x, y, w in self.rule.id_pos[id]:
                graphic[x][y] = w
        return graphic


class Display:
    def __init__(self):
        # 5个7段显示需要的数组维度
        self.graphic = [[' ' for _ in range(5 * Rule.number_col + 4 * Rule.interval)] for _ in range(Rule.number_row)]
        # 5个7段显示
        self.number_list = [Number(i) for i in range(5)]

    '''
    图像归位 
    '''
    def clear(self):
        self.graphic = [[' ' for _ in range(5 * Rule.number_col + 4 * Rule.interval)] for _ in range(Rule.number_row)]

    '''
    显示数字
    '''
    def display(self, number: int):
        self.clear()
        self.reader(number)
        self.writer()

    '''
    读取需要显示的数字
    '''
    def reader(self, number: int):
        params = []
        while number != 0:
            params.append(number % 10)
            number //= 10
        size = len(params)
        for _ in range(size, 5):
            params.append(0)
        params.reverse()
        # 赋值不同的数字
        for idx, n in enumerate(self.number_list):
            n.set_number(params[idx])

    '''
    赋值graphic, 打印图像
    '''
    def writer(self):
        for idx, n in enumerate(self.number_list):
            # 数组拷贝, 将5个七段显示绘制的二维数组拷贝到display中的数组
            new_gra = n.gen_graphic()
            for i in range(len(new_gra)):
                # col_len需要考虑每个七段显示之间的间隔
                col_len = Rule.number_col + Rule.interval
                self.graphic[i][idx * col_len: (idx + 1) * col_len] = new_gra[i]
        # 绘图
        for row in self.graphic:
            for r in row:
                print(r, end='')
            print()

测试

display = Display()
print(82367)
display.display(82367)
print(12345)
display.display(12345)
print(53245)
display.display(53245)

在这里插入图片描述

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

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

相关文章

Mac视频vedio转成gif图

方法一:系统自带:Keynote 1、用"Keynote"创建幻灯片。 2、把视频拖拽进入。 3、Keynote右上角有个“文稿”,点击调整幻灯片大小。(坑点:按比例调整) 4、文件 -> 导出为“Gif动画”。 方法…

TDesign:腾讯的开源企业级前端框架,能和ant-design一战吗?

TDesign 是一套拥有完整的 设计价值观 和 视觉风格指南 的企业级设计体系,同时提供了丰富的 设计资源。TDesign 在设计体系基础上产出基于 Vue、React、小程序等业界主流技术栈的组件库解决方案。是不是有点晚了? 请大家各抒己见。

【开源大模型生态7】华为的盘古大模型

鹏程盘古模型是全球首个全开源2000亿参数的自回归中文预训练语言大模型,在知识问答、知识检索、知识推理、阅读理解等文本生成领域表现突出。 2070亿参数,64层。 这里注意几个概念。 参数(Parameters): 参数是指构成模…

K8s中如何使用etcd进行集群信息的备份与恢复

这里写目录标题 ETCD是什么?1. **`etcd`(服务)**2. **`etcdctl`(客户端工具)**如何安装etcdctl(客户端工具)查看目前K8s自带etcd中的版本信息安装对应版本的etcdutl工具下载 `etcdutl` 3.5.7 版本配置环境变量创建备份文件验证一下备份的快照文件备份文件恢复的效果演示…

MmAP(论文解读) : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning

MmAP:跨领域多任务学习的多模态提示对齐 AAAI 2024 摘要 多任务学习(Multi-Task Learning,MTL)同时训练多个相关的任务,从而能够提高单个任务的性能。通常,一个多任务网络架构包含共享backbone和任务特定…

根据NVeloDocx Word模板引擎生成Word(三)

基于永久免费开放的《E6低代码开发平台》的Word模版引擎NVeloDocx,实现根据Word模版生成Word文件,前面2篇已经非常详细介绍了《主表单字段》,《子表记录循环输入到表格》。那这一篇我们就介绍插入单张图片、二维码,条形码等等&…

区块链媒体:区块链媒体套餐倾心推广解析!

塞翁失马,区块链媒体套餐,两者看似毫不相干,实际上却反映了区块链技术的广泛运用和媒体领域的创新模式。本文将带你深入了解这一新兴领域的背后故事,并分析区块链媒体套餐推广的关键因素。 塞翁失马的寓意 塞翁失马是中国古代的一…

实例讲解电动汽车车速计算算法及Simulink建模方法

电动汽车的车速信号是一个非常重要的信号,在VCU软件开发中,车速一般需要通过采集其他控制器车速或者通过电机转速间接计算出来,作为仪表显示车速、限速控制、剩余续驶里程计算等使用,因此,在VCU软件开发中,…

有什么免费好用的ai写作软件?2024帮助你快速进行写作的软件

有什么免费好用的ai写作软件?2024帮助你快速进行写作的软件 AI写作软件如今在提升写作效率、生成灵感、以及帮助完成复杂的写作任务方面表现得越来越出色。以下是五款免费且好用的AI写作软件,它们能够帮助你快速进行写作,无论是博客文章、市…

echarts多组堆叠柱状图

一、效果图 二、代码实现 1、创建容器 <el-card class"box-card"><div slot"header" class"clearfix"><span>课堂学习</span></div><div id"class-learning" style"height: 360px">&l…

strtok与strtok_r函数及线程安全问题

#include <string.h> char *strtok(char *str, const char *delim); char *strtok_r(char *str, const char *delim, char **saveptr); 总的&#xff1a;这两个函数都是分割字符串的函数&#xff0c;但是前者是线程不安全的&#xff0c;后者是线程安全的。 我们先从使用…

网络药理学:分子对接之二:PDB数据库的使用(已知PDB ID)、PubChem数据库如果没有3D结构

PDB数据库使用 官方地址&#xff1a;https://www.rcsb.org/ 首页如下&#xff1a; 我们以热休克蛋白HSP90AA1为例&#xff0c;其PDB ID为7DHG&#xff0c;所以我们在搜索栏输入7DHG&#xff1a; 主要关注红框里的几个地方。 Download 下载文件&#xff0c;一般选择PDB For…

车载以太网

目录 概述 发展历史 总体架构 相关组织介绍 主流车载网络系统 各种总线比较 概述 随着汽车电动化进程的加速推进,手机控制车辆以及彼此交互的场景不断扩大,可以想象未来联网需求只会不断拓展,无论是车内还是车外的联网需求都不约而同的提出了更多网络带宽的重要性。 为…

知识赋能:构建高效测试团队的关键

目录 ​​​​​​问题背景 知识库的重要性 新员工的融入与关键岗位的风险控制 知识库的构成 常见问题讨论 团队历史包袱重、老员工不配合&#xff0c;怎么办&#xff1f; 1. 明确愿景和目标 2. 激励与认可 3. 赋予责任与参与感 4. 循序渐进&#xff0c;逐步推进 5.…

C# 路径操作

一、打开程序所在路径 try{string debugPath System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);System.Diagnostics.Process.Start(debugPath);}catch (Exception ex){MessageBox.Show("无法打开目录&#xff1a;" e…

[开源]YOLOv8+Pyside6的交通红绿灯目标检测源码

[开源]YOLOv8Pyside6的交通红绿灯目标检测源码 一. 项目介绍源码链接 该系统是yolov8目标检测可视化界面检测系统&#xff0c;支持图片、视频、摄像头检测. 系统的模型是自己训练的模型, 源码自取 源码链接 如需自己训练模型, 数据集链接 二. 作者的运行环境 python3.8tor…

一文精通Fourier Transform--傅里叶变换

导读&#xff1a; 在数字信号处理中&#xff0c;我们把信号分为时域信号与频域信号。傅里叶发现&#xff1a;任何周期信号(时域)都能够由不同频率谐波的正弦波(频域)叠加而成。沟通起时域频域最为关键的一点就是我们要学习的傅里叶变换&#xff08;Fourier Transform&#xff0…

党务政务服务|基于SprinBoot+vue的党务政务服务热线系统(源码+数据库+文档)

党务政务服务热线系统 目录 基于SprinBootvue的党务政务服务热线系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 管理员功能模块 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

威胁建模STRIDE框架

威胁建模STRIDE框架 1.威胁建模框架概述2.STRIDE威胁建模框架欺骗 - 冒充某人或某物篡改 - 未经授权更改数据否认性 - 不宣称对执行的操作负责信息泄露 - 查看不应查看的数据拒绝服务 - 系统繁忙权限提升 - 拥有本不应该拥有的权限 3.后续的威胁发现 1.威胁建模框架概述 威胁建…

如何通过内网穿透实现Pycharm远程服务器编译项目与服务器代码同步

文章目录 前言一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 前言 本文主要介绍如…