第三次软工作业——实现最大字段和算法并进行判定条件覆盖

第三次软工作业

  • 实现最大子段和的算法并进行条件组合覆盖测试

(一)什么是最大子段和?

我自己的理解:
一个数组可以若干个子数组,包含自身。每一个字数组都有一个数组元素之和,求这些和之间的最大值。

最朴素的思想就是通过三重循环计算出每个子数组的和,并取最大值。但这种方法会带来很高的复杂度。现在“最大字段和”作为一个经典算法一般用动态规划思想解决,复杂度可以降低到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.实现判定条件覆盖测试
  1. 什么是判定条件覆盖测试?
  • 判定条件覆盖是设计足够的测试用例,得使判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。缺点是忽略了条件的组合情况。
  • 例如:一个判定包括两个条件如下
    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型变量,在测试中我们应该选择它。

(四)外链

我的github

posted @ 2018-03-28 00:34  syncdoodle  阅读(281)  评论(0编辑  收藏  举报