本次实验说明:本实验由两位同学结对完成。先共同讨论算法设计与系统架构,然后一人负责编码(另一人审核),最后交换角色进行复审与测试,最终完成此项目。
学号:2452206,2452203
实验环境:Windows 11 / macOS Ventura(双平台测试通过)
开发工具:Eclipse 2024-12,OpenJDK 17.0.5
一、实验目标
设计并实现一个简易在线考试系统(数学版),具备以下功能:
- 题目管理(增、删、改、查、展示全部题目)
- 考试功能(逐题作答、自动判分、实时显示得分)
- 结果报告(总分、正确率、评级、错题解析)
- 支持单选题、多选题、判断题三种题型
- 判断题选项使用 T / F
- 多选题保留输入提示(多个答案用逗号分隔)
二、算法设计思路
2.1 系统整体结构
我们采用面向对象的设计,将系统划分为三个核心部分:
-
Question 类:封装题目的属性(ID、题干、选项列表、正确答案、题型、解析)和行为(展示题目、验证答案)。
-
ExamSystem 类:管理系统整体流程,包括题库管理、考试控制、成绩统计、错题记录。
-
Main 类:程序入口,启动考试系统。
2.2 关键算法设计
(1)答案验证算法(Question.checkAnswer)
-
单选题 & 判断题:直接比较用户输入(转换为大写)与标准答案是否相等(字符串全等)。
-
多选题:
-
用户输入格式如 A,B,C,先按逗号分割成数组,去除空格后排序。
-
将标准答案也按逗号分割、排序。
-
比较两个排序后的数组是否完全一致(忽略顺序,只关心选项集合是否相同)。
-
(2)考试流程控制
-
使用 List
存储题库,动态维护题目数量。 -
考试时依次遍历题库,每答完一题立即判断对错并累加分数。
-
每道题结束后,显示当前得分和正确答案解析(答错时显示)。
-
考试结束生成最终报告,包括总分、得分、正确率、评级,以及错题解析。
(3)题目管理
-
使用简单的控制台菜单驱动(switch-case 结构)。
-
添加题目时根据题型动态生成选项(判断题自动生成 T 和 F)。
-
修改/删除题目通过题目 ID 进行定位。
2.3 判断题选项处理
为符合实验要求,判断题选项统一显示为:
text
A. T
B. F
题目中明确提示“T表示正确,F表示错误”,不再额外显示其他提示。
三、程序代码(关键部分)
3.1 Question 类(答案验证与展示)
点击查看代码
public class Question {// 题型常量public static final int TYPE_SINGLE = 1;public static final int TYPE_MULTIPLE = 2;public static final int TYPE_JUDGE = 3;// ... 属性省略 ...public void display() {System.out.println("\n【第" + id + "题】" + text);System.out.println("[" + getTypeName() + "]");char optionLetter = 'A';for (String opt : options) {System.out.printf(" %c. %-15s\n", optionLetter, opt);optionLetter++;}// 只保留多选题的提示if (type == TYPE_MULTIPLE) {System.out.println(" (提示:多个答案用逗号分隔,如:A,B,C)");}}public boolean checkAnswer(String userAnswer) {if (userAnswer == null || userAnswer.trim().isEmpty()) return false;String user = userAnswer.trim().toUpperCase();String correct = answer.toUpperCase();if (type == TYPE_MULTIPLE) {String[] userParts = user.split(",");String[] correctParts = correct.split(",");// 去除空格并排序for (int i = 0; i < userParts.length; i++) userParts[i] = userParts[i].trim();for (int i = 0; i < correctParts.length; i++) correctParts[i] = correctParts[i].trim();java.util.Arrays.sort(userParts);java.util.Arrays.sort(correctParts);return java.util.Arrays.equals(userParts, correctParts);} else {return user.equals(correct);}}
}
3.2 ExamSystem 类(考试主逻辑)
点击查看代码
private void startExam() {// ... 初始化得分、记录列表 ...for (Question q : questions) {q.display();System.out.print("\n请输入你的答案: ");String answer = scanner.nextLine();boolean isCorrect = q.checkAnswer(answer);// 保存答题记录answerRecords.add(new AnswerRecord(...));if (isCorrect) {currentScore += 10;System.out.println("✓ 回答正确! +10分");} else {System.out.println("✗ 回答错误!");System.out.println("你的答案: " + answer);System.out.println("正确答案: " + q.getAnswer());}System.out.println("解析: " + q.getExplanation());}showFinalReport();
}private void showFinalReport() {// 计算正确率、评级// 输出总分、得分、评级// 输出错题解析(遍历 answerRecords,筛选 !isCorrect)
}
3.3 判断题示例(题库初始化)
点击查看代码
// 判断题:选项为 T 和 F
List<String> opts6 = new ArrayList<>();
opts6.add("T");
opts6.add("F");
Question q6 = new Question(6, "15 + 8 > 20 是否正确?(T表示正确,F表示错误)", opts6, "T", Question.TYPE_JUDGE, "15+8=23,23>20,所以正确");
四、运算结果

