进制转换与七段数码管绘制(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()