软件工程——第三次作业

本项目发布在在腾讯云代码托管平台(即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

原文地址:https://www.cnblogs.com/martinzhang98/p/10722194.html