2020软件工程第二次作业:求最大字段和
博客信息 | 沈阳航空航天大学计算机学院2020软件工程作业 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10583 |
课程目标 | 熟悉一个“高质量”软件的开发过程 |
作业目标 | 单元测试练习 |
1.题目要求
问题:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
2.问题分析
针对此问题可以用递归的方法将问题分解,先将整个数组a看成一个整体,将其对半分成两半,此时数组a的最大字段和必存在于如图所示的三个部分中的一个。
对于sum的求取,可以由中间值向两边迭代求和,并记录中间出现的最大值left_max和right_max,sum=left_max+right_max。而对于left_temp和right_temp则对其进行更进一步划分,直至新得到的数组中只含有一个数据。低一级的递归所求的的最大字段和作为上一级的left_temp于right_temp返回。
3.部分流程图
如图为对于划分得到的每个数组求最大字段和的流程图
4.实现代码
具体的代码我已经上传到我的github个人仓库,详见 https://github.com/cxz158/Bald_Inspiration 。
因为最近刚学了python,索性这次就用python完成了这次作业(结果还因为python没有像C/C++那样的数组数据类型,还折腾了一会),代码分别存在三个文件里,main.py是入口文件,max_list_func.py里存的函数的主要实现代码,my_test.py是测试代码。
5.单元测试
针对此次的单元测试采取判断覆盖的标准,利用的时pytest测试框架,分别测试left_temp,sum,right_temp为最大值时的情况,样本规格取为6。
def test_max_list_sum1():
assert max_list_sum([-20,11,-4,13,-5,-2],6)==20
def test_max_list_sum2():
assert max_list_sum([-5,12,-5,-7,2,6],6)==12
def test_max_list_sum3():
assert max_list_sum([6,2,-7,-5,12,-5],6)==12
6.程序执行结果
程序执行结果
单元测试结果
7.工作记录
项目 | 记录结果 |
---|---|
日期 | 2020-4-6 |
开始时间 | 4-5/13:00 |
结束时间 | 4-6/15:24 |
编码行数 | 41 |
错误数量 | 0 |