作业三——结对任务

这个作业属于哪个课程 软件工程-计科21级12班-计算机学院-广东工业大学
这个作业要求在哪里 个人项目-计科21级12班
这个作业的目标 主要目的是为了让我们学习协同开发

1、仓库地址

2、PSP表格记录

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 35
- Estimate - 估计这个任务需要多少时间 40 35
Development 开发 285 300
- Design Spec - 需求分析 (包括学习新技术) 50 45
- Design Review - 生成设计文档 30 35
- Coding Standard - 设计复审 40 35
- Design - 具体设计 45 60
- Coding - 具体编码 50 70
- Code Review - 代码复审 30 15
- Test - 测试(自我测试,修改代码,提交修改) 40 40
Reporting 报告 110 135
- Test Repor - 测试报告 50 70
- Size Measurement - 计算工作量 40 50
- Postmortem & Process Improvement Plan - 事后总结, 并提出过程改进计划 20 15
All 合计 425 470

3、项目框架

  1. 导入必要的模块:time、argparse和random。
  2. 定义一个性能分析装饰器performance_analysis,用于计算函数的执行时间。
  3. 定义一个函数parse_arguments,用于解析命令行参数。
  4. 定义一个函数generate_expression,用于生成随机的四则运算表达式。
  5. 定义一个函数calculate_answer,用于计算表达式的答案。
  6. 定义一个函数generate_exercises_and_answers,用于生成指定数量的题目和答案。
  7. 定义一个函数save_exercises_and_answers,用于将题目和答案保存到文件。
  8. 定义一个函数evaluate_exercises_answers,用于评判题目和答案。
  9. 在__main__中,解析命令行参数并根据参数执行相应的操作。
  • 设计图

  • 项目结构

4、关键代码分析

函数generate_expression(range_limit),它用于生成随机的四则运算表达式。函数接受一个参数range_limit,表示数值的范围。函数内部使用了一个列表operators来存储运算符+、-、和/,然后使用random.choice()函数随机选择一个运算符。如果选择的运算符是/,则生成一个真分数,分子和分母都是在1到range_limit之间的随机整数;如果选择的运算符不是/,则生成一个自然数,范围也是1到range_limit之间的随机整数。最后,函数返回生成的表达式作为字符串。
def generate_expression(range_limit):
operators = ['+', '-', '
', '/']
num_operators = random.randint(1, 3)
expression = ''
for _ in range(num_operators):
operator = random.choice(operators)
if operator == '/':
# 生成真分数
numerator = random.randint(1, range_limit)
denominator = random.randint(numerator, range_limit)
expression += f'{numerator}/{denominator} {operator} '
else:
# 生成自然数
operand = random.randint(1, range_limit)
expression += f'{operand} {operator} '
operand = random.randint(1, range_limit)
expression += str(operand)
return expression

evaluate_exercises_answers的函数,用于评判题目和答案。函数接受两个参数,exercises_file和answers_file,分别表示题目文件和答案文件的路径。在函数内部,它首先打开题目文件和答案文件,并使用zip函数将两个文件的内容一一对应地组合在一起。然后,它通过循环遍历每个题目和答案,使用input函数从用户获取学生的答案,并将题目、期望答案和学生答案组成一个元组,添加到student_answers列表中
@performance_analysis
def evaluate_exercises_answers(exercises_file, answers_file):
student_answers = []
with open(exercises_file, 'r') as f_exercises, open(answers_file, 'r') as f_answers:
for exercise, answer in zip(f_exercises, f_answers):
student_answer = int(input(f"{exercise.strip()} = "))
student_answers.append((exercise.strip(), int(answer.strip()), student_answer))

# 统计得分
correct_count = sum(1 for _, expected, student in student_answers if expected == student)
wrong_count = sum(1 for _, expected, student in student_answers if expected != student)

with open('Grade.txt', 'w') as f_grade:
    f_grade.write(f"Correct: {correct_count} ({', '.join(str(i+1) for i, (_, expected, student) in enumerate(student_answers) if expected == student)})\n")
    f_grade.write(f"Wrong: {wrong_count} ({', '.join(str(i+1) for i, (_, expected, student) in enumerate(student_answers) if expected != student)})\n")

5、使用方法

  1. 在命令行中运行该脚本,并提供正确的命令行参数。
  2. 如果提供了-n和-r参数,则会生成指定数量的题目和答案,并将其保存到文件Exercises.txt和Answers.txt中。
  3. 如果提供了-e和-a参数,则会评判题目和答案,并将得分保存到文件Grade.txt中。
  4. 如果没有提供正确的命令行参数,则会打印提示信息。

6、测试

  • 测试生成十个题目,范围在一百以内

    题目

    答案

    输入python MyCalculate.py -e "Exercises.txt" -a "Answers.txt"来测试效果,我们每隔一题输入一个错误答案,如下:


    最后结果如下:

    与预期相符合

7、总结

本次结对项目完成的不算十分顺利,我们期间遇到了许多的难关,包括性能时间测试等等,但是关关难过关关过,我们最终还是很好的解决了这些问题,使项目稳步向前推进。在项目实现的过程中,我充分认识到了和队友沟通的重要性,我主要负责的是项目功能的设计和代码的编写,队友则负责后期测试和性能分析。本次任务完成的闪光点有二,一是代码的可读性较高,便于测试人员查看和测试我们的代码;二是性能分析结果优异,充分完成了给定的目标任务。

posted @ 2023-09-28 11:03  杠杆不是棍  阅读(29)  评论(0编辑  收藏  举报