软件第三次作业

一、选择题目

  问题: 给定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。

二、代码编写

这部分代码主要借鉴于大佬的这篇博客,并进行了修改。
Coding:详细源码

/**
 * Demo类
 * @author haozhirong
 * version 1.0
 *
 */
public class Demo {
    /**
     * 求字段和的最大值
     * @return
     */
    public int getSubarrayMax(int[] arr){
        if(arr.length==0||arr==null) return 0;
        //当前最大连续子数组和
        int max=arr[0];
        //尝试计算的最大连续子数组和
        int submax=arr[0];
        for(int i=1;i<arr.length;i++){
            if(submax<=0){
                submax=arr[i];//如果前i~j个数的和小与等于0,则没有必要加下一个数。
            }else{
                submax+=arr[i];
            }
            if(submax>max)//每更改完sub的值,马上更新当期最大连续子数组和
                max=submax;
        }
        if(max<=0) return 0;
        else    return max;
    }
}

三、设计测试

1 逻辑测试方法简介
逻辑测试方法介绍
语句覆盖每条语句至少执行一次
判定覆盖判定的每个分支至少执行一次
条件覆盖判定的每个条件应取到各种可能的值
判定-条件覆盖同时满足判定覆盖和条件覆盖
条件组合覆盖判定中各种条件的每一种组合至少出现一次

注:参考博客

2 代码流程图

1345516-20180401173001430-681567075.png

3 设计测试用例

  在这里忽略掉循环中对数组的循环判定和arr是否为空数组的判定,共有3个判定条件。这里用条件组合覆盖结果为8种可能。

  1. submax<=0,submax>max,max<=0
  2. submax<=0,submax>max,max>0
  3. submax<=0,submax<=max,max<=0
  4. submax<=0,submax<=max,max>0
  5. submax>0,submax>max,max<=0
  6. submax>0,submax>max,max>0
  7. submax>0,submax<=max,max<=0
  8. submax>0,submax<=max,max>0
  9. arr数组为空

  通过分析得出,以上第5、6、7种可能永远都不可能满足。所以只需覆盖其他组合。

测试用例组数输入数组覆盖的组合号执行路径
1{0,8,-4,-5,2}2,8,4ACBDBDADF
2int [0]9
3{-11,-2,-4}1,3ACADE
4{0,0,0}1,3ADADE
4 设计测试代码及结果
import static org.junit.Assert.*;
import org.junit.Test;
public class DemoAutoTest {
    @Test
    public void testGetSubarrayMax() {
        assertEquals(8,new Demo().getSubarrayMax(new int[]{0,8,-4,-5,2}));
    }
    @Test
    public void testGetSubarrayMax1() {
        assertEquals(0,new Demo().getSubarrayMax(new int[]{-11,-2,-4}));
    }
    @Test
    public void testGetSubarrayMax2() {
        assertEquals(0,new Demo().getSubarrayMax(new int[]{0,0,0}));
    }
    @Test
    public void testGetSubarrayMax3() {
        assertEquals(0,new Demo().getSubarrayMax(new int [0]));
    }
}

1345516-20180401173055686-1888208251.png

测试成功

转载于:https://www.cnblogs.com/haozhirong/p/8687397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值