结对项目:实现自动生成四则运算
软件工程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-34 |
---|---|
作业地址 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13016 |
作业目标 | 结对项目 |
GitHub链接
https://github.com/fangzhixiang/fangzhixiang
成员信息
方志祥 | 3121005209 |
---|---|
金展骏 | 3121005217 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 35 | 45 |
· Estimate | 估计这个任务需要多少时间 | 300 | 400 |
Development | 开发 | 300 | 300 |
· Analysis | 需求分析 (包括学习新技术) | 80 | 100 |
· Design Spec | 生成设计文档 | 15 | 10 |
· Design Review | 设计复审 | 20 | 10 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 3 |
· Design | 具体设计 | 10 | 8 |
· Coding | 具体编码 | 90 | 120 |
· Code Review | 代码复审 | 5 | 10 |
· Test | 测试(自我测试,修改代码,提交修改) | 100 | 150 |
Reporting | 报告 | 20 | 36 |
· Test Report | 测试报告 | 20 | 35 |
· Size Measurement | 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 480 | 570 |
流程图设计
模块说明
1.导入必要的模块和库:
argparse 用于解析命令行参数。
fractions 用于处理分数。
re 用于进行正则表达式匹配。
并从 fractions 模块中导入 Fraction 类
import argparse
import fractions
import re
from fractions import Fraction
2.解析命令行参数:
使用 argparse 创建了一个命令行参数解析器 parser,用于解析脚本运行时传递的参数。
-e 参数用于指定包含算术问题的文件的路径。
-a 参数用于指定包含答案的文件的路径
# 解析命令行参数
parser = argparse.ArgumentParser(description='Check arithmetic problems against answers.')
parser.add_argument('-e', type=str, required=True, help='Exercise file path.')
parser.add_argument('-a', type=str, required=True, help='Answer file path.')
args = parser.parse_args()
3.读取题目和答案文件:
使用 open 函数打开题目文件和答案文件,然后分别读取其内容并将每行拆分为列表 exercises 和 answers
# 读取题目和答案文件
with open(args.e, 'r') as exercise_file:
exercises = exercise_file.read().splitlines()
with open(args.a, 'r') as answer_file:
answers = answer_file.read().splitlines()
4.检查题目数量与答案数量是否一致:
如果 exercises 和 answers 的长度不相等,说明题目和答案数量不匹配,会打印错误消息并退出脚本。
# 检查题目数量与答案数量是否一致
if len(exercises) != len(answers):
print("Error: The number of exercises and answers does not match.")
exit(1)
5.辅助函数 mixed_number_to_float:
用于将混合数字符串转换为浮点数表示或分数表示。
先使用正则表达式匹配混合数的格式,然后将其转换为浮点数。
如果没有匹配成功,则假定字符串表示为分数,然后使用 Fraction 类进行转换
# 辅助函数:将混合数字符串转换为浮点数
def mixed_number_to_float(mixed_number_str):
# 使用正则表达式来匹配混合数的格式
match = re.match(r'(\d+)\'(\d+)/(\d+)', mixed_number_str)
if match:
whole_part = int(match.group(1))
numerator = int(match.group(2))
denominator = int(match.group(3))
return "{:.6f}".format(whole_part + numerator / denominator) # 将答案表示为浮点数
else:
match = re.match(r'(\d+)/(\d+)',mixed_number_str)
if match:
whole_part = int(match.group(1))
numerator = int(match.group(2))
return "{:.6f}".format(whole_part / numerator)
else:
return Fraction(mixed_number_str)
6.检查答案是否正确,并统计结果:
使用循环遍历题目和答案。
对于每个题目,首先替换特殊字符 '×' 为标准的乘法运算符 '*',以及 '÷' 为标准的除法运算符 '/'。
使用 eval 函数计算表达式的结果。
如果结果是浮点数,将其格式化为小数点后6位。
使用 mixed_number_to_float 函数将答案字符串转换为浮点数表示。
如果计算结果与答案匹配,则将问题计数器 correct_count 增加,并记录正确问题的索引。
如果发生除零错误,将问题计数器 wrong_count 增加,并记录错误问题的索引。
# 检查答案是否正确,并统计结果
correct_count = 0
correct_indices = []
wrong_count = 0
wrong_indices = []
for i in range(len(exercises)):
expression = exercises[i]
expected_answer_str = answers[i]
try:
# 替换特殊字符 '×' 为标准的 '*'
expression = expression.replace(' × ', ' * ').replace(' ÷ ', ' / ')
result = eval(expression)
if result - (result // 1) != 0:
result = "{:.6f}".format(result)
expected_answer = mixed_number_to_float(expected_answer_str)
# 如果结果与答案相匹配,则认为答案正确
if result == expected_answer:
correct_count += 1
correct_indices.append(i + 1)
else:
wrong_count += 1
wrong_indices.append(i + 1)
except ZeroDivisionError:
wrong_count += 1
wrong_indices.append(i + 1)
7.将结果写入Grade.txt文件:
打开一个名为 'Grade.txt' 的文件以写入统计结果。将正确和错误问题的数量以及其索引写入文件。
# 将结果写入Grade.txt文件
with open('Grade.txt', 'w') as grade_file:
grade_file.write(f"Correct: {correct_count} ({', '.join(map(str, correct_indices))})\n")
grade_file.write(f"Wrong: {wrong_count} ({', '.join(map(str, wrong_indices))})\n")
print(f"Correct: {correct_count} problems")
print(f"Wrong: {wrong_count} problems")
命令行参数
1.生成四则运算题目
运行结果如下图:生成了一百道题目并保存在answer.txt
2.生成测试文件
运行结果如下图:正确结果题目数100,错误数0,计算性能良好
实例展示
Exercises.txt
Answers.txt
Grades.txt
性能分析
项目小结
1.结对项目彼此密切合作,这种合作感觉非常独特。我们能够实时讨论问题、分享想法,并一起解决编码难题。这种合作让我们感到团队中的合作伙伴的必不可少。我们的互相信任和默契也在项目中不断增强。
2.结对项目要求频繁的沟通和协商,因为两个人必须就如何实现特定功能或解决问题达成共识。这让我们彼此在沟通和解决问题方面的技能有了显著提升,学会了更好地倾听和理解他人的观点,并能够更快地找到解决方案,因为有一个搭档可以帮助我们看到问题的不同角度。
3.针对这次的结对项目,我们使用了python语言进行编程,由于语言本身存在的局限性以及个人编程能力的限制因此没有更好地实现可视化界面。同时在代码结构上的不足导致题目生成时间过长,这是后续需要进一步优化的地方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理