软件工程第三次作业
一、问题描述
最大连续子数组和(最大子段和)
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
-- 引用自《百度百科》
二、代码清单
1.代码地址
https://github.com/CountZ3/XXs-.git
2.功能函数模块
int max3(int a, int b, int c)
{
int max = a;
if (b > max)
max = b;
if (c > max)
max = c;
return max;
}
int maxsum( int a[], int left, int right)
{
if (left == right)
return a[left];
int middle = (left + right) / 2;
int leftmaxsum = maxsum(a, left, middle);
int rightmaxsum = maxsum(a, middle + 1, right);
int maxleftborderSum = 0;
int maxrightborderSum = 0;
int tempsum = 0;
for (int i = middle;i >= left;i--)
{
tempsum += a[i];
if (tempsum > maxleftborderSum)
maxleftborderSum = tempsum;
}
tempsum = 0;
for (int i = middle + 1;i <= right;i++)
{
tempsum += a[i];
if (tempsum > maxrightborderSum)
maxrightborderSum = tempsum;
}
int maxbordersum = maxrightborderSum + maxleftborderSum;
return max3(leftmaxsum, maxbordersum, rightmaxsum);
}
三、测试
本次测试通过使用条件组合覆盖进行测试,执行足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。
1.功能函数流程图
通过流程图知,条件组合覆盖一共有4条路径,分别是ae,abf,abcg,abcd,按照条件组合的定义,共有14种可能的组合。这里设置7个测试用例,用以覆盖上述14种条件组合,如下表所示:
2.测试代码
#include "stdafx.h"
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
int maxsum(int a[], int left, int right);
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
int a[] = {1};
Assert::AreEqual(1, maxsum(a, 0, 0));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod2)
{
int a[] = { -2,11,-4,13,-5,2 };
Assert::AreEqual(20, maxsum(a, 0, 5));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod3)
{
int a[] = { 5,-3,2,-3,1 };
Assert::AreEqual(5, maxsum(a, 0, 4));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod4)
{
int a[] = { 3,-4,-3,-7,5 };
Assert::AreEqual(5, maxsum(a, 0, 4));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod5)
{
int a[] = { -3,2,3,-2,1 };
Assert::AreEqual(5, maxsum(a, 0, 4));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod6)
{
int a[] = { -3,-2,3,-4,9 };
Assert::AreEqual(9, maxsum(a, 0, 4));
// TODO: 在此输入测试代码
}
TEST_METHOD(TestMethod7)
{
int a[] = { 5,-4,-2,-3,1 };
Assert::AreEqual(5, maxsum(a, 0, 4));
// TODO: 在此输入测试代码
}
};
}