31
0
1

从课堂需求出发,在代码中成长

文章摘要
|

简述

步入开发的第一步

刚接触 C 语言的时候,我和很多同学一样,只是跟着课本学习编程语法,写一些课本上的示例小程序。然而我一直在想:我们学的代码,能不能真正解决身边真实的问题?

1. 随机点名器的由来

在日常上课的时候,我观察到老师课堂提问会遇到一些小麻烦。

手动点名容易反复点到同一批同学,部分同学很少得到发言机会;课前手动整理名单也比较耗费时间。

看到这个现实痛点,我就萌生想法:能不能开发一个小工具,帮老师公平随机抽取学生,辅助课堂互动。

最开始只是简单写了几行代码实现基础随机抽取。真正写的时候,问题远比想象多:名单导入、界面易用性、防止重复点名、兼容学校电脑环境,一堆问题不断冒出来。

课余时间、晚自习,我一点点调试、改 bug,反复邀请任课老师试用,根据老师的反馈一次次修改迭代。慢慢的,这个程序从简陋的 demo,变成可以实际上课使用的随机点名器,之后不少任课老师在课堂上开始使用它。

而现在最新版本已支持包括:名单新建、名单导入、云端同步名单、均匀点名概率、同一循环内不重复点名等功能。

下载链接可参考:

https://blog.xpeng4643.top/archives/sui-ji-dian-ming-qi

2. 互动题典的由来

「互动题典」的想法,是受我的网络课科任刘新华老师启发而来。在一次下课期间,刘老师问我,能不能把“随机点名器”的逻辑用在试题抽测上,能不能实现随机抽选题目呢?

不过此时我也才仅仅刚接触 Qt C++,对于这一款软件的设计,我当然可以借用前一软件的部分功能实现,但也同时需要重新学习一下数据库相关的知识,也是在这里第一次接触 SQLite 这款本地化轻量关系型数据库。

于是我着手开发第二款工具「互动题典」。

我希望做一个课堂习题小系统,老师可以录入题目,课堂上快速组织随堂练习,学生可以即时作答,快速看到练习反馈。

在软件迭代的后期,DeepSeek 大模型面世,我萌生了把 AI 功能集成进软件的想法。我查阅接口文档,调试对接流程,克服接口调用、上下文适配等一系列问题,最终成功将大模型接入互动题典。

接入 AI 之后,软件新增了不少实用功能:学生可以直接针对习题进行提问答疑;同时还支持文本生成图片,辅助理解题目情境。

开发过程中要处理题库管理、抽题逻辑、界面交互等难题,中间经历很多次重写。我一边啃课堂学到的知识,一边自学补充需要的技术,遇到不懂就查阅资料,不断打磨功能。

详细讲述

开发过程

1. 最早在高一下册开设的“C 语言”课程,接触编程和编程语言的学习,并在此时开始进一步了解软件开发相关的内容。我本人对计算机相关的各类技术较感兴趣,在接触 C 语言后,我便有想法尝试学习软件开发相关的知识。

2. 关于软件开发框架的选择,就当时的情况,软件开发的框架非常多。以相对主流的编程软件分类

例如,例如C++的MFC(由于其过于古老,不适合于现代软件开发的需求),还有如C Sharp的WPF。(只适合用于 Windows 系统软件开发,在平台跨越上存在限制)

在编程语言的选择上,我最终选择了 C++,因为在有 C 语言的基础下,会更容易入门。

随后,我便在各媒体平台,比如哔哩哔哩上了解更多关于开发框架的特性。最后,我找到了 QT 这个框架,它更像是一个庞大的开发社区,由于其发展的时间较为长久,在生态支持上相对完善,并且提供了较多的模块,更便于开发大多数用户需求的应用软件。

3. 漫长的 QT 开发学习之路,选定框架后,我开始着手学习。在高二,我购买了一本《Qt6 C++ 开发指南》,从书本中的示例程序开始学习 QT 的基本实现方案。举一个例子,如何在 UI(用户界面)上放置一个按钮(Qt Designer 可以以可视化的方式实现这一操作。而如果我选择用的是 MFC 这种相对旧的框架则可能只能通过纯代码的方式来实现同样的效果,这非常影响开发效率,也是我选择现代化开发趋势框架的原因之一),按钮被单击后的操作动作实现写在哪里?

很快,在书中我更深入地了解到,QT 应对这一功能的实现主要采用的是“信号与槽机制”,这也是 Qt 的一种特色。

例如,在数据传递时也可使用这一机制来实现,这是是 Qt 的经典传参方案。对于书中未能读懂或理解的部分,我尝试通过搜索引擎(如 Bing,中文名为“必应”)和视媒体平台(如哔哩哔哩)来查询和参考相关的教程或资料。

我利用假期和小部分的课余时间学习 QT 框架的各组件,并在过程中积累了一定量的 C++ 编程和 Qt 框架中组件的使用方法。

4. 从小项目入手

在学习 Qt 的过程中,我主要采用的是以项目为例的学习方法。首先,我发现在课堂中老师有时会抽选学生来回答问题,但这一过程可能要花上近 10 余秒,并且很难实现更离散的随机。于是,我计划就以一个简单的随机点名器软件作为我学习 Qt 之路上的例子。

在开发这一软件时我首先遇到的第一个问题是如何将名单存储,并在使用时正确从存储文件当中读取出来。最开始我设想的是使用普通的纯文本文件,以“换行”为分割识别符,一行即代表一个名字。

