结对项目:实现自动生成四则运算

发布时间 2023-09-27 23:49:15作者: 金展骏
软件工程 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语言进行编程,由于语言本身存在的局限性以及个人编程能力的限制因此没有更好地实现可视化界面。同时在代码结构上的不足导致题目生成时间过长,这是后续需要进一步优化的地方。