zoukankan      html  css  js  c++  java
  • 第三次软工作业——实现最大字段和算法并进行判定条件覆盖

    第三次软工作业

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

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

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

    最朴素的思想就是通过三重循环计算出每个子数组的和,并取最大值。但这种方法会带来很高的复杂度。现在“最大字段和”作为一个经典算法一般用动态规划思想解决,复杂度可以降低到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

  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/Justdocument/p/8661354.html
Copyright © 2011-2022 走看看