基于有状态的课堂点名系统

发布时间:2026/6/27 1:22:20
基于有状态的课堂点名系统 一、项目简介功能描述本系统是一个课堂点名工具核心功能是让全班学生在学期中获得均等的被点名机会。主要功能包括1学生管理——支持批量添加、单个添加和删除学生2课堂点名——优先点被点名次数最少的同学若连续 n 人未答出则自动切换到答对次数多的同学救场3统计查看——展示每个学生的被点次数、答对次数和正确率并支持按列排序。所有数据自动存入文件关闭程序后不丢失。本项目未参考他人代码完全独立完成。个人负责任务 程序设计分析、算法设计、界面编写、数据存储基础、测试。AI辅助代码优化提供方法困难代码编写数据存储二、功能架构图课堂点名系统学生管理课堂点名统计信息批量添加学生设置阈值 n学生数据总览单个添加学生点 名学号/姓名/次数/正确率删除选中学生回答正确底部汇总统计防学号重复未答出表格实时显示下一题数据层StudentList 读写 students.txt 实现持久化算法层Picker 点名策略默认模式 切换模式 界面层Java SwingJFrame JTabbedPane JTable三、个人任务简述1. 完成的任务与功能学生信息管理支持批量添加、单个添加、删除学生学号重复自动检测并跳过表格实时显示学生列表公平点名算法 设计双模式点名策略默认模式优先选被点名次数最少的人连续 n 人答错后自动切换到答对次数多的人用 ArrayList 管理候选池Math.random() 随机抽取数据持久化用纯文本文件存储数据BufferedReader / PrintWriter 读写UTF-8 编码支持中文增删改后立即保存统计功能展示每个学生的被点次数、答对次数、正确率支持点击表头排序冒泡排序实现底部显示总人数、总点名次数、人均次数、总正确率 |Swing 图形界面用 JTabbedPane 分三个标签页组织界面JTable DefaultTableModel 展示数据40 号大字显示被点学生姓名2. Git提交记录截图本项目为个人独立项目未使用 Git。代码在本地完成开发和测试所有历史版本在本地保存。四、本人负责功能详解每个任务或模块按照以下结构描述简述、关键代码截图。面向对象设2. 难点及解决方法点名算法技术Java 基础语法——if-else 分支判断、for 循环遍历、ArrayList 动态数组操作、Math.random() 生成随机数。难点 1——双模式切换逻辑。需要跟踪每一道题的连续失败人数超过阈值 n 就切换。解决在 Picker 类中维护 fail 计数器每答错一次 fail答对时 fail 0 重置。难点 2——同一题不重复点同一个人。解决用 tried 列表记录已尝试的学号选人前先排除。全班都试过则清空重来。难点 3——切换模式下无人答对过。解决加判断——若 good 列表为空退回默认模式。3.数据库设计本项目未使用数据库。数据存储采用纯文本文件data/students.txt每行一条记录逗号分隔四个字段。选择文件存储而非数据库的原因是班级人数通常在几十人以内纯文本文件完全够用无需额外安装 MySQL且可以用记事本直接打开查看数据持久化技术Java 文件 IO——FileInputStream / FileOutputStream、InputStreamReader / OutputStreamWriter指定 UTF-8 编码、BufferedReader 逐行读取、PrintWriter 逐行写入。界面编写技术Java Swing——JFrame 窗口 BorderLayout 布局上中下分区JTabbedPane 标签页容器三个标签页JTable DefaultTableModel 表格显示数据重写 isCellEditable 让表格只读JButton ActionListener 匿名内部类处理按钮点击JSpinner SpinnerNumberModel 数字调节器JOptionPane 弹出对话框消息提示、确认删除、输入框JTextArea 文本区显示历史记录JScrollPane 给表格和文本区加滚动条五、课程设计感想这次课程设计让我完整经历了一个软件从零到一的开发过程。初期的困难主要在算法设计上。点名系统听起来简单但要实现公平轮转 连续失败切换的双模式逻辑需要仔细梳理各种边界情况——同一题不能重复点人、全班都试过怎么处理、切换模式下没人答对过怎么兜底。我画了几遍流程图逐行推演最终把算法拆成筛人→建池→随机抽三步才把逻辑理顺。六、展望不足之处1. 界面布局使用绝对坐标较少窗口缩放时部分组件不够美观2. 数据存储在本地文件无法多台电脑共享3. 统计功能简单只有数据总览缺少图表可视化4. 冒泡排序效率不高学生多了排序会慢改进方向1. 使用更灵活的布局如 GridBagLayout优化界面适配2. 将数据迁移到 SQLite 等轻量数据库支持多用户并发3. 增加 JFreeChart 图表展示——柱状图看点名分布折线图看正确率趋势4. 将排序改用 Arrays.sort() 或 Collections.sort()提高效率5. 增加单元测试JUnit对 Picker 算法进行边界用例覆盖