结对项目(潘健龙、沈彦丞)
| 姓名1:潘健龙 | 学号:3124004221 |
|---|---|
| 姓名1:沈彦丞 | 学号:3124004223 |
| GitHub地址:https://github.com/PJL421/arithmetic-generator.git |
一、项目概述
- 本程序基于 Java 语言实现,能够自动生成指定数量、指定数值范围的整数四则运算题目,支持加减乘运算,自动计算并保存标准答案;同时提供判题功能,读取题目文件与答案文件,生成判卷结果文件。
程序通过命令行参数区分两种工作模式:
1.生成题目模式:-n 题目数量 -r 数值上限
2.判题模式:-e 题目文件 -a 答案文件 - 程序一共分为 5 个类:
1.Main:程序入口,解析命令行参数,调度生成 / 判题功能
2.ProblemGenerator:题目生成器,批量生成四则运算表达式
3.Expression:表达式类,生成随机运算式,计算表达式结果
4.Fraction:分数类(预留,支持后续扩展真分数四则运算)
5.Judge:判题类,读取题目、答案文件,输出判分结果到 Grade.txt
二、PSP2.1
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 28 |
| · Estimate | · 估计任务需要的时间 | 30 | 28 |
| Development | 开发 | 420 | 440 |
| · Analysis | · 需求分析(包括学习新技术) | 60 | 65 |
| · Design Spec | · 生成设计文档 | 30 | 32 |
| · Design Review | · 设计复审 | 20 | 18 |
| · Coding Standard | · 制定代码规范 | 10 | 12 |
| · Design | · 具体设计 | 50 | 48 |
| · Coding | · 具体编码 | 160 | 170 |
| · Code Review | · 代码复审 | 35 | 38 |
| · Test | · 测试、修改和提交 | 55 | 57 |
| Reporting | 报告 | 80 | 85 |
| · Test Report | · 测试报告 | 30 | 33 |
| · Size Measurement | · 计算工作量 | 10 | 9 |
| · Postmortem & Process Improvement Plan | · 事后总结与过程改进计划 | 40 | 43 |
| 合计 | 530 | 553 |
三、设计过程
4.1总体设计
- 程序分为两大模块:表达式生成模块与文件写入模块。
表达式生成模块:使用随机数生成运算数字与运算符,拼接成四则运算式子;
文件写入模块:将生成的题目持续写入外部 txt 文件。
原始版本采用FileWriter直接写入文件;优化版本替换为BufferedWriter缓冲流写入,降低磁盘 IO 开销。
程序整体流程:接收题目数量参数 → 开启计时 → 循环生成每一道四则运算表达式 → 将表达式写入文件 → 循环结束,关闭流,停止计时,输出总耗时。
![image]()
4.2 详细设计
- 随机表达式生成:通过 Random 类随机选取操作数和+、-、*、/运算符,拼接为字符串形式的算术题目。
文件写入:原始方案使用FileWriter,每生成一道题目就调用一次 write 写入磁盘;优化方案改用BufferedWriter,利用内存缓冲区缓存文本,批量写入磁盘。
计时功能:使用系统时间戳,记录程序开始和结束时刻,计算程序运行的毫秒数,用于性能实验。
异常处理:增加 IO 异常捕获,保证文件读写出现异常时可以正常关闭流资源。
4.3 测试方案设计 - 为分析程序性能,设计多组性能测试:分别生成 1000、10000、50000 道题目,每组重复运行 3 次,记录每次耗时并求取平均值。
对比原始FileWriter版本与BufferedWriter优化版本的运行耗时,绘制双折线图,分析性能瓶颈以及优化效果。
4.4流程图分析
四、优化分析
此处给出部分运行截图



