[toc]ios
本项目发布在在腾讯云代码托管平台(即Coding.net)git
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.cppthis
// 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.hspa
#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; }
程序运行的结果如图所示 .net
#3. 选择覆盖标准并设计测试样例 咱们选择断定/条件覆盖来设计测试样例设计
所设计的程序中求最大子段和的函数code
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,所以无需对这两个断定设计测试样例。
根据以上条件咱们能够得出以下的测试样例:
<table border=0 cellpadding=0 cellspacing=0 width=959 style='border-collapse: collapse;table-layout:fixed;width:719pt'> <col class=xl66 width=64 span=3 style='width:48pt'> <col class=xl66 width=244 style='mso-width-source:userset;mso-width-alt:8675; width:183pt'> <col class=xl66 width=267 style='mso-width-source:userset;mso-width-alt:9500; width:200pt'> <col class=xl66 width=128 style='mso-width-source:userset;mso-width-alt:4551; width:96pt'> <col class=xl66 width=64 span=2 style='width:48pt'> <tr height=19 style='height:14.4pt'> <td rowspan=2 height=38 class=xl67 width=64 style='height:28.8pt;width:48pt'><font class="font9">序号</font></td> <td colspan=2 class=xl67 width=128 style='border-left:none;width:96pt'>T1</td> <td class=xl67 width=244 style='border-left:none;width:183pt'>T2</td> <td rowspan=2 class=xl67 width=267 style='width:200pt'><font class="font9">路径</font></td> <td colspan=2 class=xl67 width=192 style='border-left:none;width:144pt'><font class="font9">样例</font></td> <td rowspan=2 class=xl67 width=64 style='width:48pt'><font class="font9">指望值</font></td> </tr> <tr height=19 style='height:14.4pt'> <td height=19 class=xl67 style='height:14.4pt;border-top:none;border-left: none'><font class="font9">数组为空</font></td> <td class=xl67 style='border-top:none;border-left:none'><font class="font9">长度≤</font><font class="font8">0</font></td> <td class=xl67 style='border-top:none;border-left:none'>tempSum>maxSum</td> <td class=xl67 style='border-top:none;border-left:none'><font class="font9">数组</font></td> <td class=xl67 style='border-top:none;border-left:none'><font class="font9">长度</font></td> </tr> <tr height=19 style='height:14.4pt'> <td height=19 class=xl65 style='height:14.4pt;border-top:none'>1</td> <td class=xl65 style='border-top:none;border-left:none'>T</td> <td class=xl65 style='border-top:none;border-left:none'>T</td> <td class=xl65 style='border-top:none;border-left:none'>T1<font class="font6">为</font><font class="font7">T</font><font class="font6">,则路径不通过</font><font class="font7">T2</font></td> <td class=xl65 style='border-top:none;border-left:none'>START<font class="font6">→</font><font class="font7">B</font><font class="font6">→</font><font class="font7">END</font></td> <td class=xl65 style='border-top:none;border-left:none'>{ }</td> <td class=xl65 style='border-top:none;border-left:none'>0</td> <td class=xl65 style='border-top:none;border-left:none'>0</td> </tr> <tr height=18 style='height:13.8pt'> <td height=18 class=xl65 style='height:13.8pt;border-top:none'>2</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>START→A→C<font class="font10">→</font><font class="font7">D</font><font class="font10">→</font><font class="font7">……→END</font></td> <td class=xl65 style='border-top:none;border-left:none'>{ -5,-6,-1,-3 }</td> <td class=xl65 style='border-top:none;border-left:none'>4</td> <td class=xl65 style='border-top:none;border-left:none'>0</td> </tr> <tr height=18 style='height:13.8pt'> <td height=18 class=xl65 style='height:13.8pt;border-top:none'>3</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>T</td> <td class=xl65 style='border-top:none;border-left:none'>START→A<font class="font10">→</font><font class="font7">D</font><font class="font10">→</font><font class="font7">……</font><font class="font10">→</font><font class="font7">END</font></td> <td class=xl65 style='border-top:none;border-left:none'>{<span style='mso-spacerun:yes'> </span>3,7,2,27,3 }</td> <td class=xl65 style='border-top:none;border-left:none'>5</td> <td class=xl65 style='border-top:none;border-left:none'>42</td> </tr> <tr height=19 style='height:14.4pt'> <td height=19 class=xl65 style='height:14.4pt;border-top:none'>4</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'>F</td> <td class=xl65 style='border-top:none;border-left:none'><font class="font6">在循环过程当中经历了</font><font class="font7">T</font><font class="font6">和</font><font class="font7">F</font><font class="font6">两种断定</font></td> <td class=xl65 style='border-top:none;border-left:none'>START→A<font class="font10">→</font><font class="font7">C</font><font class="font10">→</font><font class="font7">D</font><font class="font10">→</font><font class="font7">……</font><font class="font10">→</font><font class="font7">A</font><font class="font10">→</font><font class="font7">D</font><font class="font10">→</font><font class="font7">END</font></td> <td class=xl65 style='border-top:none;border-left:none'>{ -2,11,-4,13,-5,-2 }</td> <td class=xl65 style='border-top:none;border-left:none'>6</td> <td class=xl65 style='border-top:none;border-left:none'>20</td> </tr> <![if supportMisalignedColumns]> <tr height=0 style='display:none'> <td width=64 style='width:48pt'></td> <td width=64 style='width:48pt'></td> <td width=64 style='width:48pt'></td> <td width=244 style='width:183pt'></td> <td width=267 style='width:200pt'></td> <td width=128 style='width:96pt'></td> <td width=64 style='width:48pt'></td> <td width=64 style='width:48pt'></td> </tr> <![endif]> </table>
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); } }; }
测试结果如图所示