第三次软工作业
- 实现最大子段和的算法并进行条件组合覆盖测试
(一)什么是最大子段和?
我自己的理解:
一个数组可以若干个子数组,包含自身。每一个字数组都有一个数组元素之和,求这些和之间的最大值。
最朴素的思想就是通过三重循环计算出每个子数组的和,并取最大值。但这种方法会带来很高的复杂度。现在“最大字段和”作为一个经典算法一般用动态规划思想解决,复杂度可以降低到O(n)。详细思想可以看这里。
(二)具体实现
- A.实现功能代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Max_sum
{
public class Program
{
public static void Main()
{
}
public static int Func_Test(int len, int[] a)
{
\b代表以当前数组元素为重点的最大值,sum代表整个过程中的最大值
int sum = 0, b = 0;
for (int i = 0; i < len; i++)
{
if (b > 0) \如果当前累加和大于0
{
b += a[i];
}
else
{
b = a[i];
}
if (b > sum) \如果当前累加和大于前面的最大值,最大值需要更新
{
sum = b;
}
}
return sum;
}
}
}
- B.实现判定条件覆盖测试
- 什么是判定条件覆盖测试?
- 判定条件覆盖是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。缺点是忽略了条件的组合情况。
- 例如:一个判定包括两个条件如下
y>1 && z=0
一组符合判定/条件覆盖的用例需要满足下面
1.使得判定为真
2.使得判定为假
3.使得y>1
4.使得y<=1
5.使得z=0
6.使得z!=0
2.具体设计
在A步骤中的代码中我们可以看到,一共有两个判定条件,所以需要四组测试样例分别测试
-
① b < 0 && b > sum 比如{-1 , 1 , 2 , 3} , 它的结果应该是6;
注:在运行到第2个元素的时候,b = 1 , sum = 0 ,满足 b < 0 && b > sum -
② b < 0 && b ≤ sum 比如{-1 , 1 , 2 , 3} , 它的结果应该是6;
注:在运行到第1个元素的时候,b = -1 , sum = 0 ,满足 b < 0 && b ≤ sum -
③ b ≥ 0 && b > sum 比如 {1 , 2 , 3 ,4} , 他的结果应该是10
注: 在运行到第1个元素的时候,b = 1 , sum = 0 ,满足 b ≥ 0 && b > sum -
④ b ≥ 0 && b ≤ sum 比如 {0 , 0 , 0 , 0} , 他的结果应该是0
注: 在运行到第1个元素的时候,b = 0 , sum = 0 ,满足 b ≥ 0 && b ≤ sum
通过以上思路写出下面的测试代码
using System;
using Max_sum;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Max_sum_test
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
int len = 4;
int[] a = new int []{-1,1,2,3};
Assert.AreEqual(6 ,Program.Func_Test(len , a));
}
[TestMethod]
public void TestMethod2()
{
int len = 4;
int[] a = new int[] { -1, 1, 2, 3 };
Assert.AreEqual(6, Program.Func_Test(len, a));
}
[TestMethod]
public void TestMothod3()
{
int len = 4;
int[] a = new int[] { 1, 2, 3, 4 };
Assert.AreEqual(10, Program.Func_Test(len, a));
}
[TestMethod]
public void TestMothod4()
{
int len = 4;
int[] a = new int[] { 0, 0, 0, 0};
Assert.AreEqual(0, Program.Func_Test(len, a));
}
}
}
测试全部通过,算法正确
图一
(三)总结
1.在这次作业中,走了一点弯路,刚开始把问题想复杂了,总是想着“面向对象编程”= =,写了很多无用代码。其实这个作业就是写一个功能函数并对其进行测试。
2.帮助自己更加熟悉IDE的操作,我觉得对往后的作业有很大的帮助。
3.在选择控制台程序时需要选择console(.net framework), 否则在运行测试代码的时候会报错 。
4.分清Assert.equal() 和 Assert.AreEqual() 的区别,后者返回一个bool型变量,在测试中我们应该选择它。