软件工程第三次作业--最大连续子数组和(最大子段和)测试
最大连续子数组和(最大子段和)测试
问题: 给定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。
-- 引用自百度百科
程序设计
程序设计思路
为了求数组最大字段和,须定义变量max,currentSum分别保存最大值和当前和。初值均设为零,对currentSum进行循环加法,当currentSum<=0时,将currentSum值重置为num[i],否则currentSum=currentSum+num[i]。将max与currentSum进行比较,若后者大则max赋值为currentSum,否则不变。最终结果即为最大字段和。
程序代码
coding链接:https://coding.net/u/INeedAPassport/p/JunitTest_2/git?public=true
package code;
import java.util.Scanner;
public class maxNU {
public void main(String[] args) {
Scanner inport=new Scanner(System.in);
int i,n;
int[] num=new int[100];
n=inport.nextInt();
for(i=0;i<n;i++)
num[i]=inport.nextInt();
int result = sum(num);
System.out.println("连续子元素的最大和为:"+result);
inport.close();
}
public int sum(int[] num) {
if (num.length==0 || num==null) {
return 0;
}
int currentSum = 0;
int max = 0;
for (int i = 0; i <num.length; i++) {
if(currentSum<=0){
currentSum = num[i];
}else{
currentSum = currentSum + num[i];
}
if(currentSum>max){
max = currentSum;
}
}
return max;
}
}
测试程序
判定/条件覆盖测试程序设计
由图知测试程序需要涵盖以下情况:
数组num为空 | currentSum<=0 | currentSum>max |
---|---|---|
数组num不为空 | currentSum>0 | currentSum>max |
测试程序代码
package code;
import static org.junit.Assert.*;
import org.junit.Test;
public class test {
@Test
public void sum1() {
assertEquals(0, new maxNU().sum(new int[] {} ));
}
@Test
public void sum2() {
assertEquals(20,new maxNU().sum(new int[] {-2,11,-4,13,-5,-2} ));
}
@Test
public void sum3() {
assertEquals(0, new maxNU().sum(new int[] {-2,-11,-4,-13,-5,-2} ));
}
@Test
public void sum4() {
assertEquals(12, new maxNU().sum(new int[] {1,4,7} ));
}