但很快便发现这种存储方案扩展性较差,如果需要存储更多的信息,如班级名称、人数、名单版本等信息时,会显得文本内容很不规范,而且这种方式容错性较差,所以我需要一种规范化的存储方式。关于数据存储方法的实现,在书中主要提及了数据库。

随后我查找了部分关于数据库的使用以及相关系列的资料。在了解各种数据库的主要区别和特点后,我选择使用 SQLite 作为当前软件的数据存储解决方案(当然,这显然是大材小用,新版本的点名器,我采用更加轻量化的格式和文本规范)。

利用课余时间,大约两天完成了点名器的 1.0 版本。该版本实现了最基本的随机点名,可选一次抽选多名学生等功能,但不具备直接录入名单的功能。于是在后续几天,我着手完成了名单数据库生成软件用于录入名单,但这样的分离式设计显得非常的累赘,并且加大了用户使用难度。于是在约半个月后,基于 1.0 版本改写出的 2.0 版本,相比较于旧版本,最明显的变化是 UI 的设计,并且优化了随机的算法,但数据库存储方案仍存在使用不便,我计划解决这一问题。首先,我的想象是使用更加一种轻量化的格式文本,查找资料后我选用 JSON 格式作为名单文件的存储规范。由于之前的旧版本与将要设计的新版本的存储方案存在较大的差异,于是我决定直接重写整个软件。新版本使用了开源的 UI 组件库来优化用户的视觉感受,并将名单的录入功能融合,这便是改进后的 3.0 版本,让用户使用起来更加方便

(并且在随后的 3.1 版本中,在原基础上进行了再次优化,针对随机算法,进一步确保名单中的每一个人抽到的概率均等,而避免同一个人被多次抽选,更符合实际课堂的需求。这也是在经过半年的实际使用当中最主要的发现的问题)。

后来我设想,为什么不尝试将名单保存于云端呢?这样随时可更新名单数据,实现名单同步统一的效果。这同时也是我第一次尝试使用 QT 的网络模块,正适合练手......

目前的最新版本 4.0.0 便是具备随机点名、名单录入、云端同步名单这三大功能于一体的软件版本。

5. 互动提点的开发计划

在高二时,我的专业课老师刘新华老师给了我一个很好的灵感和想法:“能不能就随机点名器的随机功能实现一个类似于随机点题的效果呢?”。

在有了“点名器”的开发经验后,很快,我在大脑中构思出大概的功能实现方案,“题典”采用 SQLite 数据库保存试题数据,占用资源少且便于随时拷贝。历时约 7 天,写出了具有最基本随机切题功能的版本,并在后续的月一个月中不断完善。不久后,DeepSeek AI 突然爆火,于是我设想,既然是“题典”,那能不能实现解答问题这一功能呢?然后我便想法

将 AI 融入到软件当中。于是在原版本的基础上进行了一次修改,通过调用 API 的方式实现与 DeepSeek AI 对话,并添加问当前提的功能。新的版本便在原版本的随机点题功能上再加上了 AI 对话功能,让功能更加丰富,可以解答试题中的问题。在最新版本的“题典”中,已经具备了随机点题、试题录入、AI 对话、文生图四大主要功能。

“互动题典”这一项目是我第一次接触 Web API 调用也是新版本中最先遇到的问题。通过在搜索引擎中查找,我在 CSDN 中找到了多个 POST 方法调用 API 的代码示例,并学会了使用 Qt 网络模块中的更多的解决方法。

总结

对我而言,自学 QT 是一个缓步积累的过程,途中也曾遇到了一些问题,例如程序运行报错,只能靠翻书或在线查找来解决。但这也锻炼了我的自主解决问题的能力,所以我认为这是一段充满收获与成果的经历。

 Q&A

1. 为什么会选择一个开发框架来学习

在学校中虽然有开设 C 语言这一课程,但仅单一的教授 C 语言的语法和一些经典的算法。并且是以控制台作为操作界面,并不会接触到图形化程序的设计。而我本身对软件开发较感兴趣,于是我开始了解部分图形化程序的开发框架。

2. 途中遇到的问题

最多遇到的问题是没有 Qt 指导老师,在开发的过程中遇到的问题,只可通过翻书或在线搜索等方式来查询对应的解决方法。

3. 学习过程中最大的收获

学会 Qt 和 C++ 基本开发的方案,能够独立完成小型软件的开发设计,并在过程中锻炼了自己的自主解决问题的能力。

4. 写这两个软件的意义是什么

开发这两个项目,对我而言更像是一次有意识的自我训练,而不是为了做出一款具备显著社会价值的产品。我希望通过完整的项目实践,打磨编程实操能力,训练工程化思维,把需求梳理、逻辑设计、落地调试这一整套开发流程真正走一遍,沉淀属于自己的实战经验。相比做出被大量用户使用的工具,我更在意在编码、踩坑、迭代过程中所获得的能力提升。项目本身,更多是我进行刻意练习和技术积累的载体。

编辑:彭相瑜

一审:文奥宇

二审:杨同庆

2026年08月31日

本文赞赏

特别感谢来自 ”文奥宇” 的 [微信赞赏]~~~

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

从课堂需求出发,在代码中成长
/archives/cong-ke-tang-xu-qiu-chu-fa-yong-dai-ma-shi-xian-cheng-chang
作者
Administrator
发布于
2026-08-31
许可协议
CC BY-NC-SA 4.0

评论

欢迎来到我的博客!