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

  • 相关阅读:
    PageRank
    Web挖掘
    无监督学习
    Activiti 学习笔记记录(2016-8-31)
    Activiti 学习笔记记录(二)
    Activiti 学习笔记记录
    Mybatis + SpringMVC + Maven实现分页查询
    Jquery.min.js 下载
    使用Apache Archiva搭建Maven Repository Server
    SpringMVC 参数传递
  • 原文地址:https://www.cnblogs.com/Justdocument/p/8661354.html
Copyright © 2011-2022 走看看