第一次小组作业(四则运算)

news/2025/10/18 1:55:13/文章来源:https://www.cnblogs.com/scissor0611/p/19149071

四则运算

成员 谢希哲(3223004776)、贺海伦(3223004773)
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序,并练习如何对程序进行性能测试和改进
我们的github账号 https://github.com/scissssor/3223004776
https://github.com/Playerhh/python-calculator



1 PSP表格(包括预估与实际耗时)

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



2 效能分析

2.1 初始性能分析图:


最耗时函数:generate_expression(优化前)
    def generate_expression(self, max_operators: int) -> ExpressionNode:"""递归生成表达式"""if max_operators == 0:return ExpressionNode(value=self.generate_number())# 增加更多运算符选择,减少除法的概率operators = ['+', '×', '-', '-', '+', '×']  # 重复加法和乘法,减少减法if max_operators > 1:  # 只有在有多个运算符时才考虑除法operators.extend(['÷'])operator = random.choice(operators)# 更灵活地分配运算符数量if max_operators == 1:left_operators = 0right_operators = 0else:left_operators = random.randint(0, max_operators - 1)right_operators = max_operators - 1 - left_operatorsleft_expr = self.generate_expression(left_operators)right_expr = self.generate_expression(right_operators)# 对于减法和除法,确保条件满足if operator == '-':left_val = left_expr.evaluate()right_val = right_expr.evaluate()if left_val < right_val:left_expr, right_expr = right_expr, left_exprelif operator == '÷':left_val = left_expr.evaluate()right_val = right_expr.evaluate()# 放宽除法条件:允许结果为1,但不允许大于1if left_val >= right_val:# 重新生成右表达式,使其大于左表达式for _ in range(10):  # 最多尝试10次right_expr = self.generate_expression(right_operators)right_val = right_expr.evaluate()if right_val > left_val and right_val != FractionNumber(0):breakelse:# 如果无法生成合适的右表达式,改用乘法operator = '×'return ExpressionNode(operator=operator, left=left_expr, right=right_expr)

性能瓶颈分析:
  1. 表达式生成效率低,重复率高:频繁调用函数generate_expression
  2. 字符串转换效率低:频繁转换分数格式
  3. 题目约束条件高,使满足的表达式组合有限

改进思路:
  1. 增加加法和乘法的概率(没有负数和真分数的限制),减少减法除法使用(避免产生负数和出现分数)
  2. 优化函数generate_expression,预先生成运算符组合,提取验证逻辑,减少重复代码

generate_expression(优化后)
    def generate_expression(self, max_operators: int) -> ExpressionNode:"""递归生成表达式"""if max_operators == 0:return ExpressionNode(value=self.generate_number())# 修正运算符池的定义operators_pool = {1: ['+', '×', '-', '+', '×'],  # 1个运算符2: ['+', '×', '-', '+', '×'],  # 2个运算符3: ['+', '×', '-', '÷', '+', '×']  # 3个运算符}# 确保 max_operators 在有效范围内if max_operators not in operators_pool:max_operators = min(max_operators, max(operators_pool.keys()))operator = random.choice(operators_pool[max_operators])# 更灵活地分配运算符数量if max_operators == 1left_operators = 0right_operators = 0else:left_operators = random.randint(0, max_operators - 1)right_operators = max_operators - 1 - left_operatorsleft_expr = self.generate_expression(left_operators)right_expr = self.generate_expression(right_operators)# 对于减法和除法,确保条件满足if operator in ['-', '÷']:return self._validate_operation(operator, left_expr, right_expr, right_operators)return ExpressionNode(operator=operator, left=left_expr, right=right_expr)

2.2 优化后性能分析图:



3 设计实现过程

代码采用面向对象的设计思想,主要包含以下类:

arithmetic.py
├── FractionNumber (分数处理类)
├── ExpressionNode (表达式树节点类)
├── ProblemGenerator (题目生成器类)
├── Grader (题目批改器类)
└── main() (主程序入口)

3.1 总体流程图


3.2 关键函数流程图

1.表达式计算流程图


2.批改系统流程图



4 关键代码说明

