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

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

  • <font color=4F4F4F size=5>背景</font>   <font color=gray size=4>问题: 给定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。 -- 引用自</font><font color=pink size=4>《百度百科》</font>
  • <font color=4F4F4F size=5>具体要求</font> <font color=gray size=4>(1) 请从上述两个题目中根据我的实力任选一题,要求写出可运行的完整代码提交至GitHub或者Coding.net系统中,并将代码地址附到博客内</font> <font color=gray size=4>(2) 请从语句覆盖、断定覆盖、条件覆盖、断定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例</font> <font color=gray size=4>(3) 请利用自动测试工具对程序进行测试</font> <font color=gray size=4>(4) 请将程序运行结果和自动测试分析结果截图附到博客中</font>
  • <font color=4F4F4F size=5>问题分析</font> <font color=gray size=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的值。</font>
  • <font color=4F4F4F size=5>流程图与源代码</font>
  1. <font color=666666 size=4>流程图</font> ios

  2. <font color=666666 size=4>源代码</font> </font><font color=pink size=4>点此查看Github源代码</font>git

#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;
}
  • <font color=4F4F4F size=5>测试用例选择</font> <font color=666666 size=4>断定/条件覆盖</font>
\ A B C D
1 n<=0 a[0]_a[n]<0 sub<a[i] max1<sub
2 n>0 a[i]>0 sub>=a[I] max1>=sub
n=0;A1
n=6,a[]={-2,11,-4,13,-5,-2};A2,B2,C1,C2,D1,D2
n=6,a[]={-2,-11,-4,-13,-5,-2};A2,B1
<font color=gray size=4></font>
<font color=666666 size=4>单元测试代码</font>
#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);
		}
	
	};
}

<font color=666666 size=4>测试结果图</font> github

  • <font color=4F4F4F size=5>总结</font>   <font color=gray size=4>经过本次做业,我巩固了课堂所学的覆盖标准,深入理解了其概念,期待从此的学习</font>
相关文章
相关标签/搜索