文章总结: 该文档详细介绍了数学奥赛题库系统的开发流程,涵盖题目与解答分表存储的数据结构设计、基于AI的翻译与难度评估规则、支持中断恢复的批量处理脚本、前端展示技术栈以及自动组卷功能。系统通过结构化难度评分体系和多条件筛选机制,实现题目精准匹配与试卷自动化生成,最终提供可打印的完整教学解决方案。 综合评分: 85 文章分类: 解决方案,技术标准,安全开发,其他
中文奥数题库与自动组题工具–后面有做的详细步骤
Uysieot Uysieot
简单读写
2026年5月2日 18:27 四川
在小说阅读器读本章
去阅读
网址:https://mo.yukicv.com/tool/problem_bank
网址:https://mo.yukicv.com/tool/paper_builder
最近我在整理一个数学奥赛题库项目。
这个项目一开始只是想把大量竞赛题目集中起来,方便查看、搜索和练习。后来做着做着,我发现单纯“存题目”远远不够。
一个真正有用的奥赛题库,至少要解决几个问题:
第一,题目来源很多,有英文,也有其他国家语言,需要统一翻译成中文。第二,题目难度差异很大,只靠比赛名称判断并不准确。第三,题目和解答要能正常显示 Markdown、LaTeX、图片等内容。第四,老师或学生不能只是一题题翻,还要能筛选、随机抽题、组卷和打印。
所以这个项目逐渐从一个简单题库,变成了一个比较完整的“奥赛题库处理与展示系统”。
它现在主要包含几部分:
题目数据管理AI 翻译AI 难度评估题目筛选和随机抽题题目详情展示解答展示自动组卷正式试卷预览和打印
下面说一下我是怎么做的。
一、数据是怎么组织的
我把题目和解答分开存储。
题目表主要保存题面、中文翻译和难度信息,例如:
```
problem_idproblem_markdownzh_markdowndifficulty_scoredifficulty_banddifficulty_topicsdifficulty_ideasdifficulty_reasondifficulty_confidencedifficulty_need_context
解答表单独保存每一道题的多个解答:
problem_idsolution_indexsolution_markdownsolution_zh_markdownsolution_zh_updated_at
这样设计的原因是:一道题可能有多个解答。
如果把所有解答都塞进题目表,后期维护、翻译、展示都会比较麻烦。比如有些题有官方解答,有些题有多个民间解答,有些题后续还可能补充更好的解法。
题目和解答分开后,AI 处理时也更清楚:
题目只生成一个中文题面和一个难度评估。
每条解答分别生成自己的中文翻译。
这样数据结构比较干净,后面做展示、筛选、组卷也更方便。
---
## 二、题目是怎么翻译的
翻译不是简单地把英文变成中文,因为数学题有很多特殊内容。
比如:
LaTeX 公式变量名图片路径Markdown 格式竞赛术语证明表达几何图形中的点名和线段名
所以我给 AI 的提示词里强调了几条规则:
保留所有 LaTeX 公式、变量、数字、单位和 Markdown 图片链接。不要翻译数学变量、函数名、图片路径。如果原文已经是中文,只做轻微整理,不要大改。答案翻译要忠实原文,不要补充原文没有的步骤。不要把题目改写成另一道题。不要为了“通顺”而改变数学含义。
比如数学题里出现:
Let ABC be a triangle.
可以翻译成:
设 ABC 为一个三角形。
但如果公式是:
\angle ABC = 60^\circ
这里的 `ABC`、`\angle`、`60^\circ` 都不能乱改。
对于解答也是一样。
AI 只负责翻译和整理,不负责重写证明,更不能自行补充步骤。否则原解答和翻译后的解答可能不一致,后期检查会很麻烦。
所以我在翻译解答时也要求它:
尽量保持原解答结构。不要额外添加新的证明方法。不要删掉原文中的关键步骤。遇到明显跳步可以轻微补足连接词,但不能新增实质内容。
这让翻译结果更适合后期人工复核。
---
## 三、为什么难度不能只看比赛名称
一开始我也想过按比赛来分,比如 AIME、联赛二试、CMO、IMO。
但后来发现这样不合理。
因为同一个比赛内部差异很大。
比如 CMO 里有些题可能是比较标准的国奥题,有些题可能非常接近集训队选拔难度。反过来,IMO 也不是每道题都一定比 CMO 难。
如果只按比赛来源判断难度,会出现很多问题。
有些题比赛名很高级,但本身方法比较标准。
有些题比赛名看起来普通,但实际切入点很隐蔽。
有些题计算量大,但数学想法并不难。
有些题题面短,解法却需要很强的创造性。
所以我最后采用的是“根据题目本身的解题门槛”来评分,而不是根据来源机械评分。
难度评估主要看这些因素:
核心观察是否明显。解题路径是否自然。是否需要构造、反证、极值、不变量、分类讨论。是否存在隐藏结构。是否需要多个关键想法结合。证明链是否复杂。是否需要高水平创造性。学生在没有看解答时,最可能卡在哪里。
也就是说,难度不是看题目来自哪里,而是看一个学生真正独立做题时,需要跨过哪些门槛。
---
## 四、难度评分体系是怎么定的
这个题库面向的不是普通学生,也不是普通 AIME 训练者,而是已经具备中国数学联赛二试或同等奥赛证明题训练基础的学生。
所以我的评分体系整体比较高。
在这个体系里,1 分并不是普通基础题,而是二试入门或奥赛基础题。AIME 常规题通常低于 1 分,AIME 压轴题大概也只相当于 0.5 到 1.5 分。
我最后采用了 1 到 10 分的体系:
1 = 标准方法题,二试入门/奥赛基础,思路直接2 = 标准方法加强题,二试常规,有一两个常规技巧3 = 明确突破点题,二试中等,有较明确关键观察4 = 多步骤转化题,二试中上,多步转化或多技巧结合5 = 非显然观察题,省选中等,切入点不直接6 = 结构复杂题,省选较难/国奥中等,需要成熟专题能力7 = 高区分度难题,国奥较难,多关键想法或隐蔽洞察8 = 高创造性难题,集训队/IMO 中等偏难,套路难推进9 = 深层结构难题,集训队难题/IMO 难题,结构深、链条长10 = 顶级难题,IMO 压轴级,极高创造性和技术要求
AI 输出时,我让它返回一个简洁的 JSON:
{ “s”: 6.5, “b”: “结构复杂题”, “t”: [“几何”, “构造”], “i”: [“隐藏结构”, “辅助线”], “r”: “需要发现隐藏结构并完成多步转化。”, “c”: 0.86, “ctx”: false}
其中:
s = 难度分b = 难度等级t = 主要知识点i = 关键想法r = 简短理由c = 置信度ctx = 是否需要更多上下文或图片
这样字段比较短,适合批量处理,也能减少输出 token。
---
## 五、为什么要把题目和解答一起喂给 AI
只看题面也能评估难度,但不够稳定。
因为很多奥赛题真正的难点,不是题目表面看起来复杂,而是解法里隐藏的关键想法。
如果把参考解答也提供给 AI,它就能判断:
这个题是否需要非显然构造。证明链是否很长。是否有隐藏结构。是否只是标准方法。是否计算复杂但思路简单。是否需要多个专题方法结合。
不过这里也有一个问题:AI 看了解法之后,可能会低估题目难度。
因为解法一旦呈现出来,很多题都会显得“很自然”。尤其是奥赛题,真正难的是想到第一步,而不是看懂最后的证明。
所以提示词里必须强调:
请站在学生未看过解法时的角度评估。不要因为参考解法简短就低估题目。重点判断学生需要自己想到哪些关键观察。判断难度时,优先看“发现路径”而不是“阅读路径”。
这个约束非常重要。
---
## 六、批量处理是怎么做的
我写了一个 Python 脚本来批量处理题目。
流程大概是:
1. 指定起始题目 ID 和结束题目 ID2. 请求服务器接口,获取还没有处理过的题目3. 把题目和解答发送给 DeepSeek4. 拿到中文翻译和难度评估结果5. 调用 PHP 接口写回数据库6. 已经处理过的题目自动跳过
为了避免重复处理,PHP 端会判断一题是否已经完成:
题面中文翻译不为空。难度分不为空。置信度不为空。所有解答都有中文翻译。
如果满足这些条件,脚本就不再处理这道题。
这对批量任务很重要。
因为几千道题处理到一半中断是很正常的,比如网络断了、接口限流了、服务器重启了、脚本报错了。脚本必须支持继续跑,而不是每次都从头再来。
所以整个处理流程要做到:
可中断。可恢复。可跳过已完成数据。可重复执行。不破坏原始题面。不覆盖人工已经修过的内容。
---
## 七、如何尽量命中 AI 的缓存
因为每道题都要发给 AI,如果提示词每次变化很大,就很浪费。
所以我把固定提示词放在最前面的 system 消息中,并且尽量保持完全不变。每道题不同的内容只放在最后一个 user 消息里。
也就是:
system:固定的长提示词user:当前题目的 JSON 数据
这样批量处理时,前面的大段提示词更容易命中缓存,整体成本会更低,速度也可能更稳定。
动态题目数据也做了压缩:
{ “pid”: 123, “p”: “题面”, “oldzh”: “已有中文翻译”, “sol”: [ { “id”: 1, “idx”: 1, “text”: “原始解答”, “oldzh”: “已有中文解答” } ]}
字段名尽量短,减少 token。
这样虽然每道题的数据不同,但系统提示词基本不变,有利于批量处理。
---
## 八、并发和限流怎么处理
批量处理时,我默认用 10 个线程并发请求。
但是 API 会根据服务器负载动态限制并发。如果达到并发上限,就可能返回 HTTP 429。
所以脚本里做了一个简单的动态降并发机制:
初始 10 线程如果收到 429,就把并发数减少 1当前题目重新放回队列等待一段时间后继续处理最低降到 1 个线程
这样就不会因为限流导致整个任务失败。
它不是很复杂的调度系统,但对这种批量清洗任务已经够用了。
后期数据量更大,继续加:
失败重试次数。错误日志。按题目 ID 记录处理状态。单题失败后跳过。定时任务继续跑。后台进度面板。
但在当前阶段,能稳定把题目一批批处理完,比做一个复杂系统更重要。
---
## 九、页面展示是怎么做的
前端主要用了 Layui、marked 和 KaTeX。
Layui 用来做列表、筛选、弹窗和表单。marked 用来渲染 Markdown。KaTeX 用来渲染数学公式。
题库列表里显示:
题目 ID。年份。竞赛名称。地区。分类。中文题目摘要。解答数量。难度分。难度等级。置信度。
筛选功能包括:
年份筛选。难度筛选。一级分类多选。关键词搜索。随机抽题。
一级分类筛选用了“同时满足”的逻辑。
也就是说,如果同时勾选“几何”和“代数”,那么只显示既包含几何又包含代数的题目,而不是显示几何或代数任意一个。
这个逻辑更适合训练。比如老师想找“几何 + 不等式”或者“数论 + 构造”的题,就可以更准确地筛出来。
---
## 十、题目弹窗怎么设计
点击题目后,会弹出一个窗口。
默认显示中文题面。
如果勾选“显示英文/原文”,就在中文题面下面显示原始题面。这个勾选状态会写入 cookie,下次打开页面时会保持上次选择。
参考答案也是一样。
默认不显示答案,只有勾选“显示参考答案”后才显示。
这样设计是为了避免学生一打开题目就看到解答。
弹窗中也支持 Markdown 和 LaTeX 渲染。
对于 `$$...$$` 这种多行公式,我做了额外处理:先保护公式,再渲染 Markdown,最后交给 KaTeX 渲染。
否则 Markdown 可能会把公式中的换行变成 `<br>`,导致 KaTeX 无法识别完整公式。
这个细节很重要。
因为数学题库里大量内容都是公式,如果公式显示不稳定,整个题库就很难真正使用。
---
## 十一、为什么还要做自动组卷系统
题库能筛选、能随机抽题之后,其实已经可以用了。
但真正教学时,还会遇到一个问题:老师往往不是只想随便找一道题,而是想生成一整套练习卷。
比如:
上午场 3 题。下午场 3 题。第一天 4 题,第二天 4 题。代数 1 题,几何 1 题,数论 1 题。难度从 2 到 5 逐步增加。每道题都要显示中文和原文。最后能打印成 PDF。
如果每次都手动筛选、复制、排版,会很麻烦。
所以我又做了一个自动组卷控制器。
这个组卷系统的目标不是替代老师判断,而是把“找题、抽题、排版、打印”这几个重复步骤自动化。
老师仍然可以决定:
这套卷分几个章节。每个章节叫什么。每个章节放几道题。每道题限制什么类型。每道题限制什么难度。是否显示中文、原文或答案。
系统负责:
根据条件随机抽题。避免重复题目。生成临时预览。保存正式试卷。提供打印页面。
---
## 十二、自动组卷的数据结构
组卷系统单独建了几张表,不直接改原来的题库表。
主要是三层结构:
试卷表章节表试卷题目表
试卷表保存一张卷子的基本信息:
idtitleintro_markdowndisplay_modecreated_atupdated_at
这里的 `title` 是试卷名称,比如:
2026 春季几何专题训练卷intro_markdown 是首页说明,可以写考试时间、注意事项、适用学生、题目说明等。
`display_mode` 用来记录默认显示方式,比如:
zh_originzh_onlyorigin_only
也就是:
中文 + 原文。仅中文。仅原文。
章节表保存每一部分的信息:
idpaper_idsection_indextitle_markdownintro_markdownquestion_count
这样一张卷子可以有多个章节。
比如:
上午场下午场
或者:
第一天第二天第三天第四天
也可以是:
代数专题几何专题数论专题组合专题
试卷题目表保存每道题在试卷中的位置:
idpaper_idsection_idquestion_indexproblem_idrule_json
这里比较关键的是 `rule_json`。
因为每道题不是单纯存一个 problem\_id,还要记录它当时是根据什么规则抽出来的。
比如:
{ “type”: “代数”, “yearmin”: 2010, “yearmax”: 2024, “difficultymin”: 2, “difficultymax”: 3, “keyword”: “”}
这样以后回看这张卷子时,就知道这道题当初是按什么条件选出来的。
如果以后要做“重新抽取同条件题目”,这个字段也有用。
---
## 十三、自动组卷页面是怎么设计的
组卷页面采用左右分栏。
左边是编辑区。
右边是临时预览区。
左侧编辑区主要有几部分。
第一部分是试卷基础信息:
试卷名称。章节模板。首页说明。默认显示模式。
章节模板是为了快速创建常见结构。
比如:
上午场 / 下午场第一天 / 第二天第一天 / 第二天 / 第三天 / 第四天自定义章节数
选择模板后,系统会自动生成对应章节。
第二部分是每个章节的设置。
每个章节包含:
章节标题 Markdown 编辑框。章节说明 Markdown 编辑框。题目数量。题目规则列表。
每道题可以单独设置:
题型。年份范围。难度范围。关键词。
比如默认可以这样设:
第 1 题:代数,难度 2-3第 2 题:离散数学,难度 3-4第 3 题:数论,难度 3-5
这样生成出来的卷子不会完全随机,而是有一个基本结构。
右侧预览区会把当前配置实时渲染出来。
老师可以一边改条件,一边看卷子大概长什么样。
---
## 十四、随机抽题逻辑是怎么做的
自动组卷最核心的是随机抽题。
但这里不能简单地从题库里随机取几道题。
因为每道题都有约束条件。
比如一题可能要求:
题型是代数。难度在 2 到 3 之间。年份在 2010 到 2024 之间。题面里包含某个关键词。不能和当前试卷中已经选过的题重复。
所以系统会先根据条件构造候选题集合。
大概流程是:
1. 读取当前题位的规则2. 根据题型、年份、难度、关键词筛选题库3. 排除当前试卷里已经选过的题4. 得到候选 problem_id 列表5. 从候选 ID 中随机取一个6. 再根据这个 ID 查询完整题目信息7. 放回当前题位
这里我没有直接使用数据库的:
ORDERBY RAND()
原因有两个。
第一,数据量大了以后,ORDER BY RAND() 性能不太好。第二,在 ThinkPHP 的查询构造器里,RAND() 有时会被当成字段名解析,容易引发兼容问题。
所以我采用了更稳的做法:
先查出符合条件的题目 ID。再用 PHP 从 ID 数组里随机抽一个。最后按 ID 查询完整题目。
这样逻辑更清楚,也更容易排查问题。
如果某个题位没有找到符合条件的题,系统不会直接失败,而是提示这一题没有候选题。
这时老师可以放宽条件,比如:
扩大难度范围。
取消年份限制。
换一个题型。
去掉关键词。
---
## 十五、为什么每道题都要单独设置规则
组卷时如果只设置整张卷子的统一条件,其实不太够。
因为一套好卷子往往是有结构的。
比如三题训练卷可能是:
第一题:标准方法题,帮助进入状态。第二题:中等题,需要一个关键观察。第三题:难题,训练完整证明和综合能力。
如果只设置整卷难度 2 到 5,那么系统可能抽出三道都偏难,或者三道都偏简单。
所以我把规则放到了“每道题”这个层级。
这样可以做到:
第一题限定难度 2 到 3。第二题限定难度 3 到 4。第三题限定难度 3 到 5。
还可以限定题型:
第一题代数。第二题离散数学。第三题数论。
这种设计更符合老师实际组卷的习惯。
老师不是只想要“随机三道题”,而是想要“一套有梯度的卷子”。
---
## 十六、临时预览和正式保存是分开的
组卷时有一个重要设计:临时预览和正式保存分开。
在编辑页面里,用户可以不断随机生成。
可以只重新生成某一道题。
可以重新生成某一章。
也可以整卷重新生成。
这些操作都只是临时状态,不会立刻写入正式数据库。
只有当用户点击“保存试卷”时,系统才会把当前结构写入数据库。
这样做有几个好处。
第一,老师可以反复调整,不会产生一堆无用试卷。第二,随机结果不满意时,可以继续抽,不会污染正式数据。第三,保存后的试卷是固定的,不会因为以后题库更新而变化。
这个很重要。
因为一张已经发给学生的试卷,必须保持稳定。不能今天打开是这几道题,明天打开又变成另一批题。
所以正式保存时,会把章节和题目位置都固定下来。
---
## 十七、正式试卷页面和打印
保存试卷后,系统会生成一个正式查看页面。
这个页面主要用于:
查看试卷。课堂投屏。打印成 PDF。发给学生。
显示页支持几种模式:
中文 + 原文。仅中文。仅原文。
默认情况下,我更倾向于中文和原文一起显示。
这样做有几个好处:
学生可以看中文理解题意。老师可以对照原文检查翻译。遇到翻译有争议的地方,可以回到原题。
打印页面也做了一些处理。
比如:
隐藏顶部操作栏。每个章节单独分页。避免最后多出空白页。自动用试卷名作为浏览器标题。打印为 PDF 时尽量使用试卷名作为默认文件名。
其中“最后多一页空白页”是一个常见问题。
原因通常是打印 CSS 里给每页设置了 `min-height: 297mm`,但浏览器打印时本身还有页边距,实际可打印高度小于 297mm,于是最后就容易挤出一页空白。
解决方法是:
屏幕预览时保留 A4 效果。
打印时取消强制 297mm 高度。
只给非最后一页设置强制分页。
最后一页不再 `page-break-after: always`。
这样打印 PDF 会稳定很多。
---
## 十八、为什么要加字体缩放
后来试用时,很多朋友反馈:打印出来字体有点大。
这个问题其实很正常。
网页上看着舒服的字体,打印到 A4 纸上不一定合适。尤其是数学题里有大量公式,字体稍微大一点,整页就会显得很松,题目数量也放不下。
所以我在正式试卷页面加了字体缩放按钮:
A-A+默认
默认字体比例设置成比原来小一点,比如 90%。
如果觉得太大,可以点 A-。
如果觉得太小,可以点 A+。
如果调乱了,可以点默认。
这个缩放设置会保存到浏览器本地,下次打开试卷页面时还能保持上次的比例。
这样不同老师可以按自己的打印习惯调整。
有些人喜欢大字版,适合学生直接写。
有些人喜欢紧凑版,适合打印讲义。
有些人只投屏,不打印,那就可以放大一点。
一个小按钮,就能解决很多使用场景差异。
---
## 十九、自动组卷系统目前解决了什么问题
有了自动组卷后,这个题库就不只是“查题系统”了。
它可以真正进入教学流程。
现在大概可以完成这些事情:
按难度随机抽题。按题型随机抽题。按年份范围随机抽题。按关键词随机抽题。按章节组织试卷。每章独立说明。每题独立规则。整卷预览。正式保存。中英文对照显示。打印成 PDF。字体大小调整。
以前老师要出一套练习卷,可能需要:
先搜索题目。复制题面。复制图片。检查公式。调整排版。翻译英文。判断难度。再放进 Word 或网页。
现在这些步骤大部分都可以系统化完成。
老师只需要决定训练目标,然后用规则去生成。
---
## 二十、AI 在这个项目里的定位
我并不把 AI 当成完全自动的裁判,而是把它当成一个高效率的初筛工具。
它可以快速完成:
翻译。格式整理。难度初评。知识点提取。关键想法归纳。
但对于高价值题目,尤其是难度较高、依赖图片、解答跳步严重的题目,仍然需要人工复核。
所以我保留了两个字段:
confidenceneed_contextconfidence 表示 AI 对自己判断的置信度。
`need_context` 表示这道题是否需要更多上下文,比如图片、原 PDF、完整题面或更清楚的解答。
如果 AI 对某题置信度低,或者认为图片信息不足,就可以后续单独检查。
自动组卷也是一样。
AI 和系统可以帮助老师快速找到一批符合条件的题,但最终这套卷是否适合某个学生、某个班级、某个训练阶段,仍然需要老师判断。
---
## 二十一、这个项目目前形成的完整流程
现在整个系统的流程大概是这样的:
原始题库数据 ↓题面和解答清洗 ↓AI 翻译题面 ↓AI 翻译解答 ↓AI 难度评估 ↓写入数据库 ↓前端题库筛选 ↓题目详情查看 ↓随机抽题 ↓自动组卷 ↓正式试卷保存 ↓查看和打印
这个流程跑通之后,题库的价值会明显提高。
原来它只是一堆题目。
现在它变成了一个可以搜索、筛选、翻译、评估、练习、组卷和打印的系统。
这对个人整理题库、老师备课、学生训练都更有用。
---
## 二十二、后续计划
后面我还想继续完善几个方向。
第一是组卷规则更细。
现在主要是按题型、年份、难度和关键词抽题。后面可以增加:
知识点标签。关键想法标签。是否有图。是否有解答。是否已经人工复核。是否适合作为考试题。是否适合作为讲义题。
第二是加入答案卷。
现在主要解决题目打印。后面可以加:
仅题目版。题目 + 答案版。单独答案版。教师版。学生版。
第三是人工复核系统。
对低置信度题目、高难题、图片缺失题、翻译疑似不稳定的题目进行二次检查。
第四是难度校准。
随着实际使用数据增加,可以把 AI 初评和真实教学反馈结合起来,让难度分更稳定。
比如某道题 AI 评 4 分,但很多学生都做不出来,那就说明它可能应该提高。反过来,如果某道题 AI 评 6 分,但学生掌握某个套路后很容易做,也可以适当调整。
第五是组卷模板库。
以后可以预设一些常用模板:
二试入门训练卷。代数专题训练卷。几何综合训练卷。数论构造训练卷。省选模拟卷。国奥难题训练卷。IMO 风格训练卷。
老师选择模板后,只需要微调条件,就能生成一套比较合理的练习。
---
## 总结
这个项目的核心思路其实很简单:
用数据库管理题目。用 AI 完成翻译和难度初评。用脚本批量处理。用前端页面筛选和展示。用自动组卷系统生成练习卷。用人工复核保证质量。 “`
AI 并不是替代人工,而是把大量重复、低创造性的整理工作先做掉。
真正重要的判断,比如题目是否适合某个学生、某个训练阶段是否应该使用、某套卷子的梯度是否合理,仍然需要老师和使用者来把关。
但有了翻译、难度评分、知识点标签、随机筛选和自动组卷之后,题库的可用性会大大提高。
它不再只是一个“题目仓库”,而是一个能真正服务训练和教学的系统。
这也是我做这个项目的主要目的:
让大量分散的奥赛题目,真正变成一个可以被搜索、筛选、练习、组卷和打印的数学训练系统。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:简单读写 Uysieot Uysieot《中文奥数题库与自动组题工具–后面有做的详细步骤》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论