软件工程第三次作业
一.题目要求
题目(1):最大连续子数组和(最大子段和)
问题: 给定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。
二.具体步骤
1.设计思路
本体的要求是求一组数的最大字段和,所以首先我们可以定义一个数组将该序列所有的数储存起来,之后定义两个数初始值为0的数,第一个用来存储当前计算出来的子数和,第二个存储上一轮计算后保存下来的子数和。每进行一次计算和后就对两个数进行一次比较,将大的数存入第二个数中。当最后子段和值小于0时,则输出0。
2.代码展示
3.样例测试
4.流程图
5.上传
[github] (https://github.com/vergilspata/learning/blob/master/homework03)
三.单元测试
1.覆盖方法
本次试验中我使用的为判定-条件覆盖
(1)语句覆盖
(2)判定覆盖
(3)条件覆盖
(4)判定-条件覆盖
(5)条件组合覆盖
2.测试使用的路径
(1)firstsum<secondsum secondsum<=0
(2)firstsum
(3)firstsum>secondsum secondsum<=0
(4)firstsum>secondsum secondsum>0
所使用测试例子
(1){-5,-9,-11,-20,-25}) 最大子段和:0
(2){-12,5,4,11,-13} 最大子段和:20
(3){-8,2,-3,14,-5} 最大子段和:14
(4){1,3,5,7,9} 最大子段和:25
3.测试代码与结果
package train3;
import static org.junit.Assert.*;
import org.junit.Test;
public class test01 {
@Test
public void test001() {
int a[]= {-5,-9,-11,-20,-25};
assertEquals(0, Max.maxsum(a));
}
@Test
public void test002() {
int a[]= {-12,5,4,11,-13};
assertEquals(20, Max.maxsum(a));
}
@Test
public void test003() {
int a[]= {-8,2,-3,14,-5};
assertEquals(14, Max.maxsum(a));
}
@Test
public void test004() {
int a[]= {1,3,5,7,9};
assertEquals(25, Max.maxsum(a));
}
}