软件第三次作业

一、选择题目

  问题: 给定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种可能。

  1. submax<=0,submax>max,max<=0
  2. submax<=0,submax>max,max>0
  3. submax<=0,submax<=max,max<=0
  4. submax<=0,submax<=max,max>0
  5. submax>0,submax>max,max<=0
  6. submax>0,submax>max,max>0
  7. submax>0,submax<=max,max<=0
  8. submax>0,submax<=max,max>0
  9. 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]));
	}
}

测试成功

posted @ 2018-04-01 17:57  helloprogram6  阅读(148)  评论(0编辑  收藏  举报