第十届蓝桥杯青少组Python省赛真题解

编程题1:

  编程实现

  用1、3、5、8这几个数字,能组成的互不相同且无重复数字的三位数各是多少?共有多少个?

  输入描述:

    

  输出描述:

    多行数字,每行一个三位数

    组成的三位数的总个数

  这是排列问题,第一位从4个数中选一个,第二位从剩下的3个选一个,第三位从剩下的2个选1个。

  程序代码(考试时注释可以不写,下同,文本代码:附录1):

 

  运行结果:

 

 

  这题也可以用树的概念来解决。开始是根节点(不含数字),全部数字都是根节点的子节点,子节点的兄弟节点是该节点的子节点,如此类推。全部的叶子的数量就是结果。如下图,画了根节点的一支子节点,有6片叶子,4支共6×4=24片叶子。别把这些看成高深数学,也许幼儿园学生都懂玩这个!

 

  程序代码(文本代码:附录2

 

 

 

  学过排列的数学的同学(没学过的同学本题以下部分跳过),一定会知道这是一个排列问题。那么Python有无一个函数用于排列的呢?有的,不过不是内置函数,它在itertools标准模块中,名称是排列的英文(复数)permutations

  itertools.permutations(iterable, r=None)

  返回由iterable序列生成长度为 r 的排列。

  如果 r 未指定或为 None r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。

  用排列函数修改程序代码如下(文本代码:附录16)

 

  说到排列,不得不说它的孪生兄弟——组合。把这题改一改:用1,3,5,8四个数字组成三位数,数字保持原来的顺序。例如:135可以,但315不行,因为改变了原来的顺序。也就是说,原来由1、3、5三个元素组成的排列135,153,315,351,513,531只有一个是符合要求的。可见问题转化为在1,3,5,8四个数字取出3个元素构成的组合按原顺构成3位数。用树来解决:

 

  可见,只有4个数符合要求。统计本题排列的集合数代码如下(文本代码:附录17)

 

  结果是4。如果忽略排列的元素先后顺序(即元素相同,位置不同也是同一个结果)得到的集合系列就是“组合”。简单地说,获取系列的r序列是排列;获取系列的r集合是组合。

  itertools也有一个组合的函数“combinations”,不过与数学中的组合有差别:数学中的组合的一个项目是集合,即元素无序的;但combinations的一个迭代项目是序列,即元素有序的(与原系列的顺序相同)。

  itertools.combinations(iterable, r)

返回由输入 iterable 中元素组成长度为 r 子序列

  由此可见,combinations适合本题的改编,代码如下(文本代码:附录18)

 

  结果:

  135

  138

  158

  358

  4

  与作图(树)方法得到的结果相同。

 

编程题2:

  编程实现

  打印出1~1000之间包含3的数字;

  如果3是连在一起的(如233)则在数字前加上&;

  如果这个数字是质数则在数字后加上*,例:(3,13*,23*,&33,43*···&233*···)

  输入描述:

  无

  输出描述:

  按照题意输出的数字,每行一个数字

  样例输出:

    3    13*    23*    &33

    ……

 

  含有33连在一起都比较容易,问题是如何判定是否是质数。不过,根据质数筛的原理把最开始的两个质数2,3放进质数表,然后不是质数表中的倍数第一个也是质数,放进质数表,如此类推。

  程序代码(文本代码:附录3

 

  运行部分结果:

 

 

编程题3:

  编程实现

  让用户在一次输入时输入N个数字(2<=N<=15,即每次输入的数字数量不同),数字之间以英文逗号作为分隔。

  然后组合显示:

  (1)用户输入的数字个数;

  (2)用户输入的最小的数字;

  (3)将用户输入的数字按从大到小进行排列输出,数字之间用英文逗号分隔;

  (4)如果用户输入的数字小于等于26,则找到相对应的26个大写英文字母(1对应“A”,26对应“Z”),并拼接在一起打印显示,如果输入的数字在1~26之外则不显示相应的字母。(例:程序输入214,则显示输出“[bad]”)。

  输入描述:

    N个整数,2<=N<=15

  输出描述:

    输入的数字个数

    输入的最小数字

    输入的数字从大到小排列

    由对应字符拼接而成的字符串

  样例输入:

    4,25,108

  样例输出:

    3

    4

    108,25,4

    DY[bad]

  输入的字符串可以通过str.split(",")分隔为字符串列表,然后把这列表转为数值列表;也可以在输入字符串前加“[”,后加“]”,然后用eval内置函数转为数值列表(实际编程中,eval有安全漏洞,极少使用)。列表长度就是输入数字的个数。用内置函数min(数值列表)可以求出最小值。用列表方法sort(reverse=True)可以从大到小排序。用大写字母字符串作为转换表,就可以把数表示为字母。也可是用ASCII码对照转换。

  程序代码(eval+转换表)(文本代码:附录4

 

  程序代码(map+ASCII)(文本代码:附录5):

 

 

编程题4:

  在Turtle画布上画出5个随机大小的五角星。

  具体要求:

  ·  Turtle画布的大小为:宽800像数,高600像数;

  ·  一共绘制5个五角星;

  ·  每个五角星的在画布内的显示位置是随机的,五角星之间允许产生重叠甚至完全覆盖,但每个五角星都要完整的显示在画布内

  ·  在程序运行过程中应明显看出绘制过程,建议绘图速度为7;

  ·  每个五角星的线段颜色为黑色,线宽为5,边长为[10~150]之间的随机长度,并用黄色填充;

  ·  提示:五角星的每个顶点的内角(锐角)为36度。

  五角星的基本形状如下图所示:

 

  用random模块的intrange函数产生绘制开始位置和五角星的边长。

  程序代码(文本代码:附录6

 

 

  运行结果:

,时长00:11

 

编程题5:

  分形树

  步骤1:

    利用Turtle画出如本题图-1所示的分形树。

    要求:

    ·  树木主干向上生长

    ·  分形层数为4,二叉树

    ·  第一层树枝长度为60,逐层减6;

    · 左右树枝的倾斜角度不限,最终效果与图-1所示大致相同即可。

    ·  必须能看出绘图过程。

 

  海龟裂变法:把海龟朝上,克隆一变二,分别左右30°,前进60;同样裂变4次,逐层减6绘制。

  程序代码(文本代码:附录7):

 

 

  运行结果:

,时长00:09

  单海龟回退法:递归先绘制左子树,回退,然后绘制右子树,回退复位。为了理解回退法,先写一段画一个二叉的程序(文本代码:附录8

 

 

  运行结果:

 

  现在复制drawCross函数,函数体内代码不改,只改变名称为drawCross2,然后加到drawCross“#”处,代码如下(文本代码:附录9

 

 

  运行结果:

 

  可见,一个递归画图函数,删除递归调用行后,海龟在函数运行结束后完全复位。本题的回退法递归代码就可以得到了。

  程序代码(文本代码:附录10):

 

 

  运行结果:

,时长00:09

  回退法由于海龟回退需要时间,所以绘制速度比裂变法慢。回退法逻辑上比裂变法稍微复杂些。

  步骤2

  一、修改步骤1中生成分形树的方法:

  ·  分形层数改为4~6之间的随机数

  ·  第一层树枝长改为30~60之间的随机数

  二、绘制分形树丛

  ·  800×600的屏幕中绘制分形树丛;

  ·  树木数量为50棵;

  ·  每棵分形树的树根位置为屏幕范围内随机坐标点,树枝允许伸到屏幕窗口外;

  ·  以屏幕中心垂直线为分界,位于左侧的树木向左倾斜,位于屏幕右侧的树木向右倾斜

  ·  绘制过程瞬间完成(即看不到绘画过程)

  整体绘制样例如本题图-2所示。  

 

 

  由于层数改为随机数,因此采用倒序计数法,当层数计数为0是结束递归;开始长度也改为随机数,所以递归函数要增加一个长度输入参数length;要倾斜,则左右子树的偏角在同一侧,定为偏向方20°,偏离方10°

  回退法代码(文本代码:附录11):

 

 

  运行结果:

,时长00:04

  裂变法代码(文本代码:附录12):

 

  运行结果:

,时长00:08

  代码裂变法比较简单,但运行效率很差,要10秒才能完成;回退法代码比较复杂,但运行效率比较高,打开绘图就完成。

 

  思考:如果不小心把回退法的代码搞成下面的样子,请问还能绘制出树丛来吗?如果能,那左边和右边的树丛还有区别吗?(文本代码:附录13

 

 

 

编程题6:

  编程实现:商品管理系统

  预先准备:  建立 userpass.txt  预先建立并存储用户信息文件,文件内容格式:以英文逗号分隔的一组用户名和密码信息,例如:  ahngsan,123456  建立 goods.txt  以自定义格式储存3个商品的消息(每个商品包含:商品名称,商品类型,商品库存)。   文件内容样例(仅供参考)  001,商品1,类型1,10;002,商品2,类型1,5;商品3,类型2,20  系统登录:  ·  显示一个6位随机数(验证码),并提示用户输入用户名、密码和刚刚显示的验证码;  ·  如果用户输入的用户名和密码与userpass.txt文件中的信息相符合,且验证码也和提示的6位验证码相符合,则继续程序进入系统主界面的初始状态(见下文中的“系统主界面”->“初始状态”部分),例如以下过程:  说明:以        为背景的内容是程序输出,____内容为用户输入:    您的登录验证码为 386597    请输入用户名:zhangsan    请输入密码:123456    登录验证码:386597    身份验证通过,欢迎登录!  ·  如果用户输入的用户名和密码与userpass.txt文件中的信息不符合,或者验证码和提示的6位验证码不符合,则登录不成功,提示身份验证失败,退出程序。例如以下过程:  说明:以        为背景的内容是程序输出,____内容为用户输入:    您的登录验证码为 386597    请输入用户名:zhangsan    请输入密码:123456    登录验证码:386597    身份验证失败!    >>> 

 

  用with open(filename,"r") as file句型按行(for line in file)读入一行数据,用str.split(",")把每行分隔为列表,最后一项需要用str.rstrip("\n")消除换行符,放到密码字典中。用in句型判定用户是否在用户密码表中,然后取出密码进行对照,再核对验证码,全部通过了就可以登录了。

  文件内容:

 

  程序代码(文本代码:附录14):

 

 

  运行结果:

 

 

 

   系统主界面:

  ·  初始状态:显示从文件中读取所有商品的信息(包括商品编号,商品名称,商品类型,库存数量),并以“::”提示输入命令。

  ·  如果输入“add”,则添加商品,要求客户输入商品编号,商品名称,商品类型,库存数量,输入时须判断所有输入项不能为空,且库存数量必须为数字格式,输入后减所添加的商品存入文件,并回到初始状态

  ·  如果输入“count”,则计算并输出所有商品库存数量之和,并回到初始状态

  ·  如此循环。

   注意:在程序运行过程中,不论用户如何输入都不会出现红色error导致的程序异常结束(利用try/except语句)。

  add 命令的输入输出过程可以自行设计,输入输出样例(仅供参考)例如:

  说明:以        为背景的内容是程序输出,____内容为用户输入:

   ::add

   商品编号:004

   商品名:商品4

   商品类型:类型3

   库存数量:30

   001,商品1,类型1,10

   002,商品2,类型1,5

   003,商品3,类型2,20

   004,商品4,类型3,30

   ::

   count 命令的执行过程例如:

  说明:以        为背景的内容是程序输出,____内容为用户输入:

   ::count

   65

   001,商品1,类型1,10

   002,商品2,类型1,5

   003,商品3,类型2,20

   004,商品4,类型3,30

   ::

 

  每行一个商品,读入文件内容与上一部分一样。用一个列表保存一个商品的信息,用列表的列表保存全部商品。永续循环while True内是try/except句子,使输入错误也不会退出。打印商品时,用str.join(除了最后一个库存数据的商品列表),库存数据另外打印(当然也可以剪切除了最后一个库存数据的商品列表,然后把库存数据转为字符串加到新商品列表后,用str.join转换为字符串后打印。)

  文件内容:

 

  程序代码(文本代码:附录15):

 

 

 

  运行结果:

 

  

 

已发蓝桥杯真题解(可作为STEMA测评参考):

第十四届蓝桥杯青少组Python国赛真题解(全卷2023-8-2)(可作为STEMA测评参考)

第十四届蓝桥杯青少组Python省赛真题解(可作为STEMA测评参考)

第十三届蓝桥杯青少组Python国赛真题解(可作为STEMA测评参考)

第十三届蓝桥杯青少组Python省赛真题解(可作为STEMA测评参考)

第十二届蓝桥杯青少组Python国赛真题解(可作为STEMA测评参考)

第十二届蓝桥杯青少组Python省赛真题解(可作为STEMA测评参考)

第十一届蓝桥杯青少组Python国赛真题解(可作为STEMA测评参考)

第十一届蓝桥杯青少组Python省赛真题解(可作为STEMA测评参考)

 

更多资料请点开:

学思营有关链接和群(2023-8-5)

 

附录1

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题1ds = [1,3,5,8]  #数字count = 0  #总数slen = len(ds)for i in range(slen):  #选第一位    d1 = ds[i]    for j in range(slen):  #选第二位        if j == i:            continue        d2 = ds[j]        for k in range(slen):  #选第三位            if k == i or k==j:                continue            d3 = ds[k]            print("%d%d%d" % (d1,d2,d3))            count += 1print(count)

 

附录2

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题1树递归算法ds = ["1","3","5","8"]  #数字maxNum = 3  #数字个数count = 0  #总数def listNum(father, sublst, num):    '''@father前导数字@sublst子列表@num当前操作位数'''    global count    slen = len(sublst)    if num == maxNum:  #达到最大位数        count += slen  #累计个数        for n in sublst:  #打印这一组            print(father+n)    else:        for n in range(slen):            if n == 0:  #复制兄弟节点,注意不可以修改原来的列表                nextSublst = sublst[1:]            elif n == slen-1:                nextSublst = sublst[:slen-1]            else:                nextSublst = sublst[:n]+sublst[n+1:]            listNum(father+sublst[n], nextSublst, num+1)  #递归调用listNum("", ds, 1)  #第一层开始调用           print(count)

 

附录3

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题2    oddTab = [2,3]  #质数表print("3*") for num in range(4,1001):    isOdd = False    for odd in oddTab:  #判定这数是不是质数        if num % odd == 0:            break    else:  #如果质数表中无因数,则它是质数        oddTab.append(num)        isOdd = True    s = str(num)    if "3" in s:        if "33" in s:            s = "&" +s        if isOdd:            s +="*"        print(s)

 

附录4

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

nlst = eval("["+input()+"]")N = len(nlst)  #输入数字个数charsTab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  #大写字母表slst = [] #转换后字符列表for n in nlst:    if 1<=n<=26:  #如果是1到26变为字母        slst.append(charsTab[n-1])    else:        slst.append("[bad]")
nlst.sort(reverse=True)  #倒序排序,原列表变为有序列表
print(N) #打印输入数字个数print(nlst[-1])  #打印最小值print(",".join(map(str,nlst)))  #打印倒序表print("".join(slst))   #打印转换后字符串

 

附录5

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

nlst = list(map(int, input().split(",")))N = len(nlst)  #输入数字个数d = ord('A') - 1 #ASCII码平移数slst = [] #转换后字符列表for n in nlst:    if 1<=n<=26:  #如果是1到26变为字母        slst.append(chr(n+d))    else:        slst.append("[bad]")
nlst.sort(reverse=True)  #倒序排序,原列表变为有序列表
print(N) #打印输入数字个数print(nlst[-1])  #打印最小值print(",".join(map(str,nlst)))  #打印倒序表print("".join(slst))   #打印转换后字符串

 

附录6

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题4from turtle import *  #导入海龟全部名字空间import random as rd  #导入伪随机数模块,重名为rdsetup(900,700)  #设置窗口大小screensize(800,600)  #设置画布大小speed(7)  #设置速度中上#生成边长大小列表10到150starSizes = [rd.randrange(10,151) for i in range(5)]#从水平线第三点开始向右,右边距150,左边界300,上边距150,下边距300starStartPositions = [(rd.randrange(-100,250),rd.randrange(0,150)) for i in range(5)]fillcolor("yellow")  #设置填充颜色为黄色pensize(5)  #设置画笔大小5pencolor("black")  #设置画笔颜色黑色for i in range(5):  #画五角星    up()  #提笔    ps = []  #内正五边形位置收集器    setpos(starStartPositions[i])  #把海龟移动到开始点    sz = starSizes[i]  #五角星边长    begin_fill()  #开始填充    down()  #下笔    seth(0)  #设置方向水平向右    for j in range(5):   #画封闭五角星        fd(sz)  #前        right(144)  #右转        fd(sz)        left(72)  #左转        ps.append(position())  #记录位置,最后回到出发点    end_fill()  #结束填充    for p in ps:  #画正五边形        setpos(p)mainloop()  #保持图形不退出

 

附录7

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5import turtle as t  #导入海龟t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.speed(7)  #设置速度中上t.ht()t.up()t.setpos(0,-120)  #开始位置t.down()t.seth(90)  #海龟朝上def draw(t1, n):    t2 = t1.clone()  #克隆海龟    t1.left(30)  #其中一个海龟左转30    t2.right(30)  #另一个海龟右转30    t1.fd(60-n*6)  #长度递减6    t2.fd(60-n*6)    if n == 3:  #四层结束        return    draw(t1, n+1)  #递归调用    draw(t2, n+1)draw(t, 0)  #绘制首层  t.mainloop()  #保持图形

 

附录8

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-绘制二叉import turtle as t  #导入海龟t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.speed(7)  #设置速度中上t.up()t.setpos(0,-120)  #开始位置t.down()t.seth(90)  #海龟朝上90度def drawCross():       t.left(30)    t.fd(60)  #前进    #    t.fd(-60)  #回退    t.right(60)    t.fd(60)    #    t.fd(-60)  #回退    t.left(30)drawCross()  #绘制二叉t.mainloop()  #保持图形

 

附录9

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-绘制双层二叉import turtle as t  #导入海龟t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.speed(7)  #设置速度中上t.up()t.setpos(0,-120)  #开始位置t.down()t.seth(90)  #海龟朝上90度def drawCross():       t.left(30)    t.fd(60)  #前进    drawCross2() #    t.fd(-60)  #回退    t.right(60)    t.fd(60)    drawCross2() #    t.fd(-60)  #回退    t.left(30)
def drawCross2():       t.left(30)    t.fd(60)  #前进    #    t.fd(-60)  #回退    t.right(60)    t.fd(60)    #    t.fd(-60)  #回退    t.left(30)
drawCross()  #绘制双层二叉t.mainloop()  #保持图形

 

附录10

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-1import turtle as t  #导入海龟t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.speed(7)  #设置速度中上t.up()t.setpos(0,-120)  #开始位置t.down()t.seth(90)  #海龟朝上90度def drawTree(level):    if level == 4:        return         t.left(30)    tpl = 60-level * 6    t.fd(tpl)  #前进    drawTree(level+1)  #递归调用    t.fd(-tpl)  #回退    t.right(60)    t.fd(tpl)    drawTree(level+1)    t.fd(-tpl)  #回退    t.left(30)drawTree(0)  #绘制首层  t.mainloop()  #保持图形

 

附录11

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-2回退法import turtle as t  #导入海龟import random as rd  #导入随机模块t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.tracer(False)  #瞬间完成,即绘制时不更新屏幕t.speed(0)  #设置速度最快#偏向左的树绘制def drawLeftTree(level, length):    if level == 0:        return         t.left(20)  #左树偏20    t.fd(length)  #前进    drawLeftTree(level-1, length-6)  #递归调用    t.fd(-length)  #回退    t.right(10)  #右树偏20-10=10    t.fd(length)    drawLeftTree(level-1, length-6)    t.fd(-length)  #回退    t.right(10)  #复位#偏向右的树绘制def drawRightTree(level, length):    if level == 0 or length <= 0:        return         t.right(10)  #左树偏10    t.fd(length)  #前进    drawRightTree(level-1, length-6)  #递归调用    t.fd(-length)  #回退    t.right(10)  #右树偏10+10=20    t.fd(length)    drawRightTree(level-1, length-6)    t.fd(-length)  #回退    t.left(20)  #复位#随机绘制50棵树for i in range(50):    pos = (rd.randint(-300,300), rd.randint(-300,200))  #根位置    level = rd.randint(4, 6)  #层数    length = rd.randint(30, 60)  #长度    t.up()    t.setpos(pos)    t.seth(90)  #海龟朝上90度    t.down()    if pos[0] < 0:        drawLeftTree(level, length)    else:        drawRightTree(level, length)t.mainloop()  #保持图形

 

附录12

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-2裂变法import turtle as t  #导入海龟import random as rd  #导入随机模块t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.tracer(False)  #瞬间完成,即绘制时不更新屏幕t.speed(0)  #设置速度最快t.ht()  #隐藏海龟#偏向左isLeft=Truedef drawTree(t1, level, length, isLeft):    if level == 0 or length <= 0:        return       t2 = t1.clone()      if isLeft:        t1.left(20)  #左树偏20        t2.left(10)  #右树偏10    else:        t1.right(10)  #左树偏10        t2.right(20)  #右树偏20            t1.fd(length)  #前进    t2.fd(length)      drawTree(t1, level-1, length-6, isLeft)  #递归调用    drawTree(t2, level-1, length-6, isLeft)#随机绘制50棵树for i in range(50):    pos = (rd.randint(-300,300), rd.randint(-300,200))  #根位置    level = rd.randint(4, 6)  #层数    length = rd.randint(30, 60)  #长度    t.up()    t.setpos(pos)    t.seth(90)  #海龟朝上90度    t.down()    drawTree(t, level, length, pos[0] < 0)t.mainloop()  #保持图形

 

附录13

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题5-2回退法思考题import turtle as t  #导入海龟import random as rd  #导入随机模块t.setup(900,700)  #设置窗口大小t.screensize(800,600)  #设置画布大小t.tracer(False)  #瞬间完成,即绘制时不更新屏幕t.speed(0)  #设置速度最快#偏向左的树绘制def drawLeftTree(level, length):    if level == 0:        return         t.left(20)  #左树偏20    t.fd(length)  #前进    drawRightTree(level-1, length-6)  #递归调用    t.fd(-length)  #回退    t.right(10)  #右树偏20-10=10    t.fd(length)    drawRightTree(level-1, length-6)    t.fd(-length)  #回退    t.right(10)  #复位#偏向右的树绘制def drawRightTree(level, length):    if level == 0 or length <= 0:        return         t.right(10)  #左树偏10    t.fd(length)  #前进    drawLeftTree(level-1, length-6)  #递归调用    t.fd(-length)  #回退    t.right(10)  #右树偏10+10=20    t.fd(length)    drawLeftTree(level-1, length-6)    t.fd(-length)  #回退    t.left(20)  #复位#随机绘制50棵树for i in range(50):    pos = (rd.randint(-300,300), rd.randint(-300,200))  #根位置    level = rd.randint(4, 6)  #层数    length = rd.randint(30, 60)  #长度    t.up()    t.setpos(pos)    t.seth(90)  #海龟朝上90度    t.down()    if pos[0] < 0:        drawLeftTree(level, length)    else:        drawRightTree(level, length)t.mainloop()  #保持图形

 

附录14

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题6-1from random import randintusers = {}  #用户密码with open("userpass.txt", "r") as u:  #从文件中装置用户和密码    for line in u:   #读取一行        up = line.split(",")  #把用户和密码分开        users[up[0]] = up[1].rstrip("\n")  #去除换行符后加入密码表中signNum = randint(100000,999999)  #验证码,注意是闭区间print("您的登录验证码为%d" % signNum)print("请输入用户名:", end = "")name = input()print("请输入密码:", end = "")key = input()print("登录验证码:", end = "")sign = int(input())if name in users and users[name] == key and sign == signNum:    print("身份验证通过,欢迎登录!")

 

附录15

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#省赛10编程题6from random import randintusers = {}  #用户和密码#从文件中装置用户和密码with open("/5xstar/jtrclient/pysrc/省赛12/userpass.txt", "r") as u:      for line in u:   #读取一行        up = line.split(",")  #把用户和密码分开        users[up[0]] = up[1].rstrip("\n")  #去除换行符后加入密码表中signNum = randint(100000,999999)  #验证码,注意是闭区间print("您的登录验证码为%d" % signNum)name = input("请输入用户名:")key = input("请输入密码:")sign = int(input("登录验证码:"))if name in users and users[name] == key and sign == signNum:    print("身份验证通过,欢迎登录!")    goods = []  #商品    joinStr = ","  #分隔符    #装载已有商品    with open("/5xstar/jtrclient/pysrc/省赛12/goods.txt", "r") as g:         for line in g:   #装载已有商品            gd = line.rstrip("\n").split(",")  #把一行取换行符后分开项目            gd[3] = int(gd[3])            goods.append(gd)    while True:  #提供命令行        try:            com = input("::")            if com == "add":  #添加商品                gd = []                gd.append(input("商品编号:"))                gd.append(input("商品名:"))                gd.append(input("商品类型:"))                gd.append(int(input("库存数量:")))                goods.append(gd)                for item in goods:  #打印商品                    print(joinStr.join(item[:3]), end = ",")                    print(item[3])            elif com == "count":                count = 0                for item in goods:                    count += item[3]                print(count)                        for item in goods:                    print(joinStr.join(item[:3]), end = ",")                         print(item[3])                       except:            print("输入错误!")                else:    print("身份验证失败!")

 

附录16

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import itertools  #导入高效迭代生成工具模块#生成排列迭代对象ps = itertools.permutations(["1","3","5","8"], 3)#统计迭代数,即排列数count = 0for p in ps:  #调用迭代    print("".join(p))  #打印一个排列    count += 1  #排列数量加1
print(count)  #打印排列总数

 

附录17

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import itertools  #导入高效迭代生成工具模块#生成排列迭代对象ps = itertools.permutations(["1","3","5","8"], 3)#统计迭代不重复集合s = []for p in ps:  #调用迭代    print("".join(p))  #打印一个排列    t = set()    for i in p:  #把一个迭代项目变为集合        t.add(i)    if s.count(t) == 0:  #如果该集合不在列表中,加入列表        s.append(t)
print(len(s))  #打印不重复的集合数

 

附录18

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import itertools  #导入高效迭代生成工具模块#生成组合迭代对象cs = itertools.combinations(["1","3","5","8"], 3)#统计组合数count = 0for c in cs:  #调用迭代    print("".join(c))  #打印一个组合    count += 1
print(count)  #打印组合数

收录于合集 #python

 80个

上一篇第十一届蓝桥杯青少组Python省赛真题解(可作为STEMA测评参考)下一篇蓝桥杯青少组Python编程练习题解 第一集(可作为STEMA测评参考)