2026信息素养大赛:校园智能图书管理员解析

引言:一个让图书角"自己会说话"的项目

班级图书角的书越来越多,靠手工登记借阅,常常出现"书明明在架上却找不到记录""明明没借出去却显示已借出"的尴尬。能不能用图形化编程做一个智能图书管理员,让录入、检索、借阅、归还、统计全部自动完成?

这正是全国青少年信息素养大赛编程操作题最典型的考查场景------用数据管理解决身边的真实问题 。全国青少年信息素养大赛由中国电子学会主办,是世界机器人大会青少年机器人设计与信息素养大赛的信息素养类赛事,连续多年入选教育部面向中小学生的全国性竞赛白名单,公益免费。其算法应用主题赛允许小学组选择图形化或 Python 语言参赛,复赛与决赛采用"客观题 + 4 道编程操作题"的形式(操作题合计 70 分,小学低年级组 90 分钟、小学高年级组 120 分钟),考点对标中国电子学会《青少年软件编程等级评价指南(第 2 部分:图形化编程)》一至三级------列表、循环、条件、变量、自制积木、广播,一个都不能少。

2026 年赛季(报名 3---4 月、初赛 5 月、复赛 6---7 月、总决赛 8 月)已收官,而大赛"每年一 cycle"的节奏固定,现在正是按官方考纲和真题风格复盘练兵的黄金窗口。本文以大赛编程操作题的风格,原创一道图形化项目题------校园智能图书管理员,带大家完整拆解。

一、题目与项目目标

1.1 题目描述

学校图书角要配置一个"智能图书管理员"程序,实现以下功能:

  1. 录入图书:输入书名与作者,把新书加入馆藏;
  2. 检索图书:输入关键词,找出所有书名包含该关键词的书;
  3. 借书:输入书名办理借阅,记录借阅人;已借出的书要拒绝再次借出;
  4. 还书:输入书名办理归还,释放借阅记录;
  5. 统计:随时播报馆藏总数、在馆数量、已借出数量。

1.2 界面设计建议

  • 舞台背景:画一个书架与操作台,左右两侧放置五个按钮(录入 / 检索 / 借书 / 还书 / 统计);
  • 书目显示角色:负责把馆藏列表渲染到舞台上;
  • 管理员角色:承载全部逻辑脚本(也可直接写在背景上);
  • 播报员角色:只负责"说话",是逻辑与表现分离的关键角色。

二、核心考点

这道题覆盖图形化等级考试与信息素养大赛的高频考点,一个项目全部练到:

考点 具体知识 在项目中的体现
列表 平行列表、增删改查、列表长度 书名 / 作者 / 状态 / 借阅人四张平行列表
循环 重复执行 n 次、遍历全表 刷新显示、模糊检索、统计计数、线性查找
条件 如果...那么...否则、嵌套判断 已借出拦截、空关键词拦截、未找到提示
变量 全局变量记录中间状态 馆藏总数、找到下标、关键词、操作中闸门
自制积木 封装可复用流程 录入图书、刷新显示、检索图书、借书、还书、统计
广播 消息机制解耦 刷新、借书成功、还书成功、未找到、已借出
侦测 询问并等待、回答 所有用户输入统一走"询问"对话框
运算 连接、包含、比较 多行文本拼接、"书名包含关键词"模糊匹配

三、解法拆解

3.1 数据结构:四张平行列表

一本书的信息拆成四个字段,用平行列表存储------第 i 项在所有列表中都属于同一本书:

  • 书名列表:西游记、昆虫记、......
  • 作者列表:吴承恩、法布尔、......
  • 状态列表:0 表示在馆,1 表示已借出;
  • 借阅人列表:借阅人姓名,未借出时为空字符串。

再建一个 检索结果 列表,专门存放检索命中的书目下标。

为什么不用一张列表存整本书的信息? 也可以把"书名|作者|状态|借阅人"拼成一个字符串存入一张列表,但后续按状态筛选、按借阅人统计都要反复做字符串拆分,比赛现场时间紧,平行列表的"按下标同步操作"更稳更快。

3.2 自制积木一览

先把流程拆成六个自制积木,主脚本只负责"接单派活":

自制积木 职责
画界面 绿旗时绘制书架背景与五个按钮
刷新显示 遍历四张列表,拼接成多行文本交给显示角色
录入图书 询问书名、作者,四张列表同步追加
检索图书 关键词模糊匹配,结果写入检索结果列表
借书 线性查找书名 → 状态拦截 → 登记借阅人
还书 线性查找书名 → 状态判定 → 清空借阅记录
统计 遍历状态列表,分类计数并播报

