这个作业属于哪个课程 | 计科22级12班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
姓名&学号:
姓名 | 学号 |
---|---|
董雯霖 | 3122004780 |
陈金星 | 3122004774 |
GitHub链接: https://github.com/1534063091/Arithmometer
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 6 | 8 |
Estimate | 估计这个任务需要多少时间 | 6 | 8 |
Development | 开发 | 127 | 415 |
Analysis | 需求分析 (包括学习新技术) | 10 | 6 |
Design Spec | 生成设计文档 | 6 | 5 |
Design Review | 设计复审 | 6 | 4 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 3 |
Design | 具体设计 | 12 | 60 |
Coding | 具体编码 | 21 | 300 |
Code Review | 代码复审 | 9 | 7 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 30 |
Reporting | 报告 | 124 | 275 |
Test Repor | 测试报告 | 120 | 270 |
Size Measurement | 计算工作量 | 1 | 2 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 3 | 3 |
合计 | 257 | 698 |
二、效能分析
在改进程序性能上,主要思路是优化数学运算和文件处理的效率。特别是针对分数的加减乘除运算,减少了不必要的重复计算,并通过引入化简功能来避免生成复杂的分数。此外,文件读取和写入的部分进行了缓冲优化,减少了磁盘I/O的开销。
覆盖率:
性能分析:
1.生成10道题目时:
2.生成10000道题目时:
3.对给定的题目文件和答案文件,判定答案中的对错并进行数量统计时:
消耗最大的函数
经过性能分析,发现calculateAnswer函数是程序中消耗时间最多的部分,主要因为它处理了多种运算并且包含分数和整数的不同逻辑。此函数的优化通过提前判断运算类型,减少了代码分支的复杂性,从而提高了执行效率。
1. 性能瓶颈
- calculateAnswer 函数:这个函数是程序中的主要性能瓶颈。它需要对用户输入的算式进行解析和计算,尤其是在处理分数运算时,涉及的逻辑较复杂,分支判断多,可能导致性能下降。
- 文件读写操作:虽然 FileHandler 类中的读写操作相对简单,但频繁的磁盘 I/O 会影响性能,尤其是在生成大量题目和答案时。使用缓冲流和批量写入可以显著提高效率。
2. 资源消耗
- 内存使用:StringBuilder 在拼接题目和答案时有效地减少了内存的频繁分配和释放,有助于提升性能。然而,对于大规模数据的处理,仍需注意内存的使用情况。
- 随机数生成:Random 类在生成随机数时的效率相对较高,但在高并发场景下可能出现性能问题。若需处理大规模问题,可以考虑使用更高效的随机数生成算法。
3. 优化思路
- 减少分支判断:在 calculateAnswer 函数中,尽量减少复杂的条件判断,例如通过预先判断运算符类型来选择相应的计算逻辑,避免多次分支判断。
- 优化分数运算:将分数的加法、减法、乘法和除法提取成单独的函数,减少冗余代码,并提高可读性和可维护性。
- 文件操作优化:在读取文件时,可以使用 BufferedReader 来提升读取性能,同时在写入时使用 BufferedWriter 进行批量写入,从而减少频繁的磁盘I/O操作
三、设计实现过程
1. 系统架构
- 模块化设计:项目主要分为几个核心模块,包括:
- Main 类:程序入口,负责解析命令行参数和协调其他模块。
- ArithmeticGenerator 类:负责生成随机算式(包括分数和整数),并计算答案。
- Fraction 类:用于表示和处理分数,包括加、减、乘、除和化简功能。
- FileHandler 类:负责文件的读写操作,简化文件处理逻辑。
- AnswerChecker 类:用于检查用户答案的正确性,比较用户输入与计算结果。
2. 类之间关系
- 依赖关系:
- Main 类依赖于 ArithmeticGenerator 和 FileHandler 来生成题目和处理文件。
- ArithmeticGenerator依赖于 Fraction 类来进行分数运算。
- AnswerChecker依赖于 ArithmeticGenerator 来计算正确答案。
3. 关键函数设计
- generateQuestion(int maxRange):随机生成题目,包含分数和整数运算,返回格式化的题目字符串。
- calculateAnswer(String question):解析题目字符串,计算答案并返回。使用分数和整数的不同处理逻辑。
- writeGradeFile(String fileName, List
correct, List :将正确和错误的题目编号写入成绩文件,提供清晰的反馈。wrong)
四、代码说明
代码说明
在本项目中,我们设计了一个数学题生成与答案检查的系统,主要思路如下:
-
模块化设计:将系统分为多个类,每个类负责特定功能,如 Main 类负责程序入口和参数解析,ArithmeticGenerator 类负责生成题目和计算答案,Fraction 类用于表示和操作分数,FileHandler 类用于文件读写,AnswerChecker 类负责答案的检查和记录。
-
题目生成:ArithmeticGenerator 类使用随机数生成器决定生成的题目类型(分数或整数)及运算符,通过封装的方法确保题目生成逻辑清晰且易于扩展。
-
分数处理:Fraction 类封装了分数的加减乘除运算,确保每个操作后都能返回简化后的分数,增强了代码的可重用性。
-
文件操作:FileHandler 类简化了文件的读取和写入过程,通过单一接口提供相关功能,使得文件操作集中管理。
-
答案检查:AnswerChecker 类读取用户的答案和生成的题目,进行比较,并将结果输出到成绩文件中,这一过程保证了用户反馈的有效性。
五、测试运行
1.使用 -n 参数控制生成题目的个数,使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
2.生成的题目中计算过程不能产生负数
3.对给定的题目文件和答案文件,判定答案中的对错并进行数量统计
4.生成1万道题目
异常处理
以下是项目中关键异常处理的代码示例:
- 分母为零的检查(Fraction 类):
- 命令行参数解析(Main 类):
- 文件操作异常(FileHandler 类):
- 答案检查中的错误处理(AnswerChecker 类):
-
分数运算中的异常处理(ArithmeticGenerator 类):
六、项目小结
在这个项目中,我们成功实现了一个简单的算术题生成器和答案检查器,整体流程流畅,功能基本符合预期。但在这个过程中,我们也经历了许多挑战和收获。
成功之处
- 功能实现:项目的核心功能——生成算术题和计算答案,顺利完成,用户可以根据输入的参数生成不同数量和范围的题目。
- 模块化设计:代码结构清晰,模块划分合理,各个类之间的职责明确,便于后续的维护和扩展。
- 异常处理:我们对可能出现的异常情况进行了详细的处理,确保程序的健壮性,给用户友好的反馈。
不足之处
- 时间管理:在项目的早期阶段,我们对时间的估计不足,导致部分功能的实现和测试时间紧张。
- 测试覆盖不足:虽然我们编写了一些测试用例,但对边界条件和极端输入的测试相对较少,导致在某些情况下程序仍可能出现意外结果。
结对感受
在结对编程的过程中,我们发现彼此的优点和不足。我们都认为在下次项目中可以提前规划时间,设定更细化的计划,以便更好地控制进度。同时,可以加强对测试用例的编写,确保覆盖更全面。
标签:分数,文件,结对,题目,项目,生成,答案,ArithmeticGenerator From: https://www.cnblogs.com/dongwenlin/p/18438396