“七段数码管”问题分析:

我们在小的时候可以通过火柴进行一定从而出现新的数字,火柴摆放所形成的样式我们称之为数码管,如何通过计算机进行数码管的绘制呢?我们的思路如下:

基本思路:

步骤一:绘制单个数字对应的数码管

步骤二:获得一串数字,绘制对应的数码管

步骤三:获得当前系统时间,绘制对应的数码管。

我们按照步骤进行一步步的详细进行。

步骤一:绘制单个数字对应的数码管

当我们绘制一个8的数码管的时候,我们需要七段数码管,而七段数码管由七个基本线条组成,这七段数码管可以有固定顺序,不同数字需要的数码管也不相同。我们根据函数去实现单个数字的数码管的绘制.

代码如下所示:

import turtle
def drawLine(draw):           #绘制单段数码管
    turtle.pendown() if draw else turtle.pendown()
    turtle.fd(40)
    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)

以上代码里面,我们首先根据drawLine绘制了一条数码管,之后调用这个函数,进行数码管的绘制,他的起点为八数码管的左边中间连接点。海龟绘图时,调用drawLine函数,绘制一条数码管后,进行右转,即为1,之后按方向再画再右转,进行相同操作四次后,画出了八的半个,此时海龟的头在第四次画完后进行了右转,此时方向为开始方向,即向右,为了继续调用drawLine函数,我们需要将海龟的头左转,然后画出一条线后再进行右转,然后调用三次后,即画出8,然后再左转180度,即回到初始前进方向。

其中的digit函数为由于在画数码管的时候,每个字所经过的边数不同,所以我们在绘制时可以判断该数字的数码管是否经过该边再选择进行调用。根据参数digit来决定如何绘制,对应的数字取值范围为0~9.

步骤二:获得一串数字,绘制对应的数码管

移动起点,绘制第二个

代码示例如下:

import turtle  #调用turtle库
def drawLine(draw):  #这段函数实现的是画一个数码管
    turtle.pendown() if draw else turtle.penup()  #如果这个数码管画了则落下,否则抬起。
    turtle.fd(40)
    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 drawDate(date):   #设置时间函数,将时间进行逐一遍历输出。
    for i in date:   #将一串字符串拆分成一个个字符的函数
        drawDigit(eval(i))  #用评估函数去掉字符串,获得整数。即将数字变成整数,
def main():
    turtle.setup(800,350,200,200)  #当前画布的大小
    turtle.penup()
    turtle.fd(-300)    #当前画笔初始绘制所在的位置
    turtle.pensize(5)
    drawDate('20181010')   #调用drawDate参数,给他赋予一个参数。
    turtle.hideturtle()
    turtle.done()
main()

运行界面如下:

步骤三:获得当前系统时间,绘制对应的数码管。

使用time库获得系统当前时间

增加年月日标记

年月日颜色不同。

代码示例如下:

import time
import turtle  #调用turtle库
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 drawGap():
    turtle.penup()
    turtle.fd(5)
def drawDate(date):   #设置时间函数,将时间进行逐一遍历输出。
   turtle.pencolor("red")  #设置画笔颜色。
   for i in date:
       if i =='-':
           turtle.write('年',font=("Arial",18,"normal"))
           turtle.pencolor("green")
           turtle.fd(40)
       elif i=='=':
           turtle.write('月', font=("Arial", 18, "normal"))
           turtle.pencolor("blue")
           turtle.fd(40)
       elif i == '+':
           turtle.write('日', font=("Arial", 18, "normal"))
           turtle.pencolor("red")
           turtle.fd(40)
       else :
           drawDigit(eval(i))
def main():
    turtle.setup(800,350,200,200)  #当前画布的大小
    turtle.penup()
    turtle.fd(-300)    #当前画笔初始绘制所在的位置
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))   #调用drawDate参数,给他赋予一个参数。其中gmtime为获取当前系统时间
    #time.strftime为时间的格式化进行输出,用来定义输出效果。
    turtle.hideturtle()
    turtle.done()
main()

运行界面如下:

整体思路如下所示:

我们通过这个示例回顾一下,首先我们将画一个数码管的函数drawLine编写出来,之后我们又设立了一个函数drawDigit进行多段数码管的绘制,在这个函数drawDigit里面进行调用drawLine,而且通过对数码管的边的需求的分析,我们通过参数digit去判断所绘制的数码管需要哪段数码管。

之后当绘制出一个独立的数码管后,我们进行绘制给定时间的数码管,我们定义了drawDate函数,通过for循环去遍历该字符串的每一个数字进行调用drawDigit函数去绘制每段数码管。而且由于要进行实际运行,我们编写了主函数,确定了画布大小与画笔宽度,同时在主函数里面进行了drawDate函数的调用。主函数里面调用了drawDate函数,而drawDate函数里面又调用了drawDigit函数,而drawDidit函数里面又调用了drawLine函数,使代码成功运行起来。

之后我们进行获取当前系统时间的数码管的输出,这时,我们进行修改了drawDate函数,我们通过对循环遍历得到的反馈的不同,通过使用if-elif结构进行输出不同格式的数码管。与此同时,我们在主函数里面确定了系统时间的获取方法即输出格式。进行代码的调用,使程序成功运行起来。

举一反三:

理解方法思维:

模块化思维:确定模块接口,封装功能

规则化思维:抽象过程为规则,计算机自动执行

化繁为简:将大功能变为小功能组合,分而治之

应用问题的扩展:

绘制带小数点的七段数码管

带刷新的时间倒计时效果

绘制高级的数码管

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