目录

1. 题目

GITHUB代码地址:

  GITHUB代码地址:https://github.com/wuxuezeproject/-
  最大连续子数组和(最大子段和)
问题描述: 给定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。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2. 程序设计及代码编辑

2.1程序设计

  程序的主要方程为Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]);
  最大和要么是前面所求最大和加下一项,要么是下一项。具体程序流程图如下:

软件工程第三作业 随笔 第1张

2.2代码编辑

int GetSum(int* array, int num)
{
    if (array == NULL) return 0;
    int i;
    int Max{ array[0] };
    int Sum{ array[0] };
    for (i = 1; i < num; i++)
    {
        Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]);
        if (Sum > Max)
        {
            Max = Sum;
        }
    }
    if (Max < 0)
    {
        Max = 0;
    }
    return Max;
}

3. 测试分析及结果

  本次测试,我采用的是条件组合测试。本次测试中涉及到的条件选择共有四个,一共有九种组合方式。

3.1测试分析

  条件选择的可能性组合的二叉图如下:
软件工程第三作业 随笔 第2张

3.2测试案例设计

  针对上面的九种条件组合,对应的设计案例如下:

array==NULL? sum取值 sum>max? max<0? 测试用例 结果
array==NULL {} 0
array!=NULL sum=(sum+array[[i]) sum>max max>0 {2,2,2} 6
array!=NULL sum=(sum+array[[i]) sum>max max<0 不存在
array!=NULL sum=(sum+array[[i]) sum<max max>0 {5,,-2,3} 6
array!=NULL sum=(sum+array[[i]) sum<max max<0 不存在
array!=NULL sum= array[[i]) sum>max max>0 {-2,5,3} 8
array!=NULL sum= array[[i]) sum>max max<0 {-2,-1,-3} 0
array!=NULL sum= array[[i]) sum<max max>0 不存在
array!=NULL sum= array[[i]) sum<max max<0 {-2,-3,-5} 0

  测试代码如下:

TEST_METHOD(TestMethod1)    //array==NULL
        {
            int *array = {};
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 0);
        }
        TEST_METHOD(TestMethod2)    //(sum=sum+array)&&(sum>max)&&(max>0)
        {
            int array[] = { 2,2,2 };
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 6);
        }
        TEST_METHOD(TestMethod3)    //(sum=sum+array)&&(sum<max)&&(max>0)
        {
            int array[] = { 5,-2,3 };
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 6);
        }
        TEST_METHOD(TestMethod4)    //(sum=array)&&(sum>max)&&(max>0)
        {
            int array[] = { -2,5,3 };
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 8);
        }
        TEST_METHOD(TestMethod5)    //(sum=array)&&(sum>max)&&(max<0)
        {
            int array[] = { -2,-1,-3 };
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 0);
        }
        TEST_METHOD(TestMethod6)    //(sum=array)&&(sum<max)&&(max<0)
        {
            int array[] = { -2,-3,-5 };
            int num = sizeof(array) / sizeof(array[0]);
            int Max = GetSum(array, num);
            Assert::AreEqual(Max, 0);
        }

3.3测试结果

  测试时用例全部通过,结果如下:
软件工程第三作业 随笔 第3张

3.总结

  本次作业,学到了简单的个人项目的开发,也更加熟悉了单元测试,能够对不同类型的条件进行单元测试,收获满满。
  每一次作业都会有新的收获,我也会在学习的道路上一直走下去,屏幕前的你,也要加油啊!

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