软件工程第三次作业

1、题目要求


###1.1题目 最大连续子数组和(最大子段和) ###1.2背景 >问题:给定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、问题分析
###2.1分析   根据题目的背景,获得已经条件:1<=i<=j<=n,所以该序列不可能为空。题目的要求是求出某一个子段的最大值,所以设置两个变量Max,temp。max作为最优值,Max的初值为第一个整数;temp作为中间变量值。另temp=数组的第一个整数,在数组长度的范围内,加上数组的下一个整数number[i]。若相加之和大于number[i],则说明number[i-1]为正数,temp+=number[i];若小于number[i],则说明number[i-1]为负数,temp=number[i]。如果temp>Max时,则Max=temp;否则Max的值不变,temp继续向下试探。重复上述过程,直至达到数组长度。最后Max在与0进行比较,若小于0则Max=0。 ###2.2流程图   函数流程图如图2所示。
![](https://img2018.cnblogs.com/blog/1644604/201904/1644604-20190417135848772-420017126.jpg)

图2 函数流程图

##3、代码
  函数代码如下: ``` cpp int Max_Sum(int* number,int n) { int i; int max = number[0]; int temp = number[0]; for (i = 1; i < n; i++) { temp += number[i]; if (temp < number[i]) temp = number[i]; if (temp > max) max = temp; } if (max < 0) { max = 0; } return max; } ``` ##4、测试
###4.1测试样例分析   采用条件组合覆盖作为标准设计测试用例。分析流程如图4.1所示。   分析:如果前一个数X加上后一个数Y的和大于Y,则说明X>0,即Max>0。所以条件组合B、D不存在。如果X+Y![](https://img2018.cnblogs.com/blog/1644604/201904/1644604-20190417144926093-1191894866.jpg)

图4.1 样例分析

###4.2测试样例设计   测试样例1:满足条件组合A。number{2,6}; 期望结果为8。   测试样例2:满足条件组合C。number{3,-5}; 期望结果为3。   测试样例3:满足条件组合E。number{-2,11}; 期望结果为11。   测试样例4:满足条件组合F。number{-6,-1}; 期望结果为0。   测试样例5:满足条件组合H。number{-2,-11}; 期望结果为0。 ###4.3测试代码   测试样例的代码如下 ```cpp TEST_METHOD(TestMethod1) { int number[]{2,6}; int len = sizeof(number) / sizeof(int); int max = Max_Sum(number,len); Assert::AreEqual(8, max); }
	TEST_METHOD(TestMethod2)
	{
		int number[]{ 3,-5 };
		int len = sizeof(number) / sizeof(int);
		int max = Max_Sum(number, len);
		Assert::AreEqual(3, max);
	}

	TEST_METHOD(TestMethod3)
	{
		int number[]{ -2,11 };
		int len = sizeof(number) / sizeof(int);
		int max = Max_Sum(number, len);
		Assert::AreEqual(11, max);
	}

	TEST_METHOD(TestMethod4)
	{
		int number[]{ -6,-1 };
		int len = sizeof(number) / sizeof(int);
		int max = Max_Sum(number, len);
		Assert::AreEqual(0, max);
	}

	TEST_METHOD(TestMethod5)
	{
		int number[]{-2,-11};
		int len = sizeof(number) / sizeof(int);
		int max = Max_Sum(number, len);
		Assert::AreEqual(0, max);
	}
###4.4测试结果
&emsp;&emsp;样例的测试结果如图4.2所示。
<div align="center">![](https://img2018.cnblogs.com/blog/1644604/201904/1644604-20190417151129684-689461331.png)</div>

<p align="center"><b>图4.2 测试结果</b></p>
##5、完整代码
<hr>
https://dev.tencent.com/u/dtid_4a62a5252e0ec76f/p/jiangyouzhi/git
<hr>