3.3 录入图书与刷新显示

录入图书 的关键是四处同步追加------只加书名忘记加作者或状态,是新手最常踩的坑:

复制代码
定义 录入图书
询问 (请输入书名) 并等待
如果 <(回答) = ""> 那么
  广播 (提示)  ......... 自行扩展:空书名拦截
  停止 [这个脚本 v]
end
将 (书名) 设为 (回答)
询问 (请输入作者) 并等待
将 (作者) 设为 (回答)
将 (书名) 加入 (书名列表 v)
将 (作者) 加入 (作者列表 v)
将 (0) 加入 (状态列表 v)
将 () 加入 (借阅人列表 v)
将 (馆藏总数) 增加 (1)
广播 (刷新 v)

注意询问对话框返回的 回答 是全局共用变量 ,第二次询问会覆盖第一次的值,所以必须先把第一次的回答存进自己的变量(书名、作者),再发第二次询问。

刷新显示 用"连接"积木把整个馆藏拼成一串多行文本,让显示角色一次性"说"出来:

复制代码
定义 刷新显示
将 (显示内容) 设为 ("书名 | 作者 | 状态")
将 (i) 设为 (0)
重复执行 (书名列表 v :: list 的长度) 次
  将 (i) 增加 (1)
  如果 <(状态列表 v 的第 (i) 项) = (1)> 那么
    将 (显示内容) 连接 (
      换行 + (书名列表 v 的第 (i) 项) + " | " + (作者列表 v 的第 (i) 项)
      + " | 已借出:" + (借阅人列表 v 的第 (i) 项))
  否则
    将 (显示内容) 连接 (
      换行 + (书名列表 v 的第 (i) 项) + " | " + (作者列表 v 的第 (i) 项) + " | 在馆")
  end
end
广播 (更新文本 v)

显示角色接收到 更新文本 后"说"出 显示内容。这里用广播而不是直接调用,是为了让"逻辑角色算数据、显示角色管画面"各司其职------这正是大赛评分标准里"程序结构清晰"的加分项。

3.4 模糊检索:用好"包含"积木

检索要求"书名包含关键词",用运算积木 (书名列表 的第 i 项) 包含 (关键词) 即可,整段核心是一个带过滤的遍历:

复制代码
定义 检索图书
清空 (检索结果 v)
询问 (请输入检索关键词) 并等待
如果 <(回答) = ""> 那么
  广播 (未找到 v)   ......... 空关键词会让"包含"恒为真,必须拦截
  停止 [这个脚本 v]
end
将 (关键词) 设为 (回答)
将 (i) 设为 (0)
重复执行 (书名列表 v :: list 的长度) 次
  将 (i) 增加 (1)
  如果 <(书名列表 v 的第 (i) 项) 包含 (关键词)> 那么
    将 (i) 加入 (检索结果 v)
  end
end
如果 <(检索结果 v 的长度) = (0)> 那么
  广播 (未找到 v)
否则
  将 (显示内容) 设为 ("共找到 " + (检索结果 v 的长度) + " 本:")
  重复执行 (检索结果 v 的长度) 次
    ......... 按检索结果中的下标,把命中书目拼进显示内容
  end
  广播 (更新文本 v)
end

易错细节 :在 Scratch 中,任意字符串都"包含"空字符串("西游记" 包含 "" 结果为真),所以空关键词会命中全部馆藏。Python 里同样如此------"" in "西游记" 返回 True。两个平台的这个"坑"完全一致,务必加空值拦截。

3.5 借书与还书:线性查找 + 防覆盖

借书的第一步是在 书名列表 中做线性查找,找到目标书的下标:

复制代码
定义 借书
如果 <(馆藏总数) = (0)> 那么
  广播 (未找到 v)   ......... 空馆藏直接拦截,避免对空列表取值报错
  停止 [这个脚本 v]
end
询问 (请输入要借阅的书名) 并等待
将 (待借书名) 设为 (回答)
将 (找到下标) 设为 (0)
将 (i) 设为 (0)
重复执行 (书名列表 v :: list 的长度) 次
  将 (i) 增加 (1)
  如果 <(找到下标) = (0)> 那么        ......... 关键:只有还没找到时才比较
    如果 <(书名列表 v 的第 (i) 项) = (待借书名)> 那么
      将 (找到下标) 设为 (i)          ......... 找到后记录下标
    end
  end
