• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
order-god
博客园    首页    新随笔    联系   管理    订阅  订阅
结对项目
  • 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

  • 功能列表
    1. 实现保存题目到文件(saveExercisesToFile)
    2. 实现保存答案到文件(saveAnswersToFile)
    3. 读取文件内容(readFileLines)
    4. 判断答案并统计写入(checkAnswers)
    5. 将结果写入统计文件(writeGradeToFile)
    6. 索引统一格式(getIndicesString)

RandomUtils

  • 功能列表
    1. 生成随机数字(generateNumber)
    2. 生成随机运算符(generateOperator)

ConstantUtils

  • 常量工具类:包含两个参数
    1. 最大运算符个数(MAX_OPERATORS = 3)
    2. 真分数分母的最大值(MAX_DENOMINATOR = 10)

CalculateUtils

  • 功能:计算结果(calculateAnswer)

业务层

接口:GenerateService

  • 方法
    1. 生成指定数量的题目(generateExercises)
    2. 生成单个题目(generateExercise)

实现类:GenerateServiceImpl

四、代码说明

  1. 定义常量,包括最大运算符个数和真分数分母的最大值。
  2. 创建了一个GenerateServiceImpl类,用于生成题目,在参数中接收题目数量、数值范围。
  3. FIleUtils类将题目文件和答案文件作为参数并保存。
  4. generateExercises()方法是生成题目的逻辑,检查重复题目并使用saveExercisesToFile()方法添加到题目列表中。
  5. generateExercise()方法用于生成一个题目。它随机生成数值和运算符,并按照一定的格式拼接成题目字符串。
  6. generateNumber()方法用于随机生成一个自然数或真分数。根据生成的随机数,确定是生成自然数还是真分数。对于真分数,根据分母的最大值生成分子和分母,并将其转换为带分数形式。
  7. generateOperator()方法用于随机生成一个运算符,包括加减乘除。
  8. calculateAnswer()方法用于计算题目的结果。它从左至右遍历题目的每个运算符和操作数,按照运算符进行四则运算。
  9. saveAnswersToFile()方法用于将答案写入文件。
  10. checkAnswer()方法用于判断答案并统计写入统计文件。
  11. 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);
        }
    }
    
  • 测试覆盖率

六、项目小结

该命令行程序能够方便地生成小学四则运算题目,可以根据用户需求自定义生成的题目数量和运算符数量。通过本次项目构建,我学习到了很多新的知识以及拓展了对待问题的角度。

posted on 2023-09-28 12:04  hyhao  阅读(57)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3