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

结对项目—小学四则运算题目生成器

项目成员 汪雨嫣3223003305、沙吉旦·乃吉米丁3223004775
GitHub地址 https://github.com/wyy517/WYY517/tree/main/math
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479
这个作业的目标 <实现小学四则运算题目生成器>

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 45
·Estimate ·估计这个任务需要多少时间 30 45
Development 开发 515 600
·Analysis ·需求分析 (包括学习新技术) 60 75
·Design Spec ·生成设计文档 45 60
·Design Review ·设计复审 30 25
·Coding Standard ·代码规范 (为目前的开发制定合适的规范) 20 15
·Design ·具体设计 60 80
·Coding ·具体编码 240 300
·Code Review ·代码复审 60 45
·Test ·测试(自我测试,修改代码,提交修改) 120 150
Reporting 报告 150 165
·Test Repor ·测试报告 90 120
·Size Measurement ·计算工作量 20 15
·Postmortem & Process Improvement Plan ·事后总结, 并提出过程改进计划 40 30
·合计 695 810

二、效能分析

性能改进过程

在开发过程中,我们主要在以下方面进行了性能优化:

1.表达式生成算法优化

  • 初始版本使用深度递归,容易栈溢出
  • 改进为迭代生成,限制递归深度
  • 添加重复表达式检测,避免无限循环

2.分数计算优化

  • 最初使用Python的eval函数,存在安全风险
  • 改为自定义表达式解析器,提高安全性
  • 实现分数约分缓存,避免重复计算

性能分析结果

通过cProfile进行分析,发现最耗时的函数:
image

image

性能优化思路

# 优化前:深度递归
def generate_expression(depth):if depth == 0: return numberreturn f"{generate_expression(depth-1)} op {generate_expression(depth-1)}"# 优化后:迭代生成
def generate_expression_iterative():numbers = generate_numbers()while len(numbers) > 1:# 随机组合数字和运算符# 检查约束条件# 构建表达式

三、设计实现过程

类设计图

├──小学四则运算题目生成器
├── main.py (主程序入口)
│   ├── 命令行参数解析
│   ├── 模式选择(生成/批改)
│   └── 模块协调
│
├── fraction.py (分数核心类)
│   ├── Fraction
│   │   ├── __init__(numerator, denominator) - 初始化并自动约分
│   │   ├── simplify() - 分数约分
│   │   ├── to_mixed_number() - 转换为带分数
│   │   ├── to_improper_fraction() - 转换为假分数
│   │   ├── __add__, __sub__, __mul__, __truediv__ - 运算符重载
│   │   ├── __lt__, __eq__, __le__ - 比较运算符
│   │   ├── random_fraction(max_value) - 生成随机分数
│   │   └── from_string(s) - 从字符串解析
│
├── expression.py (表达式生成类)
│   ├── Expression
│   │   ├── __init__(max_ops, number_range)
│   │   ├── generate() - 生成表达式
│   │   ├── _generate_expression_tree() - 递归生成表达式树
│   │   ├── _choose_operator() - 智能选择运算符
│   │   ├── _apply_operator() - 应用运算符计算
│   │   ├── _calculate_expression() - 计算表达式值
│   │   ├── _check_constraints() - 检查约束条件
│   │   └── get_value() - 获取表达式值
│
├── generator.py (题目生成器)
│   ├── ProblemGenerator
│   │   ├── __init__()
│   │   ├── generate_problems(count, number_range) - 生成题目
│   │   ├── _is_valid_answer() - 验证答案有效性
│   │   ├── _normalize_expression() - 表达式规范化去重
│   │   └── save_to_files() - 保存题目和答案
│
└── checker.py (答案批改器)├── AnswerChecker│   ├── __init__()│   ├── check_answers(exercise_file, answer_file) - 批改答案│   ├── _calculate_problem() - 计算题目答案│   ├── _evaluate_expression() - 表达式求值│   ├── _compare_answers() - 答案比较│   ├── _normalize_answer() - 答案规范化│   └── save_grade() - 保存批改结果

