软件工程第三次作业

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. 具体要求

  • 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例
  • 请利用自动测试工具对程序进行测试
  • 请将程序运行结果和自动测试分析结果截图附到博客中

本题是acm的入门题,解法有很多,可以暴力,动态规划,采用不同的解法会带来不同的时间和空间的代价,这里列举一个动态规划的算法,时间复杂度为O(n),空间复杂度为O(1)。算法思想方面,这题属于一个思维题。将子段分成两段考虑就可以解决。如果左端的子段和是负的,对于最终的子段和的左段一定不会包含这段,因为右段和是一个或一段正数,会比左边的这段大,就会抛弃这段负数的和。在遍历数组时候每次记录一次最大的子段和,一旦在某个位置子段和为负,就会将子段重新开始。本题的测试平台可以选择OJ,51nod就挂了一个一模一样的题,但是那个题要考虑数据范围。最后的子段和有可能爆int,所以在选择数据类型的时候,用c++应该使用long long。用java 选择long,但是不能选择int。

程序流程图如下图

对于程序,采用判定/条件覆盖的方法测试

程序中一共有三处判定

maxn < sum或maxn >= sum
sum< 0或 sum >=0
i >= arr.length或i < arr.length

设置样例{-2,2},可以同时在多次循环中达到6个条件各有一种可能性。而且这个样例是最好的覆盖样例,可以覆盖所有的路径,将每个判定中每一个条件true和false都执行一次,将每一个判定的true和false都执行一次。即小又全,而且没有重复的检验。就可以达到判定/条件覆盖效果,为了程序的健壮性,设置了多组样例 {-2, 11,-4, 13, -5, -2} {1, 7, -10} {1, -2, -5, -10} {-5,-2, -10} {-1,-2, 2} {-2, 2} 这里列举了6个样例,而且程序已经通过了OJ平台的大样例的测试。如果不会使用OJ平台,可以自己用O(n2)的算法写个对数器比对一下程序的正确性。

代码测试结果如下图

代码托管地址

posted @ 2019-04-19 21:44  1375713522  阅读(151)  评论(0编辑  收藏  举报