最大连续子数组和(最大子段和)及其条件覆盖

最大连续子数组和(最大子段和)问题

  • 背景
      问题: 给定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) 请从上述两个题目中根据个人实力任选一题,要求写出可运行的完整代码提交至GitHub或者Coding.net系统中,并将代码地址附到博客内
    (2) 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例
    (3) 请利用自动测试工具对程序进行测试
    (4) 请将程序运行结果和自动测试分析结果截图附到博客中
  • 问题分析
       根据题目分析,需要输入n个整数,所以设置一个自变量n,保存要输入的整数个数,以及一维数组a[n](此处需要用指针申请动态数组),用来保存输入的整数,由于题目要求“当所给的整数均为负数时定义子段和为0”,所以输入完成后立即判断所输入整数是否全为负数,如果全为负数,输出‘0’;
      虽然算出所有组合便找出最大子段合,但是这样程序执行开销过大,所以改进算法,只使用一次循环。
       因为最大子段和一定是正数,这样就排除了许多组合,所以从第一个整数开始累加,出现负数便舍弃之前的子段,从当前位置继续向后累加子段,依次累加到最后一个整数,而此过程中还需要另外一个变量记录到目前为止所出现的最大子段合。
       设置变量sub,max1保存子段和,初值为0,从第一个整数开始逐个向后累加,累加值保存在变量sub中,每完成一次累加,立即比较当前sub的值与刚刚所累加整数a[i]的大小,如果sub<a[i],则将a[i]的值赋给sub,为了找出最大子段合。需要用max1记录最大的sub值,所以每累加一次之后都要比较max1与sub的大小,如果max1<sub,则将sub的值赋给max1,否则max1保持不变,当循环累加结束后,max1的值即为该连续子数组最大子段和,输出max1的值。
  • 流程图与源代码
  1. 流程图

  2. 源代码
#include <stdio.h>
#include<iostream>
#include<cstdlib>
using namespace std;

int MAX(int n,int *a)
{
    int  m, max1=0,sub=0;
    for (m = 0; m < n; m++)
    {
        sub += a[m];
        if(sub<a[m])
        {
            sub = a[m];
        }
        if (max1 < sub)
        {
            max1 = sub;
        }
    }
    return max1;
}

int main()
{
    int i=0,max=0,n=0,button=0;
    int* a = new int[n+1];
    cin >> n;
    if (n <= 0)
    {
    cout << max;
    system("pause");
    return 0;
    }
    return 0;
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
        if (a[i] > 0)
        {
            button = 1;
        }
    }
    if (button == 0)
    {
        max = 0;
    }
    else
    {
        max = MAX(n,a);
    }
    cout << max << endl;
    system("pause");
    return 0;
}
  • 测试用例选择
    判断/条件覆盖
\ A B C D E
1 n<=0 a[0]_a[n]<0 sub<a[i] max1<sub i<n
2 n>0 a[i]>0 sub>=a[I] max1>=sub i>=n

n=0;A1
n=6,a[]={-2,11,-4,13,-5,-2};A2,B2,C1,C2,D1,D2,E1,E2
n=6,a[]={-2,-11,-4,-13,-5,-2};A2,B1

单元测试代码

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../2/head.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{       
    TEST_CLASS(UnitTest1)
    {
    public:
        TEST_METHOD(TestMethod1)
        {
            int n = 6;
            int num[] = { -2,11,-4,13,-5,-2 };
            Assert::AreEqual(MAX(n, num), 20);
        }
        TEST_METHOD(TestMethod2)
        {
            int n = 6;
            int num[] = { -2,-11,-4,-13,-5,-2 };
            Assert::AreEqual(MAX(n, num), 0);
        }
        TEST_METHOD(TestMethod3)
        {
            int n = -1;
            int num[] = { -2,11,-4,13,-5,-2 };
            Assert::AreEqual(MAX(n, num), 0);
        }
    
    };
}

测试结果图

猜你喜欢

转载自www.cnblogs.com/daheUU/p/10732544.html