zoukankan      html  css  js  c++  java
  • 软件工程——第三次作业

    本项目发布在在腾讯云代码托管平台(即Coding.net)

    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。
    ———引用自百度百科

    2. 设计程序

    使用C ++语言编写所需要的程序

    首先编写主程序Max SubSequence Sum.cpp

    // Max SubSequence Sum.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include "pch.h"
    #include <iostream>
    #include "sumlib.h"
    
    using namespace std;
    
    int main()
    {
    	const int aArray[] = { -2,-11,-4,-13,-5,-2 };
    	int iLength = sizeof(aArray) / sizeof(aArray[0]);
    	int maxSSSum = MaxSubSequenceSum(aArray, iLength);
    	cout << "The Max Sub-sequence summary of this array is: " << maxSSSum << endl;
    	system("pause");
    	return 0;
    }
    

    再编写头文件sumlib.h

    #pragma once
    #include<iostream>
    using namespace std;
    
    int MaxSubSequenceSum(const int *array, int cntLength)
    {
    	if (array == NULL || cntLength <= 0)
    	{
    		return 0;
    	}
    	int tempSum, maxSum;
    	maxSum = 0;
    	for (int cntI = 0; cntI < cntLength; cntI++)
    	{
    		tempSum = 0;
    		for (int cntJ = cntI; cntJ < cntLength; cntJ++)
    		{
    			tempSum += array[cntJ];
    			if (tempSum > maxSum)
    			{
    				maxSum = tempSum;
    			}
    		}
    	}
    	return maxSum;
    }
    

    程序运行的结果如图所示
    avator

    3. 选择覆盖标准并设计测试样例

    我们选择判定/条件覆盖来设计测试样例

    所设计的程序中求最大子段和的函数

    int MaxSbuSequence(const int *array, int cntLength)
    

    的流程图为
    avator

    根据流程图,我们可以看出,若想满足判定/条件覆盖,则需满足下列条件

    • 数组为空 或 长度≤0 ?
      • 数组为空,长度 ≤ 0,T1判定为True
      • 数组为空,长度 > 0, T1判定为True
      • 数组不为空,长度 ≤ 0, T1判定为True
      • 数组不为空,长度 > 0, T1判定为False
    • tempSum > maxSum ?
      • tempSum > maxSum,T2判定为True
      • tempSum < maxSum,T2判定为Flase
    • cntJ < cntLength ?
      • cntJ < cntLength,T3判定为True
      • cntJ > cntLength,T3判定为Flase
    • cntI < cntLength ?
      • cntI < cntLength,T4判定为True
      • cntI > cntLength,T4判定为Flase

    判定3和判定4为循环控制过程中的判断,每次执行程序均会经历T = true和T = fasle,因此无需对这两个判定设计测试样例。

    根据以上条件我们可以得出如下的测试样例:

    序号 T1 T2 路径 样例 期望值
    数组为空 长度≤0 tempSum>maxSum 数组 长度
    1 T T T1T,则路径不经过T2 STARTBEND { } 0 0
    2 F F F START→A→CD……→END { -5,-6,-1,-3 } 4 0
    3 F F T START→AD……END {  3,7,2,27,3 } 5 42
    4 F F 在循环过程中经历了TF两种判定 START→ACD……ADEND { -2,11,-4,13,-5,-2 } 6 20

    4. 测试和结果

    设计测试程序的代码

    #include "stdafx.h"
    #include "CppUnitTest.h"
    #include "..Max SubSequence Sumsumlib.h"
    
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    
    namespace UnitTest1
    {		
    	TEST_CLASS(UnitTest1)
    	{
    	public:
    		
    		TEST_METHOD(TestMethod1)
    		{
    			const int *aArray = {};
    			int iLength = sizeof(aArray) / sizeof(aArray[0]);
    			Assert::AreEqual(MaxSubSequenceSum(aArray, iLength), 0);
    		}
    
    		TEST_METHOD(TestMethod2)
    		{
    			const int aArray[] = { -5,-6,-1,-3 };
    			int iLength = sizeof(aArray) / sizeof(aArray[0]);
    			Assert::AreEqual(MaxSubSequenceSum(aArray, iLength), 0);
    		}
    
    		TEST_METHOD(TestMethod3)
    		{
    			const int aArray[] = { 3,7,2,27,3 };
    			int iLength = sizeof(aArray) / sizeof(aArray[0]);
    			Assert::AreEqual(MaxSubSequenceSum(aArray, iLength), 42);
    		}
    
    		TEST_METHOD(TestMethod4)
    		{
    			const int aArray[] = { -2,11,-4,13,-5,-2 };
    			int iLength = sizeof(aArray) / sizeof(aArray[0]);
    			Assert::AreEqual(MaxSubSequenceSum(aArray, iLength), 20);
    		}
    
    	};
    }
    

    测试结果如图所示
    avator

  • 相关阅读:
    Vi/Vim查找替换使用方法【转】
    ios开发--NSDate与NSDateFormatter的相关用法【转】
    IOS开发基础之—MD5加密算法【转】
    struts2多图片上传实例【转】
    IOS开发之----常用的基本GDB命令【转】
    WWDC笔记:2011 Session 125 UITableView Changes, Tips and Tricks
    Xcode8 NSLog打印json不完整的解决方案
    Swift 3.1 的一些新特性
    iOS中书写代码规范35条小建议
    女程序员做了个梦,众网友的神回复
  • 原文地址:https://www.cnblogs.com/martinzhang98/p/10722194.html
Copyright © 2011-2022 走看看