软件第三次作业
一、选择题目
问题: 给定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。
二、代码编写
这部分代码主要借鉴于大佬的这篇博客,并进行了修改。
Coding:详细源码
/**
* Demo类
* @author haozhirong
* version 1.0
*
*/
public class Demo {
/**
* 求字段和的最大值
* @return
*/
public int getSubarrayMax(int[] arr){
if(arr.length==0||arr==null) return 0;
//当前最大连续子数组和
int max=arr[0];
//尝试计算的最大连续子数组和
int submax=arr[0];
for(int i=1;i<arr.length;i++){
if(submax<=0){
submax=arr[i];//如果前i~j个数的和小与等于0,则没有必要加下一个数。
}else{
submax+=arr[i];
}
if(submax>max)//每更改完sub的值,马上更新当期最大连续子数组和
max=submax;
}
if(max<=0) return 0;
else return max;
}
}
三、设计测试
1 逻辑测试方法简介
逻辑测试方法 | 介绍 |
---|---|
语句覆盖 | 每条语句至少执行一次 |
判定覆盖 | 判定的每个分支至少执行一次 |
条件覆盖 | 判定的每个条件应取到各种可能的值 |
判定-条件覆盖 | 同时满足判定覆盖和条件覆盖 |
条件组合覆盖 | 判定中各种条件的每一种组合至少出现一次 |
注:参考博客 |
2 代码流程图
3 设计测试用例
在这里忽略掉循环中对数组的循环判定和arr是否为空数组的判定,共有3个判定条件。这里用条件组合覆盖结果为8种可能。
- submax<=0,submax>max,max<=0
- submax<=0,submax>max,max>0
- submax<=0,submax<=max,max<=0
- submax<=0,submax<=max,max>0
- submax>0,submax>max,max<=0
- submax>0,submax>max,max>0
- submax>0,submax<=max,max<=0
- submax>0,submax<=max,max>0
- arr数组为空
通过分析得出,以上第5、6、7种可能永远都不可能满足。所以只需覆盖其他组合。
测试用例组数 | 输入数组 | 覆盖的组合号 | 执行路径 |
---|---|---|---|
1 | 2,8,4 | ACBDBDADF | |
2 | int [0] | 9 | |
3 | 1,3 | ACADE | |
4 | 1,3 | ADADE |
4 设计测试代码及结果
import static org.junit.Assert.*;
import org.junit.Test;
public class DemoAutoTest {
@Test
public void testGetSubarrayMax() {
assertEquals(8,new Demo().getSubarrayMax(new int[]{0,8,-4,-5,2}));
}
@Test
public void testGetSubarrayMax1() {
assertEquals(0,new Demo().getSubarrayMax(new int[]{-11,-2,-4}));
}
@Test
public void testGetSubarrayMax2() {
assertEquals(0,new Demo().getSubarrayMax(new int[]{0,0,0}));
}
@Test
public void testGetSubarrayMax3() {
assertEquals(0,new Demo().getSubarrayMax(new int [0]));
}
}
测试成功