选择的题目.
题目(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。算法方面很薄弱还有很大进步空间。