关键函数流程图

1.主程序执行流程图

image

2.题目生成流程图

image

3.表达式流程图

image

4.答案批改流程图

image

5.分数运算流程图

image

四、代码说明

关键代码1:Fraction类(分数运算核心)

class Fraction:def __init__(self, numerator, denominator=1):if denominator == 0:raise ValueError("分母不能为零")self.numerator = numeratorself.denominator = denominatorself.simplify()  # 自动约分def simplify(self):"""约分方法,确保分数最简形式"""if self.numerator == 0:self.denominator = 1returngcd_val = math.gcd(abs(self.numerator), abs(self.denominator))self.numerator //= gcd_valself.denominator //= gcd_val# 确保分母为正if self.denominator < 0:self.numerator = -self.numeratorself.denominator = -self.denominator

关键代码2:表达式生成算法

def _generate_expression_tree(self, depth, operators, number_range):"""递归生成表达式树,确保题目多样性"""if depth == 0:num = Fraction.random_fraction(number_range)return str(num), num# 随机分配左右子树深度left_depth = random.randint(0, depth - 1)right_depth = depth - 1 - left_depthleft_expr, left_val = self._generate_expression_tree(left_depth, operators, number_range)right_expr, right_val = self._generate_expression_tree(right_depth, operators, number_range)# 智能选择运算符,满足约束条件op = self._choose_operator(left_val, right_val, operators)# 构建表达式并计算值current_value = self._apply_operator(left_val, right_val, op)return f"({left_expr} {op} {right_expr})", current_value

关键代码3:约束检查

def _check_constraints(self):"""检查题目约束条件"""if self.value is None:return False# 1. 无负数结果if self.value < Fraction(0):return False# 2. 除法结果为真分数if hasattr(self.value, 'denominator') and self.value.denominator != 1:if abs(self.value.numerator) >= abs(self.value.denominator):return False# 3. 数值范围检查return self._check_numbers_in_range()

五、测试运行

测试用例设计

基础功能测试:

python main.py -n 5 -r 10 # 生成5道10以内题目
python main.py -n 10000 -r 20 # 压力测试1万题目
python main.py -n 1 -r 1 # 边界值测试

分数运算测试:

1/2 + 1/3 = 5/6 # 基础分数加法
3/4 - 1/4 = 1/2 # 分数减法
1/2 × 2/3 = 1/3 # 分数乘法
1/2 ÷ 1/4 = 2 # 分数除法

复杂表达式测试:

(1/2 + 1/3) × 3/5 = 1/2 # 带括号表达式
2 × 3 + 4 ÷ 2 = 8 # 混合运算
1'1/2 + 2'1/3 = 3'5/6 # 带分数运算

批改功能测试

python main.py -e Exercises.txt -a Answers.txt # 正常批改
python main.py -e Exercises.txt -a WrongAnswers.txt # 错误答案检测

测试结果

Exercises.txt

1. 2 × 2/9 = 
2. (7 + 1/2 × 1/3) = 
3. 5/7 × 2 = 
4. 5 × 5/6 = 
5. 9/10 × 4/9 = 
6. (1/2 × 1/2 ÷ 4 ÷ 8) = 
7. 3/4 + 3 = 
8. 2 - 8/9 + 2/9 = 
9. 6 - 1/2 × 7 = 
10. 3 ÷ 5 ÷ 1 = 

Answers.txt

1. 4/9
2. 2'1/2
3. 1'3/7
4. 4'1/6
5. 2/5
6. 1/2
7. 3'3/4
8. 1'1/3
9. 2'1/2
10. 3/5

Grade.txt

Correct: 8 (1, 3, 4, 5, 7, 8, 9, 10)
Wrong: 2 (2, 6)

六、项目小结

项目成果

本项目成功实现了小学四则运算题目生成器的所有核心功能:

