当前位置: 首页 > news >正文

结对项目:四则运算生成器

双人合作项目 - 四则运算生成器

一、项目信息

项目名称 双人合作项目-四则运算生成器
课程所属班级 计科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 事后总结,并提出过程改进计划 微信图片_20250923234939_72_517
40 45
合计 1235 1650

三、效能分析

1. 改进思路

检查 Fraction 类中的加减乘除实现,避免重复创建临时对象或执行冗余的计算步骤。
分析程序是否存在对相同表达式的多次求值若发现重复计算,可通用Memoization或中间结果复用的方式进行优化。

2. 性能分析结果

以下为性能分析图:
微信图片_20250923234939_72_517
微信图片_20251022223423_118_517

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(List operands, 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)。

  • 输入输出示例
    List lines = FileUtil.readFromFile("Exercises.txt");
    FileUtil.saveToFile("Answers.txt", answersList);
    -核心函数
    -readFromFile(String filename):逐行读取文件,返回
    -List
    -saveToFile(String filename, List content):将内容写入文件(覆盖或追加可选参数)。
    -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, List mistakes):生成可读的评分报告(可选 Markdown 格式输出)。

3. 关键函数流程图

MyApp

flowchart TD A[程序启动] --> B{命令行参数} B -->|生成模式| C[调用 ExerciseGenerator] B -->|批改模式| D[调用 GradeChecker] B -->|参数错误| E[输出帮助信息] C --> F[生成 Exercises.txt 和 Answers.txt] D --> G[生成 Grade.txt] F --> H[结束] G --> H[结束] E --> H[结束]#### ExerciseGenerator ```mermaid flowchart TD A[开始] --> B[生成随机操作数与运算符] B --> C[组合成四则运算表达式] C --> D[调用 ArithmeticCalculator 计算正确答案] D --> E[写入 Exercises.txt 和 Answers.txt] E --> F[结束]#### ArithmeticCalculator ```mermaid flowchart TD A[读取表达式字符串] --> B[按空格分词] --> C{是否为操作数?} C -->|是| D[压入值栈] C -->|否| E[判断运算符优先级] E --> F[执行计算并压栈] F --> G{是否还有运算符?} G -->|是| E G -->|否| H[输出最终结果(带分数形式)] H --> I[结束]## 五、程序测试用例与验证### 1. 测试思路 程序涉及四个核心模块: 1. **Fraction** 分数运算与约分 2. **ArithmeticCalculator** 中缀表达式计算 3. **ExerciseGenerator** 题目生成 4. **GradeChecker** 批改练习测试目标: - 验证分数加减乘除运算正确性 - 验证带分数、真分数和整数输出正确性 - 验证复杂表达式运算顺序正确 - 验证题目生成与答案计算一致性 - 验证批改功能统计正确 原则:**覆盖所有运算类型 + 边界情况 + 异常情况**。---### 2. 测试用例列表| 序号 | 测试表达式 / 输入 | 预期输出 | 说明 | |------|-----------------|-----------|------| | 1 | `1 + 2` | `3` | 最简单整数加法,验证基本功能 | | 2 | `2 - 5` | `-3` | 验证整数减法产生负数情况 | | 3 | `3 * 4` | `12` | 验证整数乘法正确性 | | 4 | `8 ÷ 2` | `4` | 验证整数除法,除号处理正确 | | 5 | `1/2 + 1/3` | `5/6` | 真分数加法,验证分数约分功能 | | 6 | `3/4 - 1/2` | `1/4` | 真分数减法,保证符号正确 | | 7 | `2/3 * 3/4` | `1/2` | 真分数乘法,约分正确 | | 8 | `3/2 ÷ 1/3` | `4’1/2` | 带分数除法,验证带分数输出 | | 9 | `1 + 2 * 3` | `7` | 验证运算优先级,乘法先算 | | 10 | `(1 + 2) * 3` | `9` | 验证括号计算顺序正确(如果支持括号) | | 11 | `0 + 0` | `0` | 验证零值处理 | | 12 | `1 ÷ 0` | 抛出异常 | 验证除零异常捕获 | | 13 | `1’1/2 + 2’2/3` | `4’1/6` | 带分数加法,保证带分数计算正确 | | 14 | 自动生成 5 道题目(范围 1-10) | 文件 `Exercises.txt` 和 `Answers.txt` 内容一致 | 验证生成题目与答案一致性 | | 15 | 批改 2 道题目(正确答案/错误答案) | `Correct: 1, Wrong: 1` | 验证 GradeChecker 正确统计成绩 |---### 3. 测试结果示例1. **Fraction 测试**: -Fraction f1 = new Fraction("1", "2"); -Fraction f2 = new Fraction("1", "3"); assert f1.add(f2).toProperFractionString().equals("5/6"); 2. **ArithmeticCalculator 测试**: -assert ArithmeticCalculator.calculateAnswer("1+2*3").equals("7"); -assert ArithmeticCalculator.calculateAnswer("3/2÷1/3").equals("4’1/2"); 3. **ExerciseGenerator** 与 **GradeChecker** 测试: -自动生成题目 5 道 对生成题目计算答案,再用 GradeChecker 批改 结果与手动计算一致 ###测试结果图 ![image](https://img2024.cnblogs.com/blog/3700365/202510/3700365-20251022224447947-870519925.png)
http://www.hskmm.com/?act=detail&tid=36941

相关文章:

  • CSP-S2023
  • Spring Boot 中全面解决跨域请求
  • OpenTelemetry语义约定:规范可观测性数据,提升系统洞察力
  • 拓展欧几里得算法
  • 两两交换链表中的节点-leetcode
  • 算法第二章实践作业
  • 解决homebrew下载报错问题
  • 软考中级学习总结(5)
  • 软考中级学习总结(4)
  • 每日反思(2025_10_22)
  • docker: Error response from daemon: failed to set up container networking 解决办法
  • 实验2 现代C++编程初体验
  • CSP-S36
  • 新学期每日总结(第13天)
  • GCM(Galois/Counter Mode) 认证加密算法实现
  • 【学习笔记】slope-trick
  • 10.13-10.19学习做题笔记
  • 2025.10.22
  • yny计数题记录
  • 20232404 2025-2026-2 《网络与系统攻防技术》实验二实验报告
  • 1020302118兰逸霏的第一次作业
  • ubuntu 25.10 修改源 - ldx
  • pytorch学习笔记(1)
  • 20232318 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 《中华人民共和国网络安全法》第二十一条这一核心考点
  • 嵌入式软件分层架构设计 - lucky
  • DP 基础题乱做
  • [题解]P4616 [COCI 2017/2018 #5] Pictionary
  • 二三级区别
  • 第九章-Where-1S-tHe-Hacker