一、考试背景 1.青少年编程能力等级标准 为深入贯彻《新一代人工智能发展规划》和《中国教育现代化2035》中关于青少年人工智能教育的相关要求,推动青少年编程教育的普及与发展,支持并鼓励青少年树立远大志向,放飞科学梦想,投身创新实践,加强中国科技自主创新能力的后备力量培养,中国软件行业协会、全国高等学校计算机教育研究会、全国高等院校计算机基础教育研究会、中国青少年宫协会四个全国一级社团组织联合立项并发布了《青少年编程能力等级》团体标准第 1 部分和第2 部分。其中,第1 部分为图形化编程(一至三级),第 2 部分为Python 编程(一至四级)。《青少年编程能力等级》作为国内首个衡量青少年编程能力的标准,是指导青少年编程培训与能力测评的重要文件。 表 0-1 为图形化编程能力等级划分。 表 0-1 表0-2 为Python 编程能力等级划分。 表 0-2 《青少年编程能力等级》中共包含图形化编程能力要求103 项,Python 编程能力要求 48 项。《青少年编程能力等级》标准第 2 部分详情请参见附录A。 2 2.NCT 全国青少年编程能力等级测试 NCT 全国青少年编程能力等级测试是国内首个通过全国信息技术标准化技术委员会教育技术分技术委员会(暨教育部教育信息化技术标准委员会)《青少年编程能力等级》标准符合性认证的等级考试项目。它是围绕Kitten、Python 等在国内外拥有广泛用户基础的热门通用编程工具和编程语言,从逻辑思维、计算思维、创造性思维三个方面考查学生的编程能力水平,旨在以专业、完备的测评系统推动标准的落地,以考促学,以评促教。它除了注重学生的编程技术能力外,更加重视学生的应用能力和创新能力。 NCT 全国青少年编程能力等级测试分为图形化编程(一至三级)和Python 编程(一至四级)。 二、Python语言编程二级报考说明 1.报考指南 考生可以登录NCT 全国青少年编程能力等级测试的官方网站,了解更多信息,并进行考试流程演练。 (1)报考对象 ①面向人群:年龄为8~18 周岁,年级为小学三年级至高中三年级的青少年群体。 ② 面向机构:中小学校、中小学阶段线上及线下社会培训机构、各地电教馆、少年宫、科技馆。 (2)考试方式 ① 上机考试。 ②考试工具:海龟编辑器(下载路径:NCT 全国青少年编程能力等级测试官方网站→考前准备→软件下载)。 (3)考试合格标准 满分为100 分。60 分及以上为合格,90 分及以上为优秀,具体以组委会公布的信息为准。 (4)考试成绩查询 登录 NCT 全国青少年编程能力等级测试官方网站查询,最终成绩以组委会公布的信息为准。 (5)对考试成绩有异议可以申请查询 成绩公布后3 日内,如果考生对考试成绩存在异议,可按照组委会的指引发送异议信息到组委会官方邮箱。 (6)考试设备要求考试设备要求如表0-3 所示。 表 0-3 1)单项选择题 (1)考查方式根据题干描述,从四个选项中选择最合理的一项。 4 绪 论 (2)例题下列说法中错误的是(  )。 A.模块化设计一般有紧耦合和松耦合两个基本要求 B.函数可以作为一种代码封装,被其他程序调用 C.文件只有文本文件 D.当类的名称有多个单词时,可以使用“驼峰式命名法”命名答案:C2)操作题 (1)考试形式根据题干要求编写程序(注意:输入/ 输出的格式)。 (2)例题 ①小明遇到一个数学难题:输入一个正整数 n,输出 0! + 1! + 2! +…+ n! 的值。 请帮忙编写一个 Python 程序,帮助小明解决这个难题。 程序要求如下。 输入:输入一个正整数 输出:输出 0! + 1! + 2! +…+ n! 的值 提示:n! 表示正整数 n 的阶乘,指从 1 乘以 2 乘以 3 乘以 4 一直乘到 n 的值, 例如 4! =1 × 2 × 3 × 4=24。注意,0! 的值为 1。示例 1 :输入 1 输出 2 示例 2 :输入 4 输出 34 参考答案: def fac(n): if n <= 1: return 1 else: return n*fac(n-1) def Fsum(n): if n == 1: return 2 elif n == 0: return 1 else: return fac(n)+Fsum(n-1) num = int(input()) print(Fsum(num)) ②分形二叉树是体现递归算法的经典案例。请使用turtle 库和递归算法,绘制出图0-1 所示图形。 图 0-1 参考答案: import turtle as t def draw_tree(branch_length): if branch_length > 5: t.forward(branch_length) t.right(20) draw_tree(branch_length-20) t.left(40) draw_tree(branch_length-20) t.right(20) t.backward(branch_length) t.left(90) t.up() t.backward(200) t.down() t.color('green') draw_tree(100) t.done() 三、备考建议 NCT 全国青少年编程能力等级测试Python 语言编程二级考查内容依据《青少 年编程能力等级》标准第 2 部分 Python 语言编程二级制定。本书的专题与标准中的 能力要求对应,表 0-5 给出了对应关系及建议学习时长。 表 0-5 续表 模块化编程 能力考评方向 知识结构导图 (一)模块化编程思想 了解模块化编程之前,先梳理一下“模块”的定义。模块就是某个事物的一部分。 如果某个事物可以被容易地分解成多个部分,我们就说这个事物是可模块化的。 模块化编程是一种程序设计的思路和方法。例如,将大象装进冰箱一共分几步 的问题,解决这个问题可以分为三步:第一步打开冰箱门,第二步放入大象,第三 步关上冰箱门。如果把这三个步骤当作模块,主程序就是要把这几个单独的模块联 系到一起,相互配合以完成完整程序,如图1-1 所示。 (2)提高代码复用率,独立的模块也可以在其他程序中被使用,下次使用无须编写重复代码,就像用同一堆积木可以搭建出不同的效果一样。 (3)易于扩展程序和维护程序,更方便我们阅读、修改和优化代码。 前面将大象装进冰箱的例子,也可以改为将小兔子或小狗放入冰箱,模块可以被其他程序快速复用,以提高编程效率。 (二)自顶向下的设计方法 所谓自顶向下的设计,就是设计者从整体规划整个系统的功能和性能,然后对 系统进行划分,分解为规模较小、功能较为简单的局部模块,并确立这些模块之间 的相互关系。 如图1-2 所示,学校要宣布一项通知,为确保把通知传达给每位学生,可以 逐层向下监督进行:①校领导下发通知给班主任;②各班主任下发通知给各班干 部;③最终由各班干部通知每位学生。 图 1-2 (三)利用模块化编程思想去分析和解决实际问题 1.实际问题的解决 利用模块化编程的思想和方法,可以帮助我们更好地解决生活中的问题。例如, 小明要给学校足球赛参赛的 10 支队伍安排比赛顺序和场次,要求球队随机组合且不 能重复。 我们可以将小明遇到的问题分解为四个小任务(见图1-3): ① 给每支队伍编号; ② 随机抽取两个编号; ③ 安排组队,确认顺序; 12 ④剩下的队伍继续抽取编号。如果使用程序来解决这个问题,其中划分出来的②③④任务中又有很多细节需要注意。任务②随机抽取:队伍的编号需要用列表存储;需要用到random 库,使用 random.choice( ) 函数随机抽取列表项;抽取的结果要保存下来。任务③队伍组合:先抽取编号的队伍先进行比赛,按顺序把组队结果输出。任务④继续抽取:抽取出来的队伍将不能包含在下次抽取随机数的列表中,需 要用到列表的操作——删除列表项;设置抽取结束的条件——原始的队伍编号列表中没有元素。 图 1-3 拆分出所有的模块后,接下来开始编写程序。在编写过程中还需要确认更多细节,如设置多少个变量等,完整的程序可参考示例代码。示例代码 1-1 import random team_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']s_list = []i = 0#随机抽取,按顺序保存到新列表while (len(team_list) > 0): a = random.choice(team_list) #从team_list中随机抽取一项 del team_list[team_list.index(a)] s_list.append(a) print('出场顺序为:')#print(s_list)for i in range(0, 10, 2): print(s_list[i],s_list[i+1]) 运行程序后,输出结果如图 1-4 所示。 注意:由于排序是随机的,所以输出结果不唯一,该图仅供参考。 图 1-4 2.模块化编程设计原则 模块化编程设计要遵循一定的原则:模块之内高内聚、模块之间低耦合。 高内聚是指在划分模块时把联系紧密的功能放入一个程序文件,每一个模块只需完成单独的功能。低耦合是指模块之间要相互独立,除主程序外,减少模块间的相互协助和影响,如图1-5 所示。一般内聚程度越高,耦合程度就越低。 图 1-5 如果程序较为复杂,还需要有优化完善程序的过程,检查程序的耦合程度也是重要的一项。比如将示例代码1-1 继续进行优化修改,将功能划分时的第①步随机抽取和第④步继续抽取功能放在一起,定义为函数choice_lis(),第③步队伍组合的 功能定义为函数p_lis(),优化后的程序如示例代码 1-2 所示。示例代码 1-2 import random #随机抽取,参数为列表,抽取次数由列表长度决定def choice_lis(l): while (len(l) > 0): a = random.choice(team_list) #变量a为局部变量 del team_list[team_list.index(a)] s_list.append(a) def p_lis(l): print('出厂顺序为:') for i in range(0, len(l), 2): print(l[i],l[i+1]) #主程序 #定义原始列表和空列表 team_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] s_list = [] choice_lis(team_list) p_lis(s_list) 定义函数中的参数一般和耦合程度紧密相关。示例代码1-2 中的参数team_list、s_list 把函数 choice_lis()、函数 p_lis() 和主程序联系起来,函数 choice_lis() 和函数p_lis() 的功能基本不会相互影响,该程序耦合度低。 运行程序后,输出结果如图 1-6 所示。 注意:由于排序是随机的,所以输出结果不唯一,该图仅供参考。 考题 1 (多选)下列说法中错误的是(  )。 A.模块化设计一般有紧耦合和松耦合两个基本原则 B.函数可以作为一种代码封装被其他程序调用 C.文件只有文本文件 D.当类的名称有多个单词时,可以使用“驼峰式命名法”命名 ※ 核心考点 考点:模块化编程 ※ 思路分析 本题考查对模块化编程、函数、文件、类等基础概念的理解。 ※ 考题解答 模块化设计有高内聚和低耦合两个基本原则,所以选项 A 错误;文件不只有文本文件,还包括图片、音频、视频等,所以选项C 错误;选项B、D 正确。故选 A、C。 考题2 在 Python 中,存在函数bin() 可以将十进制数转换成以 0b 开头的二进制数。例如,使用函数bin() 可以将十进制数2 转换成二进制数是0b10,将十进制数3 转换成二进制数是 0b11 。 函数bin() 使用示例如下: a = 3 #3是十进制数print(bin(a))b = 2 #2是十进制数print(bin(b)) 运行程序后,输出结果如图 1-7 所示。 16 图 1-7 请根据以上提示,按要求设计一个程序: (1)分两次输入,每次输入一个十进制整数,假设输入的两个整数为 x,y ; (2)程序随机生成一个介于 x,y 之间(包含 x,y)的十进制整数; (3)程序输出这个十进制整数及对应的二进制数。示例如下。输入格式:分两次输入,每次输入一个十进制整数。输出格式:输出两个数,第一个为十进制数,第二个为它的二进制数,中间用一个空格 隔开。输入样例1 : 3 6 输出样例1 : 4 0b100 输入样例2 : 3 1 输出样例2 : 2 0b10 ※ 核心考点 考点:模块化编程 ※ 思路分析 本题程序采用“自顶向下,分而治之”的思路进行编写。按照题目给出的要求,逐步编写代码。第一步:使用函数input(),分两次输入;使用函数int(),得到十进制的整数;定义变量x 和y 存储整数。第二步:使用random 库的函数randint(),随机生成整数,用户输入得到的两个整数正好作为函数参数,用来规定随机取整的范围。注意,函数randint() 的范围只能是从小到大,因此要判断输入的整数大小,重新赋值,使函数randint() 的参数小的在前,大的在后。第三步:使用函数bin() 将十进制整数转换为二进制数。第四步:使用函数print() 将计算结果输出。 ※ 考题解答 根据思路分析,需要进行两次输入,用到数据类型转换、条件判断,计算完毕后输出,分步骤完成程序。参考答案1 : import randomx = int(input("请输入一个整数:"))y = int(input("再输入一个整数:"))if x <= y: x, y = x, y else: x, y = y, x a = random.randint(x, y) print(a,bin(a)) 参考答案 2 : import randomx = int(input("请输入一个整数:"))y = int(input("再输入一个整数:"))if x > y: x, y = y, x a = random.randint(x, y) print(a,bin(a)) 1.下列关于模块化编程的说法,正确的是(  )。 A.模块化编程是指将程序随意分为几个程序文件 B.自顶向下是一种程序设计方法,用自顶向下方法设计出的程序必须只使用一个程序文件 C.模块化编程让程序结构变得清晰,有利于编写复杂的程序,便于优化程序 D.自顶向下的程序设计方法不利于优化程序 2.图1-8 是一个布满星星的背景墙,十颗星星随机排布。要绘制这个画面,你会把这个问题分为几步? def ballon(c): #参数c表示颜色字符串 t.pencolor(c) for i in range(5): t.forward(50) t.left(144) t.done() #安排布局 def change_location(): x = random.randint(-300,300) y = random.randint(-200,200) return [x,y] #返回坐标列表