4.1 表达式实现(ExpressionNode 类)

设计思路: 使用二叉树结构表示算术表达式,在计算过程中同时验证算术规则(减法不产生负数,除法结果为真分数)

class ExpressionNode:def evaluate(self) -> FractionNumber:"""递归计算表达式值,同时验证运算规则"""if self.is_leaf():return self.valueleft_val = self.left.evaluate()right_val = self.right.evaluate()if self.operator == '-':# 确保不产生负数if left_val < right_val:raise ValueError("Subtraction result cannot be negative")return left_val - right_valelif self.operator == '÷':# 确保结果是真分数if left_val >= right_val:raise ValueError("Division result must be a proper fraction")return left_val / right_val

4.2 题目生成与去重机制

设计思路: 通过规范化表达式形式(对交换律运算排序)实现题目去重,确保生成的题目在数学本质上不重复

def generate_unique_problem(self, max_attempts=1000) -> Tuple[str, str]:"""生成不重复题目的核心算法"""for _ in range(max_attempts):try:operators_count = random.randint(1, 3)expression = self.generate_expression(operators_count)# 检查计算过程是否有效result = expression.evaluate()# 规范化表达式形式用于去重normalized_form = expression.normalize_form()if normalized_form in self.generated_forms:continue  # 跳过重复题目self.generated_forms.add(normalized_form)return f"{expression.to_string()} =", str(result)except (ValueError, ZeroDivisionError):continue  # 规则验证失败,重新生成



5 测试运行

5.1 生成的题目与计算结果

文件exercises.txt与Answers.txt


5.2 批改结果

文件grade.txt


生成20个题目与答案后批改,检查可得所有题目满足作业需求:没有产生负数、除法结果为真分数、运算符个数不超过3个、生成的题目没有重复。

检查答案与批改结果可得,批改结果正确



6 项目小结

一开始读题目觉得有点点绕,后面我两就说先把流程图理出来吧。然后也查了csdn上面一些案例,代码不停报错就不停问ai一点点修改,反正最后也许应该是弄出来了。感觉两个人一起做确实比上一次一个人做起来轻松很多。不只是任务量,有商有量的话心态也会好一点。

在此感谢hhl同学对我的大力支持,我有点容易焦虑又没耐心,但是hhl会告诉我时间还很够啊已经理清楚啦balabala的,有效缓解!

一开始要求的实现有点复杂,尤其是查重复要全面且快捷,后面测试与效率分析的再修改有点难度和麻烦,感谢xxz的耐心测试,xxz做事非常耐心且全面,认真研究课题使我们能够更好的敲代码和博客,提供了非常大的帮助,完成这份项目她功不可没!!!

两个人的合作使我学习到了很多,共同作业也完成的更轻松,遇到难题两个人共同解决的解决的过程也使我们减少了很多负面情绪,相互开导非常有效!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/939261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 1059 (Div. 3)

A. Beautiful Average点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >&g…

升鲜宝生鲜配送供应链管理系统-----仓库作业任务模块开发文档

📦 仓库作业任务模块开发文档 一、模块概述 本模块涵盖三类核心作业任务:🟩 上架任务(Putaway) 🟦 下架任务(Pickdown) 🟥 移库任务(Move)每类任务均包括:主表(Task)—— 用于存储任务基本信息; 明…

24 Hongkong B and 2023 ICPC Shenyang

24 Hongkong B and 2023 ICPC Shenyang 24 Hongkong B 我们能造成的伤害范围比较小,考虑从这一点入手。如果每次都造成 1 点伤害,则 \(max\{a_i + b_i\}\) 次后就能击败所有敌人,最后造成 \(max\{a_i + b_i\}\) 点伤…

应急响应-vulntarget-k-03

应急响应-vulntarget-k-03 这里通过history查看历史命令看到在这里进入了/opt下面创建了一个隐藏文件 .a 我们跟跟踪过去看看在这里有个程序start.sh 看这个隐藏目录下面有一个sendPacket.py ./sendPacket.py 192.168.…

共识的预锚点:AI元人文中的价值原语引导与自动化演进

