Python大作业条形码

本文介绍了如何利用Python的随机数生成功能创建一个13位ISBN号码,并结合TurtleGraphics库实现条形码的绘制,包括校验码计算和条码规则的应用,以及程序设计中的细节处理。
摘要由CSDN通过智能技术生成

内容提要:

国际标准书号(International Standard Book Number,ISBN)每一本公开发行的书,在封底都有一个10位或13位的编号ISBN。ISBN的最后一位数字称为计算机校验码,相当于奇偶校验位。书店的计算机仅通过查看ISBN的校验码便能判断是否犯了错误,避免买错书。13位ISBN的校验码算法如下:

将第一位乘以1,第2位乘以3,第3位乘以1,第四位乘以3,以此类推,直到第12位乘以3,将各位结果相加之后,取总和的末位数字(即除以10后的余数)后再减去10(如果结果为10,取0)即可。

例如:

ISBN-978-897283571-4

(9×1)+(7×3)+(8×1)+(8×3)+(9×1)+(7×3)+ (2×1)+(8×3)+(3×1)+(5×3)+(7×1)+(1×3)=146

146 ÷ 10= 14  (余6) 10 - 6 = 4

请编写一个条码分析和生成程序,具有以下功能:

1)利用随机函数自动生成一个13位ISBN号,满足检验码规则

2)利用turtle画出该条码,条码编码规则如下图:

成绩评定:

指导教师(签字):

     

     

                                                               

具体内容:

1引言

本课程设计利用随机函数自动生成一个13位ISBN号,满足检验码规则,再利用turtle画出该条码。

2总体设计方案或程序设计思想

  1. 先导入随机数,再定义ISBN()函数,创造空列表。向空列表中添加十二个在(0,9)范围内的随机数。
  2. 利用13位ISBN的校验码算法:将第一位乘以1,第2位乘以3,第3位乘以1,第四位乘以3,以此类推,直到第12位乘以3,将各位结果相加之后,取总和的末位数字(即除以10后的余数)后再减去10(如果结果为10,取0),计算出第十三个数字,并添加入列表中,则满足要求:利用随机函数自动生成一个13位ISBN号,满足检验码规则。
  3. 利用Python Turtle Graphics画图:
  1. 根据字典的特性与ISBN本身性质,设置关于奇偶性字典,根据ISBN分为左右俩边,在左边设置左边奇字符字典与左边偶字符字典,在右边设置右边偶字符字典。
  2. 定义画线。
  3. 定义警戒线,俩种警戒线:一种是左右俩边对称警戒线,一种是中间的警戒线。
  4. 以中间警戒线为分割线,定义函数绘制左半边图像,根据奇偶性不同分别找对应字典画图,并在对应线下写出相应数字。
  5. 定义函数绘制右半边图像,此时无论奇偶只有一种情况,代入对应字典,并在对应线下写出相应数字。
  6. 最后定义函数绘制总图,并设置如笔粗细、画图速度、停笔地点等相应性质。
  1. 运行调试

3 代码

import turtle

#ISBN

import random

def ISBN():

    isbn_list=[]

    for i in range(12):

        n=random.randint(0,9)

        isbn_list.append(n)#随机生成十二位

        s=0

    for i in range(len(isbn_list)):

        if i%2==0:

            s+=int(isbn_list[i])*1

        else:

            s+=int(isbn_list[i])*3

    if s%10==0:

        a=0

    else:

        a=10-(s%10)#按规则计算出第十三位

    isbn_list.append(a)

    return isbn_list

#定义奇偶性

dict_eo={0:["odd","odd","odd","odd","odd","odd"],\

         1:["odd","odd","even","odd","even","even"],\

         2:["odd","odd","even","even","odd","even"],\

         3:["odd","odd","even","even","even","odd"],\

         4:["odd","even","odd","odd","even","even"],\

         5:["odd","even","even","odd","odd","even"],\

         6:["odd","even","even","even","odd","odd"],\

         7:["odd","even","odd","even","odd","even"],\

         8:["odd","even","odd","even","even","odd"],\

         9:["odd","even","even","odd","even","odd"]}

#左边奇字符字典

