十进制转十六进制的七段数码管绘制

进制转换与七段数码管绘制(turtle库)


七段数码管的绘制

问题:如何利用七段数码管表示十进制转为二进制?

一、问题描述

二、问题解析

1.了解七段数码管

数码管是一种价格便宜、使用简单的电子器件,广泛应用于价格较低的电子类产品中,其中,七段数码管最为常用。七段数码管(Seven-segment Indicator)由七段数码管拼接而成,每段有亮或不亮的两种情况,且包括一个小数点的位置。

在使用Python绘制数码管的显示动态时,可以自定义顺序,如下图。

2.绘制思路

利用Python的turtle库绘制

数码管由七条基本线组成,可以以固定顺序进行按条绘制

先绘制单段数码管

def drawGap():
    turtle.penup()
    turtle.fd(5)

def drawLine(draw):  # 绘制单段数码管
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)

再按顺序用单段数码管绘制七段数码管

def drawDigit(digit):  # 根据数字绘制七段数码管
    drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)  # 绘制数字所需经过的线
    drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    turtle.left(180)
    turtle.penup()  # 为绘制后续数字确认位置
    turtle.fd(20)  # 为绘制后续数字确认位置

 将用户输入的整数进行进制转换再调用函数进行绘制

def sanput(s):
    a = 0  # 记录十进制
    num = ''  # 记录十六进制
    # 用hex函数将十进制转化为十六进制
    a = eval(s)
    num = hex(a).lower()
    num = num[2:]  # 不要第一位
    print(num)
    print("请输入整数")

    # 先输出十进制
    drawvalue(1)
    for i in s:
        drawDigit(eval(i))
    turtle.pencolor('red')
    drawLetter('d')

    # 输出十六进制
    turtle.goto(-300, -100)
    drawvalue(2)
    for i in num:
        if i in ['0','1','2','3','4','5','6','7','8','9']:
            drawDigit(eval(i))
        else:
            drawLetter(i)
    turtle.pencolor('green')
    drawLetter('h')

进制转换

利用Python内置函数hex函数将整数转为十六进制字符串(注意转换的过程字符串和整数的区别)

try:
    a=eval(input())
    num=hex(a).lower()
    print(num[2:])
except TypeError and SyntaxError:  # 排除异常,只能输入整数
    print("请输入整数")

 总体思路

drawGAP()辅助绘制单段数码管;

drawLine(draw)绘制单段数码管;

drawDigit(digit)根据数字digit绘制七段数码管;

drawLetter(letter)根据字母绘制七段数码管;

drawvalue(dight)打印汉字“十进制”和十六进制

sanput(s)接收用户输入,调用函数打印结果

 实验结果


源代码

import turtle


def drawGap():
    turtle.penup()
    turtle.fd(5)


def drawLine(draw):  # 绘制单段数码管
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)


def drawDigit(digit):  # 根据数字绘制七段数码管
    drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)  # 绘制数字所需经过的线
    drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    turtle.left(180)
    turtle.penup()  # 为绘制后续数字确认位置
    turtle.fd(20)  # 为绘制后续数字确认位置


def drawLetter(letter):  # 根据字母绘制七段数码管
    drawLine(True) if letter in ['a','b','d','e','f','h','k','n','o','p','q','s','t','w','x','y','z'] else drawLine(False)
    drawLine(True) if letter in ['a','b','d','g','h','i','j','k','m','n','o','q','u','v','w','x','y'] else drawLine(False)
    drawLine(True) if letter in ['b','c','d','e','g','i','j','l','o','s','t','u','v','w','y','z'] else drawLine(False)
    drawLine(True) if letter in ['a','b','c','d','e','f','g','h','k','l','m','n','o','p','q','r','t','u','v','w','z'] else drawLine(False)
    turtle.left(90)
    drawLine(True) if letter in ['a','b','c','e','f','g','h','k','l','m','p','q','r','t','u','w','x','y'] else drawLine(False)
    drawLine(True) if letter in ['a','c','e','f','g','i','k','m','p','q','r'] else drawLine(False)
    drawLine(True) if letter in ['a','d','h','i','j','m','p','q','u','w','y','z'] else drawLine(False)
    turtle.left(180)
    turtle.penup()
    turtle.fd(20)


def drawvalue(dight):  # 打印十进制和十六进制
    if dight == 1:
        turtle.pencolor('black')
        turtle.write('十进制:', font=('Arial', 24, 'normal'))
        turtle.fd(170)
    elif dight == 2:
        turtle.pencolor('black')
        turtle.write('十六进制:', font=('Arial', 24, 'normal'))
        turtle.fd(170)


def sanput(s):
    a = 0  # 记录十进制
    num = ''  # 记录十六进制
    # 用hex函数将十进制转化为十六进制
    a = eval(s)
    num = hex(a).lower()
    num = num[2:]  # 不要第一位
    print(num)

    # 先输出十进制
    drawvalue(1)
    for i in s:
        drawDigit(eval(i))
    turtle.pencolor('red')
    drawLetter('b')

    # 输出十六进制
    turtle.goto(-300, -100)
    drawvalue(2)
    for i in num:
        if i in ['0','1','2','3','4','5','6','7','8','9']:
            drawDigit(eval(i))
        else:
            drawLetter(i)
    turtle.pencolor('green')
    drawLetter('h')


def main():
    turtle.setup(800, 700, 200, 200)
    turtle.penup()
    turtle.goto(-300, 200)
    turtle.pensize(5)
    s = input()
    sanput(s)
    turtle.hideturtle()
    turtle.done()


main()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值