软件工程第三次作业--最大连续子数组和(最大子段和)测试

最大连续子数组和(最大子段和)测试


问题: 给定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} ));
	}

测试结果

posted @ 2018-03-29 17:13  SkyDogEatMoon  阅读(333)  评论(0编辑  收藏  举报