end

外层套一层 如果 <(找到下标) = (0)> 是防覆盖的标准写法:一旦找到就停止继续比对,否则后面的同名比较会把更靠后的下标盖掉(如果允许重名书,这一点会更明显)。另一种等价写法是"重复执行直到 <找到下标 > 0 或 i ≥ 馆藏总数>"。

找到之后做三级判定:

复制代码
如果 <(找到下标) = (0)> 那么
  广播 (未找到 v)                    ......... 馆藏里没有这本书
否则
  如果 <(状态列表 v 的第 (找到下标) 项) = (1)> 那么
    广播 (已借出 v)                  ......... 书已经借出去了
  否则
    询问 (请输入借阅人姓名) 并等待
    将 (状态列表 v 的第 (找到下标) 项) 设为 (1)
    将 (借阅人列表 v 的第 (找到下标) 项) 设为 (回答)
    广播 (借书成功 v)
  end
end
将 (找到下标) 设为 (0)                ......... 收尾复位,防止残留影响下一次操作

还书是镜像流程:同样先线性查找,但要求状态必须为 1 才允许归还(状态为 0 说明书在馆,播报"无需归还"),然后把状态改回 0、借阅人清空。

3.6 统计与广播解耦

统计 自制积木一次遍历状态列表即可完成分类计数:

复制代码
定义 统计
将 (在馆数量) 设为 (0)
将 (已借数量) 设为 (0)
将 (i) 设为 (0)
重复执行 (状态列表 v :: list 的长度) 次
  将 (i) 增加 (1)
  如果 <(状态列表 v 的第 (i) 项) = (1)> 那么
    将 (已借数量) 增加 (1)
  否则
    将 (在馆数量) 增加 (1)
  end
end
广播 (汇报 v)