✅ 支持自然数、真分数、带分数
✅ 控制题目数量和数值范围
✅ 避免负数和假分数结果
✅ 题目去重功能
✅ 文件输入输出
✅ 答案批改统计

经验教训

1.成功经验:

· 模块化设计:将分数、表达式、生成器分离,便于测试和维护
· 约束驱动开发:先定义清楚所有约束条件,再实现功能
· 渐进式开发:从简单功能开始,逐步增加复杂度

2.遇到的问题:

· 表达式计算复杂性:递归生成容易栈溢出,改为迭代方法
· 分数运算精度:需要处理约分和规范化表示
· 去重算法设计:表达式规范化比较具有挑战性

http://www.rkmt.cn/news/25373.html

相关文章:

  • 阅读笔记一:程序员的自我定位与成长基石
  • SQL 子查询与多表 JOIN 用法大全(速查版) - 实践
  • 2025年CNC高压清洗机厂家推荐排行榜:CNC全自动/数控高压清洗机、双工位/卧式清洗机、去毛刺/螺纹孔清洗机、工业/欧洲清洗机精选
  • 2025 年国内锅炉厂家最新推荐排行榜:聚焦智能控制与稳定可靠的品牌深度解析电/蒸汽/燃气/燃油/电蒸汽锅炉公司推荐
  • 2025 年食品级润滑油脂厂家最新推荐榜单:聚焦纳米材料技术突破,甄选核心竞争力突出的企业
  • 七大排序算法的基本原理 - 教程
  • LVDS硬件知识 - 指南
  • 2025 年仿石漆厂家最新推荐榜,技术实力与市场口碑深度解析,精选优质企业助力选购水包砂/冠晶石/外墙/多彩/批刮仿石漆厂家推荐
  • wsl连接 USB 设备
  • 完整教程:轻量服务器创建mysql,并配置远程连接
  • 如何系统化掌握 iOS 26 App 耗电管理,多工具协作
  • 2025 年冷库板厂家最新推荐榜:前五优质生产商盘点,含聚氨酯 / 保温 / 阻燃板企业选购指南 聚氨酯夹心板/聚氨酯保温板厂家推荐
  • 2025 年 MacBook / 苹果电脑清理应用程序最新推荐榜单:精选适配 macOS 系统的高性能系统优化工具
  • 2025 生物质颗粒机厂家推荐榜:聚焦高效环保,山东博力达机械成优选​
  • .NET驾驭Word之力:基于规则自动生成及排版Word文档
  • 2025年液压阀块厂家权威推荐榜:液压阀块加工、阀块零件机加工、液压阀加工、各种液压阀块专业制造商深度解析
  • rust如何查看和修改当前编译器版本
  • 2025 年最新推荐!国内污水处理设备优质厂家排行榜,助力企业精准选靠谱设备
  • 基于OpenGL实现三维树木生长动画的解决方案
  • 如何实现文件批量重命名后再进行批量打包下载
  • 曾国藩遗嘱 今将永别,特立四条以教汝兄弟。
  • 【IEEE出版】第五届测量控制与仪器仪表国际学术会议(MCAI 2025)
  • zedboard + AD-FMCOMMS3-EBZ AD9361 (六)gnuradio
  • CF2109D D/D/D
  • 2025 年球墨铸铁管厂家最新推荐榜:涵盖 K9/C 级供水等多规格,优质厂家选购指南 k9级球墨铸铁管/c25级球墨铸铁管/c30球墨铸铁管/c级球墨铸铁管厂家推荐
  • Telnet发送邮件
  • 2025年农机带厂家权威推荐榜:旋耕机带、收割机带、拖拉机带,耐磨耐用传动带源头厂家精选
  • 【ACM独立出版|EI稳定】第二届云计算与大数据国际学术会议(ICCBD 2025)
  • 完整教程:【LeetCode 每日一题】2221. 数组的三角和
  • 软件设计中的需求分析——白日梦