一、作业信息
github网址 | https://github.com/easytime2000/MathApp |
---|---|
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/?page=3 |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13470 |
李易时:3123004271
林烁:3123004274
二.PSP表格:
PSP2 1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 300 | 300 |
Estimate | 估计这个任务需要多少时间 | 300 | 300 |
Development | 开发 | 200 | 200 |
Analysis | 需求分析(包括学习新技术) | 60 | 60 |
Design Spec | 生成设计文档 | 20 | 10 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 20 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 100 | 120 |
Code Review | 代码复审 | 5 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 15 | 30 |
Test Report | 测试报告 | 15 | 15 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 15 | 20 |
合计 | 375 | 395 |
三.效能分析
性能优化成果
通过性能分析工具,我们识别并优化了程序中的性能瓶颈:
优化前性能数据:
generate_questions_and_answers 执行时间: 36ms
主要瓶颈: 重复检查算法、表达式生成策略
优化后性能数据:
generate_questions_and_answers 执行时间: 3.2ms
性能提升: 超过10倍
性能优化策略
缓存机制: 使用哈希缓存避免重复计算
预生成策略: 预生成操作符组合减少随机选择
快速约束检查: 提前终止无效表达式生成
简化重复检查: 使用哈希值比较替代复杂表达式分析
智能重试机制: 合理控制最大尝试次数
性能分析图:
从性能分析图可见:
test_full_generation_and_write: 45.2% 执行时间
generate_questions_and_answers: 3.2% 执行时间(优化后)
其他工具函数: 占比均小于5%
设计实现过程
系统架构
text
四则运算系统
├── 命令行接口 (command_line.py)
├── 图形界面 (gui.py, main.py)
├── 核心引擎
│ ├── 题目生成 (question_generator.py)
│ ├── 分数处理 (fraction_utils.py)
│ ├── 评分系统 (grader.py)
│ └── 工具函数 (utils.py)
关键类与函数设计
- 题目生成模块 (question_generator.py)
python
核心函数
- generate_questions_and_answers(n, range_val) # 主生成函数
- generate_valid_expression_fast() # 快速生成有效表达式
- generate_number() # 生成数字(整数或分数)
- is_duplicate_fast() # 快速重复检查
- 分数处理模块 (fraction_utils.py)
python
- parse_fraction() # 解析分数字符串
- evaluate_expression() # 计算表达式值
- fraction_to_str() # 分数转字符串
- 评分模块 (grader.py)
python
- grade() # 自动评分
- write_grade_file() # 生成成绩文件
关键算法流程图
text
开始生成题目
↓
输入参数验证 (n, r)
↓
循环生成直到满足数量或达到最大尝试次数
↓
生成操作符组合
↓
生成数字序列
↓
构建表达式并计算
↓
约束检查(负数、除法结果等)
↓
重复检查
↓
通过检查 → 添加到题目列表
↓
输出题目和答案文件
代码说明
关键代码片段
- 快速表达式生成(性能优化核心)
python
def generate_valid_expression_fast(range_val, operators):numbers = [generate_number(range_val) for _ in range(len(operators) + 1)]expr_parts = [numbers[0]]current_value = parse_fraction(numbers[0])for i, op in enumerate(operators):next_num = numbers[i + 1]next_value = parse_fraction(next_num)# 快速约束检查 - 提前终止无效生成if op == '-' and current_value < next_value:return None, None # 减法结果不能为负if op == '÷' and (next_value == 0 or current_value >= next_value):return None, None # 除法结果应为真分数# ... 运算执行和验证
- 智能重复检查
python
def is_duplicate_fast(expr, existing_exprs):"""使用哈希值的快速重复检查"""expr_key = hash(expr.replace(' ', '')) # 移除空格作为keyif expr_key in _expression_cache:return True_expression_cache.add(expr_key)return False
- 分数表达式计算
python
def evaluate_expression(expr):"""安全计算表达式,支持分数运算"""try:expr_safe = expr.replace('×', '*').replace('÷', '/')# 把分数 1/2 变成 Fraction(1, 2)expr_safe = re.sub(r'(\d+)/(\d+)', r'Fraction(\1, \2)', expr_safe)result = eval(expr_safe, {"Fraction": Fraction})return resultexcept Exception:return None
测试运行
测试用例设计
- 基本功能测试
python
测试用例1: 生成10道题目,范围10
python command_line.py -n 10 -r 10
测试用例2: 生成分数题目
python command_line.py -n 5 -r 5
测试用例3: 判分功能测试
python command_line.py -e Exercises.txt -a Answers.txt
- 边界条件测试
python
测试用例4: 最小范围测试
python command_line.py -n 3 -r 2
测试用例5: 大量题目生成测试
python command_line.py -n 100 -r 10
测试用例6: GUI界面测试
python main.py
- 错误处理测试
python
测试用例7: 无效参数测试
python command_line.py -n 0 -r 10
python command_line.py -n 10 -r 1
测试用例8: 文件不存在测试
python command_line.py -e not_exist.txt -a not_exist.txt
- 题目质量测试
python
测试用例9: 约束验证测试
验证生成的题目是否满足:
无负数结果
除法结果为真分数
运算符不超过3个
无重复题目
测试用例10: 性能测试
生成1000道题目测试系统稳定性
python command_line.py -n 1000 -r 20
测试结果验证
通过以下方式确保程序正确性:
自动验证: 程序内置约束检查确保题目质量
手动抽样: 随机抽查题目验证计算正确性
文件格式: 验证输出文件格式符合要求
性能基准: 确保生成时间在可接受范围内
项目小结
算法复杂度 :表达式规范化算法复杂度较高,可进一步优化
用户界面 :命令行界面不够友好,可考虑添加图形界面
内存占用:单生成大量题目时内存占用过大
改进优化方向
在项目初期可以制定更详细的开发计划和代码规范
增加自动化单元测试的覆盖率
在功能开发过程中可以增加更多的中间检查点