输入1就可以对题目进行操作啦:

1.查看题目(太多了这里就截取一部分):

2.添加题目:
可以选择添加不同类型的题目

可以随便添加一个作为测试

再查看就已经添加进去了

3.输入3修改题目:

已经修改好了

4.按4删除题目:

5.按关键词查找:

输入2开始考试:

进行中......

最后还会有成绩报告和错题解析

五、结对编程体会
5.1 合作流程
-
需求分析阶段:
我们两人一起阅读实验要求,列出所有功能点,并讨论数据结构(用什么存储题目、如何记录错题)。
最终决定采用 ArrayList作为题库,AnswerRecord 内部类存储答题记录。 -
编码阶段:
第一轮:A同学编写 Question 类和 ExamSystem 的基本框架,B同学在一旁指出潜在问题(例如:多选题答案比较需要排序;判断题选项应显示为 T/F 而非“正确/错误”)。
第二轮:交换角色,B同学完善 manageQuestions 模块(添加、修改、删除),A同学检查边界条件(如题库为空时的处理、输入非法字符的异常捕获)。 -
测试与调试阶段(共同完成):
我们设计了多组测试用例:
5.2 遇到的困难及解决
多选题判分:最初只用了 equals 直接比较字符串,导致顺序不同时被判错。经过讨论,我们改用“分割→排序→比较数组”的方式,完美解决。
判断题提示:实验要求“不要提示”,但又要明确 T/F 含义。我们在题干中用括号注明“T表示正确,F表示错误”,而不是在选项下方额外打印提示行。
错题解析显示:为了在最终报告中不仅显示答案,还显示原题题干,我们设计了 AnswerRecord 类来存储答题时的完整快照(包括题干文本),避免因后续修改题目导致错题解析与考试时不一致。
5.3 结对编程的优势
减少低级错误:编码时另一人实时审核,立即发现拼写错误、逻辑漏洞(例如忘记对用户输入 trim())。
知识互补:一人更擅长数据结构,另一人更擅长异常处理,合作使代码更完美!
提高效率:讨论设计方案比单独思考更快,且代码风格统一。
5.4 改进方向
-
增加计时功能(每道题限时作答)。
-
支持题目导入/导出(文件保存题库)。
-
图形化界面(Java Swing 或 JavaFX)提升用户体验。
六、实验总结
通过本次结对编程实验,我们不仅掌握了 Java 面向对象编程的核心技能,还深刻体会了代码复审和协作开发的重要性,在实现代码前的交流和设计都需要花费不少时间。经过一段时间的调试后,实验要求中的“判断题选项改为 T/F”、“多选题保留提示”、“错题解析”等细节都得到了完整实现。最终程序运行稳定,功能符合预期。本次实验圆满结束。
