软件工程第三次作业
作业概述
这次作业是属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪 | 结对编程 |
这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |
Github | 链接 |
需求分析
- 使用 -n 参数控制生成题目的个数
- 使用 -r 参数控制题目中数值的范围
- 生成的题目中不允许负数
- 生成的题目中,如果有除法运算,结果应是真分数
- 每道题目中的运算符个数不超过3个
- 生成的题目不可重复
- 生成的题目和答案保存到文件中
- 支持判定答案的正确性和统计对错题目
文件模块设计
-
operation_yunsuan(a, b, operation_symbol)
: 这个函数根据给定的运算符进行数学运算,并返回结果。如果运算符是不支持的操作,它会返回字符串 "NOT"。 -
factor_yunsuan()
: 这个函数用于生成因子,可以是自然数或真分数。它使用随机数来决定生成哪种类型的因子,并返回生成的因子。 -
product()
: 这个函数调用factor_yunsuan()
生成两个因子,并选择一个随机的运算符,然后使用operation_yunsuan()
计算结果。如果结果不是 "NOT",则将这个运算式和因子存储,并返回结果。 -
start_yunsuan()
: 这是主要的生成题目的函数,它随机选择不同类型的题目生成方式(有无括号),并调用product()
或自定义多位数运算的方式生成题目。生成的题目存储在there
、result_list
和type_list
中。 -
repeat_yunsuan(m)
: 这个函数检查生成的题目是否有重复,如果有重复则删除重复的题目。它通过比较题目的类型、结果和具体信息来判断题目是否重复,并更新there
、result_list
、type_list
和check
。 -
reset_result()
: 将正确答案写入“Answers.txt”文件。如果适用,将分数结果转换为混合分数,提示用户回答每个表达式并进行比较,跟踪错误答案的数量并记录错误表达的详细信息,将正确和错误的答案写入“Answers.txt”。 -
reset_result_and_check()
该功能结合了重置结果跟踪和检查用户答案的功能。它计算正确答案,将其与用户输入进行比较,并在“check.txt”中跟踪和记录不正确的答案。 -
start(n)
: 这是主要的启动函数,它生成指定数量的题目,并调用repeat_yunsuan()
来检查和删除重复的题目。最后,它将生成的题目和答案写入文件中。 -
generate_expression()
,该函数根据输入的 there_kid 生成相应的表达式字符串,并在主循环中使用这个函数生成表达式。这个函数会处理不同长度的 there_kid,并将分数转化为字符串形式。
程序整体流程分析
性能分析
1. 性能参数分析
采用pycharm中自带的profile分析性能插件进行分析
数据性能的参数:
2. 覆盖率情况
覆盖率达到99%
单元测试
测试函数
- def test_operation_yunsuan(self):
该测试用例检查operation_yunsuan()函数执行基本算术运算的函数,它验证加法、减法、乘法和除法运算是否返回特定输入值的正确结果。
def test_operation_yunsuan(self):
result = operation_yunsuan(4, 2, '+')
self.assertEqual(result, 6)
result = operation_yunsuan(4, 2, '-')
self.assertEqual(result, 2)
result = operation_yunsuan(4, 2, '*')
self.assertEqual(result, 8)
result = operation_yunsuan(4, 2, '/')
self.assertEqual(result, 2)
- def test_factor_yunsuan(self):
该测试用例检查Factor_yunsuan()函数,该函数生成随机分数或整数。它确保结果是 Fraction 类的实例。
def test_factor_yunsuan(self):
result = factor_yunsuan()
self.assertIsInstance(result, Fraction)
- def test_product(self):
该测试用例检查product()函数,该函数生成随机算术表达式并计算其结果。它验证结果是否是 Fraction 类的实例。
def test_product(self):
result, two_index = product()
self.assertIsInstance(result, Fraction)
- def test_start_yunsuan(self):
该测试用例检查start_yunsuan()函数,该函数生成不同复杂度级别的随机算术表达式。它确保结果是 Fraction 类的实例
def test_start_yunsuan(self):
global result_list
result = start_yunsuan()
self.assertIsInstance(result, Fraction)
- def test_generate_expression(self):
该测试用例检查generate_expression()函数,该函数将数字和运算符列表转换算术表达式。它测试函数是否根据输入列表正确生成表达式。
def test_generate_expression(self):
expression = generate_expression([2, 3, 5, 'nohav', 'none', '+', '-'])
self.assertEqual(expression, '2+3-5')
- def test_repeat_yunsuan(self):
该测试用例检查repeat_yunsuan()函数,该函数识别并从列表中删除重复的算术表达式。它设置一个包含重复表达式的场景,调用该函数,并验证它是否正确识别和删除重复项。
def test_repeat_yunsuan(self):
global result_list
there = [[1, 2, 3, 'nohav', 'none', '+', '-'],
[2, 3, 4, 'nohav', 'none', '+', '-'],
[1, 2, 3, 'nohav', 'none', '+', '-']]
result_list = [Fraction(3, 2), Fraction(5, 2), Fraction(3, 2)]
type_list = [3, 3, 3]
check = [0, 0, 0]
n = 3
m = repeat_yunsuan(n)
self.assertEqual(m, 3)
PSP表格
PSP2.1表格 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 50 |
Estimate | 估计这个任务需要多少时间 | 50 | 50 |
Development | 开发 | 1330 | 1350 |
Analysis | 需求分析 (包括学习新技术) | 120 | 100 |
Design Spec | 生成设计文档 | 60 | 40 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 960 | 1020 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 130 | 120 |
Test Repor | 测试报告 | 90 | 80 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1510 | 1520 |
总结
通过这次结对项目收获了很多东西,在提高代码能力的同时也学会了和别人配合来提高工作效率。在写论文查重算法的时候,程序耗费时间过长,在经过参考往届师兄的代码后,决定加了一个列表,用0和1标记题目,0代表该题目没有经过检查,1就代表检查过了,这样在查重过程中避免了重复查询,大大地提高了程序运行速度。
梁伟:尹俊蒙思维构思很好,为项目提供了很多思路。
尹俊蒙:梁伟代码能力较好,通过沟通解决了很多问题。