| 题目数量 N | 第 1 次耗时 (ms) | 第 2 次耗时 (ms) | 第 3 次耗时 (ms) | 平均耗时 (ms) |
|---|---|---|---|---|
| 1000 | 20 | 21 | 20 | 20.33 |
| 10000 | 36 | 34 | 35 | 35 |
| 50000 | 66 | 68 | 67 | 67 |
本次对算术表达式生成程序进行多组性能测试,分别选取 1000、10000、50000 三组不同题量进行测试,每组测试重复运行 3 次,记录每次运行耗时并计算平均值,以此评估程序的运行效率。
从测试结果可以看到:生成 1000 道算术题目平均耗时 20.33ms;生成 10000 道算术题目平均耗时 35ms;生成 50000 道算术题目平均耗时 66ms。随着题目数量增加,程序耗时呈平缓增长趋势,没有出现耗时暴涨的情况,说明程序整体性能良好。
优化方案
性能测试发现,程序瓶颈是频繁的磁盘 IO。原始FileWriter每次写入都直接操作磁盘,开销较大。
优化方案:改用BufferedWriter缓冲流,数据先写入内存缓冲区,攒够数据后一次性写入磁盘,减少磁盘调用次数。
辅助优化:复用 Random 对象、使用StringBuilder拼接字符串,减少对象创建开销。
优化不会改变算法 O (N) 的时间复杂度,但能降低常数开销,同等题目数量下运行耗时明显减少;题目量越大,优化效果越明显。
优化代码

此处给出部分截图



优化结果
| 题目数量 N | 原始版本平均耗时 (ms) | BufferedWriter 优化后平均耗时 (ms) |
|---|---|---|
| 1000 | 20.33 | 19.66 |
| 10000 | 35.00 | 31.66 |
| 50000 | 67.00 | 56.33 |
图:优化前后程序性能对比折线图。两条折线均随题目数量增加近似线性增长,算法时间复杂度为 O (N);缓冲优化版曲线整体低于原始版本,说明 BufferedWriter 通过减少磁盘 IO 调用次数,有效降低程序运行耗时。

从折线图可见,程序运行耗时随题目数量增加近似线性上升,算法时间复杂度为O(N)。
原始代码性能瓶颈集中在磁盘 IO 操作:FileWriter每次调用write()都会直接向磁盘发起写入请求。磁盘读写速度远低于内存运算,当题目量大时,频繁 IO 调用带来较大开销。
五、项目小结
本次项目顺利完成预期功能,实现了四则运算题目批量生成与文件保存。通过对照实验验证了BufferedWriter缓冲流可有效减少磁盘IO开销,大幅提升程序运行效率。结对编程的双人互查模式,有效减少代码漏洞,提升了代码规范性与项目稳定性。
存在问题与经验教训
开发初期我们分工衔接不够顺畅,调试中出现过小IO资源处理、代码冗余等细节问题。通过本次实践总结出,开发前需统一思路、明确分工,开发中双人交叉核查,能够有效规避多数代码问题,提升开发效率。
结对感受与组员互评
结对过程相比单人开发容错率更高、效率更快,双人实时沟通纠错,有效避免了单人开发的思维局限,协作体验良好。
- 潘健龙:组员闪光点:沈彦丞同学在本次项目中表现十分优秀,闪光点突出。他代码基础扎实,逻辑思维清晰,在四则运算逻辑编写、IO流优化调试阶段反应迅速,能够快速定位程序异常问题,主动承担核心开发任务,对待项目认真负责、执行力强。遇到性能优化难点时,他主动查阅资料、对比两种IO流的差异,推动了本次BufferedWriter性能优化实验顺利完成,为项目整体完成质量提供了极大保障。
改进建议:他在文档整理和细节总结上稍有欠缺,后续可注重文档规范化,提前梳理开发思路,进一步提升协作完整性。 - 沈彦丞:组员闪光点:本次与潘健龙同学结对编程,让我深刻体会到团队协作在程序开发中的重要价值,也切实感受到结对开发相较于单人开发的巨大优势。独立开发时很容易陷入固定思维,对细节问题视而不见,而双人结对模式可以实现分工互补、双向纠错。在本次合作过程中,每当代码出现异常、逻辑出现漏洞或优化思路不清晰时,他都会及时沟通交流,互相提出改进意见,多角度分析问题、梳理解决方案,有效突破单人开发的思维局限,让项目整体推进更加高效有序。
改进建议:在团队沟通细节上,遇到技术难题时偏向独立钻研,偶尔会忽略及时同步进度与思路,导致搭档无法第一时间跟进项目状态。
总结
本次结对项目让我们巩固了IO流与性能优化知识,深刻体会了团队协作的意义。我们互相取长补短、共同进步,提升了编码与协作能力。后续我们将规避细节问题,规范代码与文档,提升团队开发综合能力。


浙公网安备 33010602011771号