双人合作项目 - 四则运算生成器
一、项目信息
项目名称 | 双人合作项目-四则运算生成器 |
---|---|
课程所属班级 | 计科2班* |
作业要求 | 作业要求链接 |
作业目标 | 熟悉体会双人合作构建项目的流程,深入理解项目实现过程中的分工与交流的重要性所在 |
项目成员 | 赖彦彤(3223004339) |
githud地址 | https://github.com/Yantyu/- |
二、PSP 表
阶段 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 25 |
Estimate | 估计这个任务需要多少时间 | 25 | 30 |
Development | 开发 | 200 | 350 |
Analysis | 需求分析(包括学习新技术) | 300 | 350 |
Design Spec | 生成设计文档 | 20 | 35 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 40 |
Design | 具体设计 | 20 | 40 |
Coding | 具体编码 | 140 | 180 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 240 | 280 |
Reporting | 报告 | 90 | 120 |
Test Report | 测试报告 | 40 | 50 |
Size Measurement | 计算工作量 | 30 | 45 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | ![]() |
|
40 | 45 | ||
合计 | 1235 | 1650 |
三、效能分析
1. 改进思路
检查 Fraction
类中的加减乘除实现,避免重复创建临时对象或执行冗余的计算步骤。
分析程序是否存在对相同表达式的多次求值若发现重复计算,可通用Memoization或中间结果复用的方式进行优化。
2. 性能分析结果
以下为性能分析图:
ArithmeticCalculator.calculateAnswer 被多次频繁调用,占用了较多的 CPU 时间
四、设计与实现过程
1. 设计概述
程序采用模块化结构设计,主要模块如下:
四、设计与实现过程
1. 设计概述
本程序采用模块化结构设计,以 tet_1
包为核心。
模块文件 | 功能描述 |
---|---|
MyApp.java | 主程序入口,负责命令行参数解析、功能调度(题目生成或批改)。 |
ExerciseGenerator.java | 四则运算题目生成模块,支持随机生成整数与真分数的加减乘除混合运算表达式。 |
ArithmeticCalculator.java | 表达式计算与求值模块,基于栈结构实现中缀表达式求值,支持真分数运算。 |
Fraction.java | 分数类模块,封装加减乘除运算及带分数化简显示。 |
FileUtil.java | 文件读写工具模块,用于题目与答案的存储与加载。 |
GradeChecker.java | 批改模块,对比用户答案与标准答案,统计正确与错误结果,生成成绩文件。 |
JUnit 测试模块 | 对核心模块进行功能性验证,包括分数运算、表达式计算、文件操作与主程序参数验证。 |
模块之间的调用关系如下所示:
MyApp.java
├── ExerciseGenerator.java → 题目生成
│ ├── ArithmeticCalculator.java → 计算表达式答案
│ └── FileUtil.java → 写入 Exercises.txt 与 Answers.txt
│
└── GradeChecker.java → 批改功能
├── FileUtil.java → 读取文件内容
└── ArithmeticCalculator.java → 校验正确答案
2. 功能模块设计与类说明
类 1:MyApp
- 功能:程序主入口,解析命令行参数并调用对应功能。
- 主要参数说明:
-n <number> -r <range>
:生成<number>
道题目,操作数取值范围为<range>
。-e <exercisefile>.txt -a <answerfile>.txt
:对指定文件的题目与答案进行批改。
- 输入输出示例:
java MyApp -n 10 -r 100
java MyApp -e Exercises.txt -a Answers.txt
类 ExerciseGenerator
- 功能根据指定数量和数值范围生成四则运算题目并输出题目与答案文件。
- 主要参数说明:
-num:要生成的题目数量。
-range:操作数取值范围(用于生成整数或分数的分子/分母)。 - 输入输出示例:
ExerciseGenerator gen = new ExerciseGenerator();
gen.generateExercises(50, 100);
// 生成 Exercises.txt 和 Answers.txt
-核心函数:
-generateExercises(int num, int range):批量生成题目与答案并保存文件。
-generateOperand(int range):随机生成自然数或真分数字符串(如 3、1/2)。
-buildExpression(Listoperands, List ops):拼接表达式字符串(例如 1/2 + 3 =)。
类 ArithmeticCalculator
- 功能:解析中缀表达式并计算结果,返回标准带分数格式。
- 输入输出示例:
-支持 + - × ÷ / 等运算符(接受 ÷ 与 / 同为除法)。
-使用栈(运算符栈与操作数栈)控制优先级与括号。
-通过 Fraction 类做分数运算,结果格式化为整数/真分数/带分数。 - 输入输出示例:
String expr = "1/2 + 3 × (2 - 1/3) =";
String ans = ArithmeticCalculator.calculateAnswer(expr); // 返回 "4’1/6" 等格式
-核心函数:
-calculateAnswer(String expression):主入口,清洗表达式、解析并返回带分数字符串。
-applyOp(Fraction b, Fraction a, char op):执行单次二元运算(注意栈顺序 a op b)。
-precedence(char op):返回运算符优先级(用于控制栈操作)。
类 Fraction
- 功能:分数数据结构与分数四则运算实现,支持格式化输出。
- 主要参数说明:
-内部使用 BigInteger 存储分子、分母以保证大数精度。
-构造时自动约分(利用 gcd()),并规范化负号(分母始终为正)。
-支持整数、真分数与带分数的互转与字符串输出(如 2、1/2、1’1/2)。 - 输入输出示例:
Fraction f1 = new Fraction(BigInteger.valueOf(3), BigInteger.valueOf(2)); // 3/2
String s = f1.toProperFractionString(); // "1’1/2"
-核心函数:
-add(Fraction other) / subtract(Fraction other) / multiply(Fraction other) / divide(Fraction other):四则运算,返回新 Fraction。
-reduce():约分并规范负号。
-toProperFractionString():返回带分数格式字符串(整数或真分数时返回相应格式)。
-fromString(String s)(静态):解析 "3", "1/2", "1’1/2" 等格式生成 Fraction。
类 FileUtil
-
功能:文件读写工具,统一管理 I/O。
-
主要参数说明:
-提供按行读取与按行写入能力;异常统一处理并抛出或记录。
-支持指定编码(如 UTF-8)。 -
输入输出示例:
Listlines = FileUtil.readFromFile("Exercises.txt");
FileUtil.saveToFile("Answers.txt", answersList);
-核心函数:
-readFromFile(String filename):逐行读取文件,返回
-List。
-saveToFile(String filename, Listcontent):将内容写入文件(覆盖或追加可选参数)。
-appendToFile(String filename, String line)(可选):向文件追加单行。
类 GradeChecker
- 功能:自动批改题目,比对用户答案并生成评分报告(Grade.txt)。
- 主要参数说明:
-读取 Exercises.txt(或指定习题文件)与 Answers.txt(或学生答案文件);
-对每道题调用 ArithmeticCalculator.calculateAnswer() 得到标准答案并与学生答案比对(格式化比较);
-统计正确数、错误数、并可列出错题详情(题目、学生答案、标准答案)。 - 输入输出示例:
-GradeChecker checker = new GradeChecker();
-checker.check("Exercises.txt", "StudentAnswers.txt", "Grade.txt");
-核心函数:
-check(String exerciseFile, String answerFile, String resultFile):主流程,生成 Grade.txt。
-compareAnswers(String standard, String student):比较两个答案(考虑等价分数格式)。
-formatReport(int total, int correct, Listmistakes):生成可读的评分报告(可选 Markdown 格式输出)。