软件工程第三次作业-结对作业

发布时间 2023-09-28 12:41:12作者: yin1237

软件工程第三次作业

作业概述

这次作业是属于哪个课程 软件工程
这个作业要求在哪 结对编程
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序
Github 链接

需求分析


  1. 使用 -n 参数控制生成题目的个数
  2. 使用 -r 参数控制题目中数值的范围
  3. 生成的题目中不允许负数
  4. 生成的题目中,如果有除法运算,结果应是真分数
  5. 每道题目中的运算符个数不超过3个
  6. 生成的题目不可重复
  7. 生成的题目和答案保存到文件中
  8. 支持判定答案的正确性和统计对错题目

文件模块设计

  1. operation_yunsuan(a, b, operation_symbol): 这个函数根据给定的运算符进行数学运算,并返回结果。如果运算符是不支持的操作,它会返回字符串 "NOT"。

  2. factor_yunsuan(): 这个函数用于生成因子,可以是自然数或真分数。它使用随机数来决定生成哪种类型的因子,并返回生成的因子。

  3. product(): 这个函数调用 factor_yunsuan() 生成两个因子,并选择一个随机的运算符,然后使用 operation_yunsuan() 计算结果。如果结果不是 "NOT",则将这个运算式和因子存储,并返回结果。

  4. start_yunsuan(): 这是主要的生成题目的函数,它随机选择不同类型的题目生成方式(有无括号),并调用 product() 或自定义多位数运算的方式生成题目。生成的题目存储在 thereresult_listtype_list 中。

  5. repeat_yunsuan(m): 这个函数检查生成的题目是否有重复,如果有重复则删除重复的题目。它通过比较题目的类型、结果和具体信息来判断题目是否重复,并更新 thereresult_listtype_listcheck

  6. reset_result(): 将正确答案写入“Answers.txt”文件。如果适用,将分数结果转换为混合分数,提示用户回答每个表达式并进行比较,跟踪错误答案的数量并记录错误表达的详细信息,将正确和错误的答案写入“Answers.txt”。

  7. reset_result_and_check()该功能结合了重置结果跟踪和检查用户答案的功能。它计算正确答案,将其与用户输入进行比较,并在“check.txt”中跟踪和记录不正确的答案。

  8. start(n): 这是主要的启动函数,它生成指定数量的题目,并调用 repeat_yunsuan() 来检查和删除重复的题目。最后,它将生成的题目和答案写入文件中。

  9. generate_expression() ,该函数根据输入的 there_kid 生成相应的表达式字符串,并在主循环中使用这个函数生成表达式。这个函数会处理不同长度的 there_kid,并将分数转化为字符串形式。

程序整体流程分析

image

性能分析

1. 性能参数分析

采用pycharm中自带的profile分析性能插件进行分析
image

数据性能的参数:
image

2. 覆盖率情况

覆盖率达到99%
image

单元测试

测试函数

  1. 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)
  1. def test_factor_yunsuan(self):
    该测试用例检查Factor_yunsuan()函数,该函数生成随机分数或整数。它确保结果是 Fraction 类的实例。
    def test_factor_yunsuan(self):
        result = factor_yunsuan()
        self.assertIsInstance(result, Fraction)
  1. def test_product(self):
    该测试用例检查product()函数,该函数生成随机算术表达式并计算其结果。它验证结果是否是 Fraction 类的实例。
    def test_product(self):
        result, two_index = product()
        self.assertIsInstance(result, Fraction)
  1. def test_start_yunsuan(self):
    该测试用例检查start_yunsuan()函数,该函数生成不同复杂度级别的随机算术表达式。它确保结果是 Fraction 类的实例
    def test_start_yunsuan(self):
        global result_list
        result = start_yunsuan()
        self.assertIsInstance(result, Fraction)
  1. 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')

  1. 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就代表检查过了,这样在查重过程中避免了重复查询,大大地提高了程序运行速度。
梁伟:尹俊蒙思维构思很好,为项目提供了很多思路。
尹俊蒙:梁伟代码能力较好,通过沟通解决了很多问题。