五个按钮角色被点击时只做一件事------广播消息;管理员角色接收消息后调用对应自制积木,完成后广播 刷新;播报员角色只接收 借书成功、还书成功、未找到、已借出、汇报` 这些"结果消息"并说话。整套程序逻辑与表现彻底分离,任何一方改动都不影响另一方。

再加一道保险:设置 操作中 变量,进入询问前设为 1、流程结束设为 0,按钮被点击时先判断 操作中 = 0 才响应,避免连点误触。

四、运行效果

连续点击两次"录入"分别加入《西游记》和《昆虫记》后,舞台显示:

text 复制代码
书名 | 作者 | 状态
西游记 | 吴承恩 | 在馆
昆虫记 | 法布尔 | 在馆

点击"借书"输入"西游记"、借阅人"小明",书目刷新为"西游记 | 吴承恩 | 已借出:小明",播报员提示"借阅成功";此时再对《西游记》点一次"借书",会被"已借出"拦截。输入关键词"虫"进行检索,命中《昆虫记》一本;点击"统计",播报"馆藏 2 本,在馆 1 本,已借出 1 本"。

五、易错点与提分细节

# 易错点 正确做法
1 平行列表只追加书名,漏加作者/状态/借阅人 录入时四处同步追加,可用一张核对清单自查
2 回答 变量被后续询问覆盖 每次询问后立即把 回答 存进自己的变量
3 线性查找找到后不停止,下标被覆盖 加"找到下标 = 0 才比较"的外层判断,或找到即停
4 空关键词令"包含"恒真,全表误命中 输入后先拦截空值
5 空馆藏时直接查找取值 操作前判断 馆藏总数 = 0 并友好提示
6 查找用的 找到下标 用后不复位 流程结束统一清 0,防止残留
7 逻辑脚本与显示、播报混在一个角色 用广播解耦:按钮只广播、管理员算逻辑、播报员只说话
8 连点按钮导致询问框套娃 操作中 闸门变量,忙时忽略点击

六、进阶挑战

方向一:Python 对照。 图形化的平行列表,在 Python 里最自然的对应是"字典组成的列表",核心逻辑完全同构:

python 复制代码
books = [
    {"name": "西游记", "author": "吴承恩", "status": 0, "borrower": ""},
    {"name": "昆虫记", "author": "法布尔", "status": 0, "borrower": ""},
]


def find_book(name):
    """线性查找:返回下标,找不到返回 -1"""
    for i, b in enumerate(books):
        if b["name"] == name:
            return i
    return -1


def borrow(name, person):
    i = find_book(name)
    if i == -1:
        return "馆藏中没有这本书"
    if books[i]["status"] == 1:
        return "该书已借出"
    books[i]["status"] = 1
    books[i]["borrower"] = person
    return "借阅成功"


def search(keyword):
    """模糊检索:书名包含关键词"""
    if not keyword:            # 空词拦截,与 Scratch 的坑一一对应
        return []
    return [b for b in books if keyword in b["name"]]


def stats():
    in_lib = sum(1 for b in books if b["status"] == 0)
    return len(books), in_lib, len(books) - in_lib

方向二:逾期提醒。 增加 借出日期列表,借书时记下日期;每次启动或还书时用当前日期减去借出日期,超过 14 天标红提醒------练习日期运算与嵌套条件。

方向三:借阅排行榜。 增加 历史记录列表(每还一本书就追加一条"书名|借阅人"),用嵌套循环统计每个借阅人的借阅次数并降序排列------这就是"统计算法"的入门。

方向四:分类检索。 增加 分类列表(文学 / 科普 / 绘本),检索时先按分类筛选再匹配关键词,体会"多条件组合过滤"。

方向五:数据持久化。 Scratch 的列表在关闭程序后清空,可以研究云变量(社区账号)或把馆藏导出为文本"存档",理解"程序状态保存"的意义。

七、小结与互动

这个项目把平行列表、遍历循环、嵌套条件、线性查找、自制积木、广播解耦六大考点串成了一条完整的链路,与信息素养大赛编程操作题"给定真实场景、独立完成程序"的要求完全同构。建议学完后自己做两个变式练习:把"图书"换成"班级物资借用"、把"检索"换成"按作者精确查找",考纲内换场景不换方法,才是真正的举一反三。

你还能把这个"图书管理员"扩展出什么新功能?欢迎在评论区留言讨论。需要历年信息素养大赛图形化复赛集训题等资料的同学,见文末网盘分享。


如果这篇解析对你有帮助,欢迎点赞、收藏、关注,后续会持续更新信息素养大赛、蓝桥杯青少组、电子学会考级等赛事的图形化真题风格解析。


📚 免费少儿编程资料(夸克网盘领取)

以下资料来自夸克网盘分享,点击链接可直接保存;若需在 App 内打开,也可复制下方明文链接:

  1. 全国青少年信息素养大赛复赛集训题目Python&C++.docx
    https://pan.quark.cn/s/93995d3cb150
  2. 2024信息素养-智能算法应用挑战赛-复赛初中组题目7月7日.pdf
    https://pan.quark.cn/s/da97b5dbf75d
  3. Python背记手册.pdf
    https://pan.quark.cn/s/7568ae9ca92b
  4. Python课程
    https://pan.quark.cn/s/a94bf02d00c6
  5. 2024信息素养大赛图形化复赛集训题答案3-9
    https://pan.quark.cn/s/6ccab7ec3cbc
  6. 2025年03月份电子学会考级真题
    https://pan.quark.cn/s/4403c4228912
  7. 2025全国青少年信息素养大赛赛项说明
    https://pan.quark.cn/s/d9d0df4a9f29
  8. 青少儿信息素养大赛编程资料
    https://pan.quark.cn/s/4ab6bd83be8a

资料持续更新,关注获取最新分享。

相关推荐
青少儿编程课堂2 天前
2026蓝桥杯青少组:校园防疫大作战解析
蓝桥杯·scratch·少儿编程·图形化编程·蓝桥杯青少组
青少儿编程课堂8 天前
2026山东创意编程德州赛:校园冰壶挑战赛解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂12 天前
2026深圳罗湖大创客节:校园跳绳挑战赛解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂13 天前
2026山东创意编程烟台赛:校园糖果三消解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂15 天前
2026温州市创意大赛:校园弹珠迷宫解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂16 天前
2026山东创意编程滨州赛:校园守塔防御战解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂17 天前
2026益阳青少年机器人赛:校园太空采矿车解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂1 个月前
2026领航杯江苏素养大赛:校园投篮挑战解析
scratch·少儿编程·图形化编程·创意编程·信息科技
青少儿编程课堂1 个月前
2026重庆STEAM科创大赛:校园连连看消除解析
scratch·少儿编程·图形化编程·创意编程·信息科技