软件工程第三次作业
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单元测试
白盒测试几种测试方式如下:
- 语句覆盖
使所有的判断语句都能执行一次的条件案例,例如当判断语句事组合语句的时候,并且用or连接,只满足一个案例即可。 - 判定覆盖(分支覆盖)
判定覆盖也叫分支覆盖(Branch Coverage),含义是:在测试时,运行被测程序后,程序中所有判断语句的取真分支和取假分支被执行到的比率。判定覆盖=(判定结果被评价的次数)/判定结果的总数。
- 条件覆盖
针对判断语句里面案例的取值都要去一次,不考虑条件的取值。
- 判定/条件覆盖
判定覆盖各条件覆盖交叉,针对于判定中的条件取值 。
- 组合覆盖
判定-条件覆盖的加强版 。
- 路径覆盖
走完所有路径。
我选择条件组合覆盖进行测试,测试代码如下:
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
漂亮的皮囊千篇一律,有趣的灵魂万里挑一!