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。
-- 引用自《百度百科

2.程序设计

程序设计采用递推法实现,每当数组中有一个新的数据进入,判断其正负,因加负数max值肯定不变,当加入正数时可能使max变大,当加入新数据使最大字段和为负数时重新计算字段和,最终得到其中最大字段和。源代码如下

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;
int arr[100],test[100];
int num,max;
int maxfun(int arr[],int num)
{
	int max;
	test[0]=arr[0];
	max = test[0];
	for (int i = 1; i < num; i++)
	{
		if (test[i - 1] > 0)
			test[i] = test[i - 1] + arr[i];
		else
			test[i] = arr[i];
		if (test[i] > max)
			max = test[i];
	}
	if (max < 0)
		max = 0;
	return max;
}

int main()
{
	int i;
	int max;
	cin >> num;
	for (i = 0; i < num; i++)
	{
		cin >> arr[i];
	}
	max = maxfun(arr, num);
	printf("%d\n", max);
	return 0;
}

maxfun函数流程图如下

3程序测试

对于本程序采用判定/条件覆盖

程序中共有三个判断条件

序号 条件
1 test[i-1]>0或test[i-1]>=0
2 test[i]>max或test[i]<=max
3 max>0或max<=0

测试样例如下

序号 测试样例 预期结果
1 (-2,11,-4,13,-5,-2) 20
2 (-2) 0

测试代码如下

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../求最大字段和/标头.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{	
	int arr1[] = { -2, 11, -4, 13, -21, -2 };
	int arr2[] = { -2 };
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
		
			Assert::AreEqual(maxfun(arr1, 6), 20);
			
		}
		TEST_METHOD(TestMethod2)
		{
			Assert::AreEqual(maxfun(arr2, 1), 0);
		}

	};
}

测试结果如下

coding地址