软件工程第三次作业

选择的题目.

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

问题的分析.

输入一组数据,个数为n个,首先定义max代表最大字段和并且赋初值为0,用sum来保存当前数列的和并赋初值0。对sum和max的值进行比较,当sum的值大于max,将sum的值赋给max,如果小于,则舍弃当前的数值返回继续进行,代码是在同学的帮助下一步一步编写出来。
注意的是:这个程序进行时最开始已经对max赋初值为0,虽然sum的值在求和的过程中可能为负,但由于编写的这个程序对max进行判断时,就已经包括对当所给的整数均为负数时定义子段和为0的这种情况,因为当sum小于0时并没有将他的值赋给max,所以当数列所给的整数均为负数时,max的就是为0,所以最后不需要对max的值进行对0的判断。

编程.

下面是代码

条件组合覆盖.

在白盒测试法中,选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。条件组合覆盖:使得每个判定中条件的各种可能组合都至少出现一次。
组合覆盖为2种情况,分别是:
1、sum>max。
2、sum<=max。

  • 测试用例:
  • 样例1{-8,-13,-15,-17,-19,-18}都为负数的情况
  • 样例2{8,-3,6,-7,10,16}
    ...

单元测试如下.

源程序如上,这里只粘贴了测试代码,便于区分。
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:

	TEST_METHOD(TestMethod1)
	{
		int n = 6;
		// TODO: 在此输入测试代码
		int a[6] = { -8,-13,-15,-17,-19,-18 };
		int sum = max1(6, a);
		Assert::AreEqual(0, sum);
	}
	TEST_METHOD(TestMethod2)
	{
		// TODO: 在此输入测试代码
		int n = 6;
		int a[6] = {8,-3,6,-7,10,16};
		int sum = max1(6, a);
		Assert::AreEqual(26, sum);
	}
};

}

总结.

这次的作业我学会了单元测试和条件组合覆盖,更加熟练使用vs。算法方面很薄弱还有很大进步空间。

posted @ 2018-04-01 11:06  1091565703  阅读(160)  评论(0编辑  收藏  举报