编程题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
……
含有3或3连在一起都比较容易,问题是如何判定是否是质数。不过,根据质数筛的原理,把最开始的两个质数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测评参考)
更多资料请点开:
附录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测评参考)