当前位置: 首页 > news >正文

简易在线考试系统(数学版)——结对编程实验报告

本次实验说明:本实验由两位同学结对完成。先共同讨论算法设计与系统架构,然后一人负责编码(另一人审核),最后交换角色进行复审与测试,最终完成此项目。
学号:2452206,2452203

实验环境:Windows 11 / macOS Ventura(双平台测试通过)
开发工具:Eclipse 2024-12,OpenJDK 17.0.5

一、实验目标

设计并实现一个简易在线考试系统(数学版),具备以下功能:

  • 题目管理(增、删、改、查、展示全部题目)
  • 考试功能(逐题作答、自动判分、实时显示得分)
  • 结果报告(总分、正确率、评级、错题解析)
  • 支持单选题、多选题、判断题三种题型
  • 判断题选项使用 T / F
  • 多选题保留输入提示(多个答案用逗号分隔)

二、算法设计思路

2.1 系统整体结构

我们采用面向对象的设计,将系统划分为三个核心部分:

  1. Question 类:封装题目的属性(ID、题干、选项列表、正确答案、题型、解析)和行为(展示题目、验证答案)。

  2. ExamSystem 类:管理系统整体流程,包括题库管理、考试控制、成绩统计、错题记录。

  3. 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,所以正确");

四、运算结果
image

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

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

2.添加题目:

可以选择添加不同类型的题目
image

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

再查看就已经添加进去了
image

3.输入3修改题目:
image

已经修改好了
image

4.按4删除题目:
image

5.按关键词查找:
image

输入2开始考试:
image
进行中......
image

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

五、结对编程体会

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”、“多选题保留提示”、“错题解析”等细节都得到了完整实现。最终程序运行稳定,功能符合预期。本次实验圆满结束。

http://www.jsqmd.com/news/674010/

相关文章:

  • Codex + 自建中转站,用不完的token+GPT5.4 做成了一个AI机器人
  • 从乘客头衔到船舱号:手把手教你用Python挖掘泰坦尼克号数据里的隐藏特征
  • 如何防止SQL触发器导致事务超时_拆分逻辑为异步队列处理
  • MySQL Explain 查询计划详解
  • 2025-2026年国际东南亚专线物流公司推荐:TOP5口碑服务评测对比顶尖B2B大宗贸易港口拥堵 - 品牌推荐
  • **构建去中心化金融新范式:基于Solidity的DeFi协议开发实战解析**在区块链技术飞速发展的今天,**
  • Cy5-Fe₃O₄ NPs,Cy5标记四氧化三铁纳米颗粒,反应步骤
  • DAMO-YOLO入门指南:理解COCO 80类标准与达摩院扩展类别的映射关系
  • 【大白话说Java面试题】【Java基础篇】第2题:Iterator的fail-fast和fail-safe机制有什么区别?
  • Dify日志审计配置总失败?92%团队忽略的时区陷阱、权限继承断层与审计缓冲区溢出问题全解析,立即修复!
  • 2025-2026年全球25-30万五座SUV车型推荐:五款口碑产品评测对比顶尖城市通勤成本高昂 - 品牌推荐
  • Shopee一面:你使用 RAG 给大模型一个输入,系统是怎样的工作流程?
  • 攻击者可利用的 FortiSandbox 漏洞 PoC 公开,可执行任意命令
  • 从航拍到模型:手把手教你用‘焦距’和‘像元尺寸’反算无人机航高(附Excel计算工具)
  • 88.合并两个有序数组
  • 创建pg_trgm插件报错,提示:“错误,操作符 % 已经存在”
  • 算法训练营第八天|88.合并两个有序数组
  • Dify多模态Pipeline调试失败率下降82%的关键动作:OpenTelemetry埋点+自定义Trace Context注入实战
  • 2026年4月25-30万五座SUV车型推荐:五款口碑产品评测对比顶尖家庭出行空间焦虑 - 品牌推荐
  • Ollama + ModelScope:本地大模型极简部署
  • WuliArt Qwen-Image Turbo部署案例:中小企业AI设计助手低成本GPU部署实践
  • Dify工业知识库性能压测实录:10万页PDF+2000+设备BOM结构,QPS 47.3仍稳如磐石
  • Claude Opus 4.7 API 接入指南:最强模型实测与中转配置教程(2026)
  • 警惕AI全自动攻击!Claude Opus成功构建Chrome漏洞武器化链路
  • 2025-2026年东南亚专线物流公司推荐:TOP5口碑服务评测对比知名工厂项目物流时效不稳 - 品牌推荐
  • 5大核心优势:NVMe设备全生命周期管理工具深度解析
  • Access练习题(5)
  • 2025-2026年头顶补发片品牌推荐:五大口碑产品评测对比顶尖产后脱发职场自信. - 品牌推荐
  • 快速体验CAM++:上传两段语音,秒级判断是否同一说话人
  • 【独家逆向分析】:解构 Dify v0.7.3 插件协议与 C# 14 AOT 运行时兼容性边界(附 ILTrim 规则白名单)