- Github链接
- 姓名:韩业浩 学号:3121004860
这个作业属于那个课程 | 软件工程-计科21级12班 |
---|---|
这个作业要求在哪里 | 结对项目 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 40 |
Estimate | 估计这个任务需要多少时间 | 100 | 120 |
Development | 开发 | 20 | 30 |
Analysis | 需求分析(包括学习新技术) | 50 | 40 |
Design Spec | 生成设计文档 | 5 | 15 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 80 | 110 |
Coding Review | 代码复审 | 40 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 75 |
Reporting | 报告 | 60 | 70 |
Test Repor | 测试报告 | 30 | 25 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 15 | 10 |
合计 | 565 | 670 |
二、效能分析
使用Intellij Profiler分析性能
三、设计实现过程
总体设计
依赖
junit,版本为4.13.2
工具类
FIleUtils
- 功能列表
- 实现保存题目到文件(saveExercisesToFile)
- 实现保存答案到文件(saveAnswersToFile)
- 读取文件内容(readFileLines)
- 判断答案并统计写入(checkAnswers)
- 将结果写入统计文件(writeGradeToFile)
- 索引统一格式(getIndicesString)
RandomUtils
- 功能列表
- 生成随机数字(generateNumber)
- 生成随机运算符(generateOperator)
ConstantUtils
- 常量工具类:包含两个参数
- 最大运算符个数(MAX_OPERATORS = 3)
- 真分数分母的最大值(MAX_DENOMINATOR = 10)
CalculateUtils
- 功能:计算结果(calculateAnswer)
业务层
接口:GenerateService
- 方法
- 生成指定数量的题目(generateExercises)
- 生成单个题目(generateExercise)
实现类:GenerateServiceImpl
四、代码说明
- 定义常量,包括最大运算符个数和真分数分母的最大值。
- 创建了一个
GenerateServiceImpl
类,用于生成题目,在参数中接收题目数量、数值范围。 FIleUtils
类将题目文件和答案文件作为参数并保存。generateExercises()
方法是生成题目的逻辑,检查重复题目并使用saveExercisesToFile()
方法添加到题目列表中。generateExercise()
方法用于生成一个题目。它随机生成数值和运算符,并按照一定的格式拼接成题目字符串。generateNumber()
方法用于随机生成一个自然数或真分数。根据生成的随机数,确定是生成自然数还是真分数。对于真分数,根据分母的最大值生成分子和分母,并将其转换为带分数形式。generateOperator()
方法用于随机生成一个运算符,包括加减乘除。calculateAnswer()
方法用于计算题目的结果。它从左至右遍历题目的每个运算符和操作数,按照运算符进行四则运算。saveAnswersToFile()
方法用于将答案写入文件。checkAnswer()
方法用于判断答案并统计写入统计文件。main()
方法是程序的入口,它解析命令行参数,并调用上述方法生成题目、计算答案并写入文件。
五、测试运行
单元测试展示
FileUtilsTest
-
代码
public class FileUtilsTest { @Test public void saveExercisesToFileTest() { List<String> list = new ArrayList<>(); Collections.addAll(list, "1 + 5 =", "5 * 8 =", "6 / 3 ="); FileUtils.saveExercisesToFile(list, "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Exercises.txt"); } @Test public void saveAnswersToFileTest() { List<String> list = new ArrayList<>(); Collections.addAll(list, "6", "40", "2"); FileUtils.saveAnswersToFile(list, "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Answers.txt"); } @Test public void checkAnswersTest() { FileUtils.checkAnswers("D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Exercises.txt", "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Answers.txt", "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Grade.txt"); } }
-
测试覆盖率
CalculateUtilsTest
-
代码
public class CalculateUtilsTest { @Test public void calculateAnswerTest() { CalculateUtils.calculateAnswer("1'2/7 × 4 + 3 × 3 = "); CalculateUtils.calculateAnswer("5 × 8 = "); CalculateUtils.calculateAnswer("3 + 8 - 2'1/4 = "); } }
-
测试覆盖率
GenerateServiceImplTest
-
代码
public class GenerateServiceImplTest { private final GenerateService generateService = new GenerateServiceImpl(); @Test public void generateExerciseTest() { String exercise = generateService.generateExercise(10); System.out.println(exercise); } @Test public void generateExercisesTest() { List<String> exercises = generateService.generateExercises(5, 10); for (String exercise : exercises) { System.out.println(exercise); } } }
-
测试覆盖率
MyappTest
-
代码
public class MyappTest { private static final GenerateService GENERATE_SERVICE = new GenerateServiceImpl(); // 生成业务对象 @Test public void totalTest() { // 声明文件位置 String exercisesFile = "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Exercises.txt"; String answersFile = "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Answers.txt"; String gradeFile = "D:\\HYHAO\\Documents\\four-operations\\four-operations\\3121004860\\four-operation\\src\\main\\resources\\Grade.txt"; // 生成题目 List<String> exercises = GENERATE_SERVICE.generateExercises(5, 5); // 保存题目到文件 FileUtils.saveExercisesToFile(exercises, exercisesFile); // 计算答案 List<String> answers = new ArrayList<>(); String answer; for (String exercise : exercises) { answer = CalculateUtils.calculateAnswer(exercise); answers.add(answer); } // 保存答案到文件 FileUtils.saveAnswersToFile(answers, answersFile); // 判断答案并统计 FileUtils.checkAnswers(exercisesFile, answersFile, gradeFile); } }
-
测试覆盖率
六、项目小结
该命令行程序能够方便地生成小学四则运算题目,可以根据用户需求自定义生成的题目数量和运算符数量。通过本次项目构建,我学习到了很多新的知识以及拓展了对待问题的角度。