软件工程第三次作业

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.解题思路

若数组为空则返回0。
若不为空,则从数组左边开始,依次遍历。并定义最大子段和变量max记录最大值并不断更新。当此字段和大于先前记录的最大字段和时,则最大字段和更改为此字段和,直到遍历结束。

3.程序设计

主要代码如下所示。

int MAX::GetMaxAddOfArray(int a[], int n)
{
	int sum = 0;
	int max = 0;
	if (a == NULL||n==0)
	{
		return 0;
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = i; j < n; j++)
		{
			sum = sum+a[j];
			if (sum > max)
			{
				max = sum;
			}
		}
		sum = 0;
	}
	return max;
}

4.程序流程图

5.单元测试

  • 本次测试选用判定/条件覆盖。

即没个判定真假各一次,每个判定中条件各一次。

   1  2  3   4
数组为NULL i<=n j<=n sum<=max
数组不为NULL i>n j>n sum>max
  • 测试用例

    测试用例 结果
    n=0;a[]= 0
    n=6;a[6]= 0
    n=6;a[6]= 20
    n=5;a[5]= 5
    n=5;a[5]= 5
  • 测试代码

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../Project2/P2.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{		
	TEST_CLASS(UnitTest1)
	{
	public:
		
			TEST_METHOD(TestMethod1)
			{
				MAX m;
				int max, a[] = { 0 };
				max = m.GetMaxAddOfArray(a, 0);
				Assert::AreEqual(max, 0);
			}
			TEST_METHOD(TestMethod2)
			{
				MAX m;
				int max, a[6] = { -1,-2,-3,-4,-5,-6 };
				max = m.GetMaxAddOfArray(a, 6);
				Assert::AreEqual(max, 0);
			}
			TEST_METHOD(TestMethod3)
			{
				MAX m;
				int max, a[6] = { -2,11,-4,13,-5,-2 };
				max = m.GetMaxAddOfArray(a, 6);
				Assert::AreEqual(max, 20);
			}
			TEST_METHOD(TestMethod4)
			{
				MAX m;
				int max, a[5] = { -1,2,-3,-4,5 };
				max = m.GetMaxAddOfArray(a, 5);
				Assert::AreEqual(max, 5);
			}
			TEST_METHOD(TestMethod5)
			{
				
				MAX m;
				int max, a[5] = { 1,2,3,4,5};
				max = m.GetMaxAddOfArray(a, 5);
				Assert::AreEqual(max, 15);
			}

	};
}
  • 测试结果如下。

5.遇到的问题及解决方法

这个题目有多种解题方法,刚看到题目时自然想到了以上算法。但以上算法时间复杂度为O(n^2),并不是很好的算法。由此经过思考和网上查询资料,得到了相对更好的方法。其主要代码如下。

int MAX::GetMaxAddOfArray(int a[], int n)
{
	int sum = 0;
        int max = 0;
	if (a == NULL || n == 0)
	{
		return 0;
	}
	for (int i = 0; i < n; i++)
	{
		sum = sum + a[i];
		if (sum < 0)
		{
			sum = 0;
		}
		if (sum > max)
		{
			max = sum;
		}
	}
	return max;
}

流程图如下所示。

结果如下


完整代码及测试代码:https://git.dev.tencent.com/shy163401010204/zuida.git
参考资料:https://blog.csdn.net/m0_37925202/article/details/80816684

6.总结

 本次作业中,涉及到了代码编程规范,并学习了五大覆盖标准,明白了各个标准之间的区别与联系。同时,也复习了之前的单元测试的内容。在学习的过程中,我发现自己编写的代码过于暴力解题,并没有深层次考虑更加有效率的办法,在今后的编程中还要多加改进。

posted @ 2019-04-19 21:48  喵啊咪  阅读(196)  评论(0编辑  收藏  举报