软件工程第三次作业

求最大子段和


一.问题描述

  • 背景
    给定n个整数(可能为负数)组成的序列a1,a2,a3,…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a1,a2,a3,a4,a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
    -- 引用自《百度百科》
  • 内容要求
    -(1) 请从上述两个题目中根据个人实力任选一题,要求写出可运行的完整代码提交至GitHub或者Coding.net系统中,并将代码地址附到博客内,题目(1)可以参考这篇博文

(2) 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例

(3) 请利用自动测试工具对程序进行测试

(4) 请将程序运行结果和自动测试分析结果截图附到博客中


二.实现方法

  • 思路
    1.首先,我们需要定义一个变量currentSum,用for循环来记录前i项的和,currentSum每次都会更改,如果currentSum的值小于0,我们再往后加只有减小最大和,所以我们需要将array[i+1]项的值重新赋值给currentSum。
    2.我们需要定义一个最大值max,每次改变currentSum的值时,我们都需要将max和currentSum进行比较,如果currentSum大于max,我们则将currentSum的值赋值给max。
  • 流程图
    image_1c9jr3nti1rnse51eidv6m2e89.png-42.5kB

三.代码运行以及测试

  • 经过上面流程图的构造,写出可用的代码,之后选择样例运行。

image_1c9js4r1i1ll1180l106r1cms1uvl16.png-96.6kB

  • 选择覆盖方式
    第一阶段的运行大致没有错误,接下来就是选择合适的覆盖方法进行测试,看看代码内部是否还有隐藏的问题。

测试工具选择的是JUnit,覆盖方式选择的是判定覆盖

  • 选择测试数据
    根据流程图来看,我们需要的判定有4个,分别是:
    (1)Array.lengh==0
    (2)CurrentSum<=0
    (3)CurrentSum>max
    (4)i是否小于Array.lengh

由于选择了判定覆盖方式,所以选择的数据要使上方的数据是和否至少各执行一次
样例以及结果如下图

  • 1.image_1c9jtd9jdee91eiu152j1f2qmju23.png-46.4kB

  • 2.image_1c9jte3qpnoe190h6oo1vfu1ri62g.png-47.8kB
    测试成功!判定覆盖的测试通过!

四.小结

哎呀呀,这第三次作业跟第一次和第二次的作业难度差距有点大的呀!算法部分就困扰了我好久,各种查资料,问同学才搞明白。等到写完之后发现,进行条件组合覆盖的难度有点大!纠结了很久,退而求次,选择了判定覆盖!因为流程图实在是让本人痛苦不堪,耽误了太多时间,搞得自己心里乱乱的,只好选一个简单的覆盖方式完工了!作为一个理科男,我的画流程图水准真的不忍直视,修修改改,才完成现在的流程图(可能是至今完成度最好的流程图了吧。)
以后一定要加紧练习这个技巧,不然感觉以后会吃大亏!
另外还有这次作业发现一个重要的事情:作业加上题目以及要求!之前两次作业都是空下了,直接写的作业1作业2,今天想用JUnit自动测试时发现,有些地方忘记了!当我想回去翻找之前做过的作业去回顾时,发现自己好多重要的知识点都漏掉了。尤其是题目中,老师给的链接,一点都没有,哇,这个急,之前的作业也没有显示了,幸好找了半天历史记录找到了,不然真的又要卡住很久了。嗯,吸取教训,下次进步!
另外Java技术不是特别好,一直没搞明白怎么从外部输入。只会从程序里面定义数据然后使用。嗯。还是要再学啊!

五.附录

posted @ 2018-03-27 22:47  郭靖#52910  阅读(138)  评论(0编辑  收藏  举报