作业三——结对任务
这个作业属于哪个课程 | 软件工程-计科21级12班-计算机学院-广东工业大学 |
---|---|
这个作业要求在哪里 | 个人项目-计科21级12班 |
这个作业的目标 | 主要目的是为了让我们学习协同开发 |
1、仓库地址
-
开发者:李敏君、卫宇琪
-
截图如下:
README截图
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、项目框架
- 导入必要的模块:time、argparse和random。
- 定义一个性能分析装饰器performance_analysis,用于计算函数的执行时间。
- 定义一个函数parse_arguments,用于解析命令行参数。
- 定义一个函数generate_expression,用于生成随机的四则运算表达式。
- 定义一个函数calculate_answer,用于计算表达式的答案。
- 定义一个函数generate_exercises_and_answers,用于生成指定数量的题目和答案。
- 定义一个函数save_exercises_and_answers,用于将题目和答案保存到文件。
- 定义一个函数evaluate_exercises_answers,用于评判题目和答案。
- 在__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、使用方法
- 在命令行中运行该脚本,并提供正确的命令行参数。
- 如果提供了-n和-r参数,则会生成指定数量的题目和答案,并将其保存到文件Exercises.txt和Answers.txt中。
- 如果提供了-e和-a参数,则会评判题目和答案,并将得分保存到文件Grade.txt中。
- 如果没有提供正确的命令行参数,则会打印提示信息。
6、测试
- 测试生成十个题目,范围在一百以内
题目
答案
输入python MyCalculate.py -e "Exercises.txt" -a "Answers.txt"来测试效果,我们每隔一题输入一个错误答案,如下:
最后结果如下:
与预期相符合
7、总结
本次结对项目完成的不算十分顺利,我们期间遇到了许多的难关,包括性能时间测试等等,但是关关难过关关过,我们最终还是很好的解决了这些问题,使项目稳步向前推进。在项目实现的过程中,我充分认识到了和队友沟通的重要性,我主要负责的是项目功能的设计和代码的编写,队友则负责后期测试和性能分析。本次任务完成的闪光点有二,一是代码的可读性较高,便于测试人员查看和测试我们的代码;二是性能分析结果优异,充分完成了给定的目标任务。