dict_leftodd={0:"0001101",1:"0011001",2:"0010011",3:"0111101",4:"0100011",\

              5:"0110001",6:"0101111",7:"0111011",8:"0110111",9:"0001011"}

#左边偶字符字典

dict_lefteven={0:"0100111",1:"0110011",2:"0011011",3:"0100001",4:"0011101",\

               5:"0111001",6:"0000101",7:"0010001",8:"0001001",9:"0010111"}

#右边偶字符字典

dict_righteven={0:"1110010",1:"1100110",2:"1101100",3:"1000010",4:"1011100",\

                5:"1001110",6:"1010000",7:"1000100",8:"1001000",9:"1110100"}

#定义画线

def line_draw(code,x,y):

    if code=="1":

        for x in range(x,x+2):

            turtle.goto(x,y)

            turtle.pendown()

            turtle.goto(x,-y)

            x=x+2

            turtle.penup()

    elif code!="1":

        turtle.goto(x+2,y)

        x=x+2

    return x

#定义警戒线

def alert(code,x,y):

    if code=="1":

            for x in range(x,x+2):

                turtle.goto(x,y)

                turtle.pendown()

                turtle.goto(x,-y-10)

                x=x+2

                turtle.penup()

    else:

        turtle.goto(x+2,y)

        x=x+2

    return x

#定义左右俩边警戒线

def alert_lr(x,y):

    n="101"

    for code in n:

        alert(code,x,y)

        x=alert(code,x,y)

    return x

#定义中间的警戒线

def alert_m(x,y):

    n="01010"

    for code in n:

        alert(code,x,y)

        x=alert(code,x,y)

    return x

#定义左半边

def left(ISBN,x,y):

    k=0

    for i in ISBN[1:7]:

        judge=dict_eo[ISBN[0]][k]

        if judge=="odd":

            for code in dict_leftodd[i]:

                line_draw(code,x,y)

                x=line_draw(code,x,y)

        else:

            for code in dict_lefteven[i]:

                line_draw(code,x,y)

                x=line_draw(code,x,y)

        #对应条码下写对应数字

        turtle.goto(x-5,-y-20)

        turtle.write(ISBN[k+1],align="right",font=(14))

        k+=1

    return x

#定义右半边

def right(ISBN,x,y):

    k=7

    for i in ISBN[7:13]:

        for code in dict_righteven[i]:

            line_draw(code,x,y)

            x=line_draw(code,x,y)

        #对应条码下写对应数字

        turtle.goto(x-5,-y-20)

        turtle.write(ISBN[k],align="right",font=(14))

        k+=1

    return x

#画图

def draw_p(ISBN,x,y):

    turtle.penup()

    turtle.goto(x-5,-y)

    turtle.pendown

    turtle.speed(40)

    turtle.write(ISBN[0],align="right",font=(14))

    turtle.penup()

    turtle.goto(-x,y)

    x=alert_lr(x,y)

    x=left(ISBN,x,y)

    x=alert_m(x,y)

    x=right(ISBN,x,y)

    x=alert_lr(x,y)

turtle.pensize(2)

ISBN=ISBN()

print(ISBN)

draw_p(ISBN,-40,50)

turtle.showturtle()

4 测试、调试、运行结果截图

利用Python Turtle Graphics画图:

5 总结

  1. ISBN利用了随机数取出了十二位,再根据之前学习的ISBN的检验可以计算出第十三位数字,但总是会在一些小地方上出差错,特别是代码格式,一些微小的地方需要你去反复调试。
  2. 学会了turtle画图这一新技能,ISBN看着简单,但这个图分成了很多部分去,条码规则很复杂,要设置很多函数,也去参考一些别人的方法去画ISBN这个图。自己一点点去学习怎么调整,怎么设置函数,怎么调整画图的起止,笔的粗细,画图速度……,也慢慢规范了代码书写。
  3. 重新复习了字典和列表的用法,感觉每一种方法都有自己的便利性,还需好好学习。
  4. Python和生活息息相关,你可以利用它去快速解决一些问题,但它又要求你技术过关,我们要在一次次练习中总结提升自己,要有一定耐性,才能从每次编程中进步,才能更好掌握这项编程语言。
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值