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_tempright_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_tempsumright_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

猜你喜欢

转载自www.cnblogs.com/cxz17/p/12642299.html
今日推荐