软件工程第三次作业

1.题目选择

  本次作业有两道题目可供选择,我选择第一题,求最大连续子数组和。

问题: 给定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,a5,a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
-- 引用自《百度百科》

  • 什么是最大子数组和
      一个数组包含若干个子数组,每个数组中元素之和必为一确定的值,求出子数组之和的最大值,即为本题答案。
  • 采用的方法
      使用动态规划思想进行编程,如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0...n])。我们可以给出如下递归公式求,f[i]=max{f[i1]+a[i],a[i]}。
      这个公式的意义:当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。

2.编写待测试类

 代码如下:

import java.util.*;
public class MaxSubArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int[] a=new int[100];  	//声明一个含有一百个元素的数组
		int n;
		n=in.nextInt();
		for(int i=0;i<n;i++)
		{
			a[i]=in.nextInt();
		}
		int sum=DG(a,n);
		System.out.println(sum);
	}
	public static int DG(int a[],int n)
	{
		int currentsum=0;
		int maxsum=0;
		for(int i=0;i<n;i++)
		{
			if(currentsum<=0)   //当前数组之和小于0
			{
				currentsum=a[i];
			}
			else				//当前值大于0与后一个元素相加
			{
				currentsum+=a[i];
			}
			if(currentsum>maxsum)	//当前值与最大值进行比较
				maxsum=currentsum;
		}
		return maxsum;
	}
}

3. Junit单元测试

  白盒测试几种测试方式如下:

  1. 语句覆盖
    使所有的判断语句都能执行一次的条件案例,例如当判断语句事组合语句的时候,并且用or连接,只满足一个案例即可。
  2. 判定覆盖(分支覆盖)
    判定覆盖也叫分支覆盖(Branch Coverage),含义是:在测试时,运行被测程序后,程序中所有判断语句的取真分支和取假分支被执行到的比率。判定覆盖=(判定结果被评价的次数)/判定结果的总数。
    判定覆盖
  3. 条件覆盖
    针对判断语句里面案例的取值都要去一次,不考虑条件的取值。
    条件覆盖
  4. 判定/条件覆盖
    判定覆盖各条件覆盖交叉,针对于判定中的条件取值 。
    此处输入图片的描述
  5. 组合覆盖
    判定-条件覆盖的加强版 。
    此处输入图片的描述
  6. 路径覆盖
    走完所有路径。
    此处输入图片的描述

我选择条件组合覆盖进行测试,测试代码如下:

import static org.junit.Assert.*;

import org.junit.Test;

public class MaxSubArrayTest {

	@Test
	public void test() {
		int []a=new int[] {-4,11,-4,13,-5,-1};
		int s=new MaxSubArray().DG(a, a.length);
		assertEquals(20,s);
	}
	@Test
	public void test2() {
		int []a=new int[] {-2,12,4,6,8,-5};
		int s=new MaxSubArray().DG(a, a.length);
		assertEquals(30,s);
	}
	@Test
	public void test3() {
		int []a=new int[] {-2,-4,-6,-8,-10,-12};
		int s=new MaxSubArray().DG(a,a.length);
		assertEquals(0,s);
	}
}

4. 测试结果

  附上coding链接:https://coding.net/u/Bluebird_/p/MaxSubArray/git/blob/master/MaxSubArray.java?public=true

posted on 2018-03-28 21:57  qianqian丶  阅读(161)  评论(0编辑  收藏  举报

导航