共识的预锚点:AI元人文中的价值原语引导与自动化演进 我: 在价值原语博弈开始前,我们是否可以先开发一个引导环节,借助大模型为具体冲突预生成可能涉及的价值原语清单? 你: 这个想法非常关键!它解决了价值博弈的…

winserver备份到miniio

winserver 安装openssh备份代码 package org.hf.ywyt_minio.openssh;import com.jcraft.jsch.*; import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.…

软考中级 学习总结*(1)

一. 1.计算机由运算器,控制器,存储器,输入设备,输出设备组成 中央处理单元CPU CPU获取程序指令,并进行译码,也就是执行程序。 一个程序由多个指令组成 CPU功能:控制器:程序控制,操作控制,时间控制 运算器(…

【黑马python】基础 6.Python 容器:列表 元组 字符串 集合 字典

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 数据容器代码示例参考链接黑马-6.Python 容器 01-数据容器入门TBD

刷题日记—数字读取与判断

今天做了洛谷上有关统计数字个数的题,如下 这道题让我们统计在1到n的数中,给定数字x的出现次数,所以要考虑每一位上该数字出现的个数。对于这种读取每个数位上的数字,我们一般用% /结构。 即先让b=i,拷贝当前数值,…

Linux Mint -- LMDE6升级到LMDE7

Linux Mint -- LMDE6升级到LMDE72025年10月15日,LMDE7 Gigi版本正式发布了!!该操作系统我之前文章写过推荐的理由及该系统推荐的软件,有兴趣的点击此链接去看一下Linux Mint操作系统推荐。如下再介绍两种安装的方式…

OI 笑传 #19

Shinshiro今天是一些 CF。 CF2152D 除二加一什么的当然要放到二进制上。 如果没有小 R,那么操作的次数就是二进制位数减一加起来。 观察一下发现小 R 的加一是很弱小的,因为小 P 除二可以把整个二进制往下拉(右移)…

CF1133 合集

云落碎碎念题面翻译取自 luogu,本蒟蒻也会安置原题链接 不保证文章中不出现“显然”或者“注意到”,可能会出现“易证” 有写错的地方欢迎各位神犇指正前言 随机到一套 Div 3,愉悦一下身心 CF1133A 题解 题目传送门…

Note of Michael Artin Algebra Chapter 6 Symmetry (to complete)

6.1 SYMMETRY OF PLANE FIGURES Bilateral, rotational, translational, glide symmetry, and their combinations. 6.2 ISOMETRIES 6.2.1 Def. (Distance, Isometry) The distance between points of \(\mathbb{R}^n\…

10/18

学了外教课

实验一 现代C++基础编程

#任务1 ##代码 代码1// 现代C++标准库、算法库体验 // 本例用到以下内容: // 1. 字符串string, 动态数组容器类vector、迭代器 // 2. 算法库:反转元素次序、旋转元素 // 3. 函数模板、const引用作为形参 #include <…

CF1824D 题解

求 \(\sum\limits _ {i = l} ^ r \sum\limits _ {j = x} ^ y g(i,j)\)。 离线询问,扫描线 \(j\),线段树维护 \(g(i)\),那么,转换为求解 \(x\) 时刻到 \(y\) 时刻,线段树区间 \([l,r]\) 的区间和的历史和。 考虑扫…

CF1059 Codeforces Round 1059 (Div. 3) 游记

一次值得记录的失败。用以勉励。省流 一次值得记录的失败。用以勉励。10.17 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 非常困,回寝室睡了一会,再来就迟到了。于是一边安慰自己不算分一边想着还是写一下不…

newDay12

1.今天主要是合唱现场去演出,写写作业,背单词 2.明天时间多,多学学 3.睡得太晚了,导致醒来也已经很晚,时间管控不太好

PyTorch与卷积神经网络读书报告

PyTorch与卷积神经网络读书报告 近期,我观看了B站上适合新手的卷积神经网络(CNN)原理详解视频,并结合PyTorch相关知识进行学习,对CNN在PyTorch中的应用有了更深入的认识。 一、CNN核心原理 CNN通过卷积层用卷积核…