软件工程——第三次作业
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;
}
程序运行的结果如图所示
3. 选择覆盖标准并设计测试样例
我们选择判定/条件覆盖来设计测试样例
所设计的程序中求最大子段和的函数
int MaxSbuSequence(const int *array, int cntLength)
的流程图为
根据流程图,我们可以看出,若想满足判定/条件覆盖,则需满足下列条件
- 数组为空 或 长度≤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 | T1为T,则路径不经过T2 | START→B→END | { } | 0 | 0 |
2 | F | F | F | START→A→C→D→……→END | { -5,-6,-1,-3 } | 4 | 0 |
3 | F | F | T | START→A→D→……→END | { 3,7,2,27,3 } | 5 | 42 |
4 | F | F | 在循环过程中经历了T和F两种判定 | START→A→C→D→……→A→D→END | { -2,11,-4,13,-5,-2 } | 6 | 20 |
4. 测试和结果
设计测试程序的代码
#include "stdafx.h"
#include "CppUnitTest.h"
#include "..\Max SubSequence Sum\sumlib.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);
}
};
}
测试结果如图所示