结对项目(潘健龙、沈彦丞)

姓名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流程图分析
flowchart TD A[开始] --> B[输入需要生成的题目数量] B --> C[记录程序开始时间] C --> D[循环:生成一道四则运算题目] D --> E[将题目写入文件] E --> F{是否达到指定题目数量?} F --否--> D F --是--> G[关闭文件流] G --> H[记录程序结束时间,计算耗时] H --> I[输出运行总耗时] I --> J[结束]

四、优化分析

此处给出部分运行截图
image
image
image

题目数量 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) 的时间复杂度,但能降低常数开销,同等题目数量下运行耗时明显减少;题目量越大,优化效果越明显。

优化代码

image

此处给出部分截图
image
image
image

优化结果

题目数量 N 原始版本平均耗时 (ms) BufferedWriter 优化后平均耗时 (ms)
1000 20.33 19.66
10000 35.00 31.66
50000 67.00 56.33

图:优化前后程序性能对比折线图。两条折线均随题目数量增加近似线性增长,算法时间复杂度为 O (N);缓冲优化版曲线整体低于原始版本,说明 BufferedWriter 通过减少磁盘 IO 调用次数,有效降低程序运行耗时。
image
从折线图可见,程序运行耗时随题目数量增加近似线性上升,算法时间复杂度为O(N)。
原始代码性能瓶颈集中在磁盘 IO 操作:FileWriter每次调用write()都会直接向磁盘发起写入请求。磁盘读写速度远低于内存运算,当题目量大时,频繁 IO 调用带来较大开销。

五、项目小结

本次项目顺利完成预期功能,实现了四则运算题目批量生成与文件保存。通过对照实验验证了BufferedWriter缓冲流可有效减少磁盘IO开销,大幅提升程序运行效率。结对编程的双人互查模式,有效减少代码漏洞,提升了代码规范性与项目稳定性。

存在问题与经验教训

开发初期我们分工衔接不够顺畅,调试中出现过小IO资源处理、代码冗余等细节问题。通过本次实践总结出,开发前需统一思路、明确分工,开发中双人交叉核查,能够有效规避多数代码问题,提升开发效率。

结对感受与组员互评

结对过程相比单人开发容错率更高、效率更快,双人实时沟通纠错,有效避免了单人开发的思维局限,协作体验良好。

  • 潘健龙:组员闪光点:沈彦丞同学在本次项目中表现十分优秀,闪光点突出。他代码基础扎实,逻辑思维清晰,在四则运算逻辑编写、IO流优化调试阶段反应迅速,能够快速定位程序异常问题,主动承担核心开发任务,对待项目认真负责、执行力强。遇到性能优化难点时,他主动查阅资料、对比两种IO流的差异,推动了本次BufferedWriter性能优化实验顺利完成,为项目整体完成质量提供了极大保障。
    改进建议:他在文档整理和细节总结上稍有欠缺,后续可注重文档规范化,提前梳理开发思路,进一步提升协作完整性。
  • 沈彦丞:组员闪光点:本次与潘健龙同学结对编程,让我深刻体会到团队协作在程序开发中的重要价值,也切实感受到结对开发相较于单人开发的巨大优势。独立开发时很容易陷入固定思维,对细节问题视而不见,而双人结对模式可以实现分工互补、双向纠错。在本次合作过程中,每当代码出现异常、逻辑出现漏洞或优化思路不清晰时,他都会及时沟通交流,互相提出改进意见,多角度分析问题、梳理解决方案,有效突破单人开发的思维局限,让项目整体推进更加高效有序。
    改进建议:在团队沟通细节上,遇到技术难题时偏向独立钻研,偶尔会忽略及时同步进度与思路,导致搭档无法第一时间跟进项目状态。

总结

本次结对项目让我们巩固了IO流与性能优化知识,深刻体会了团队协作的意义。我们互相取长补短、共同进步,提升了编码与协作能力。后续我们将规避细节问题,规范代码与文档,提升团队开发综合能力。

posted @ 2026-09-22 14:37  潘健龙  阅读(11)  评论(0)    收藏  举报